2013-10-22 14 views
5

Khi tôi chạy một lệnh tôi nhận được một câu trả lời như thế nàyParsing Json dữ liệu theo cột trong vỏ

{ 

    "status": "available", 
    "managed": true, 
    "name":vdisk7, 
    "support":{ 
    "status": "supported" 
    }, 
    "storage_pool": "pfm9253_pfm9254_new", 
    "id": "ff10abad"-2bf-4ef3-9038-9ae7f18ea77c", 
    "size":100 
}, 

và hàng trăm loại danh sách hoặc từ điển Tôi muốn có một lệnh mà không loại như vậy của một điều

if name = "something", 
    get the id 

Bất kỳ liên kết mà có thể giúp tôi trong việc học loại như các lệnh sẽ được đánh giá cao

tôi đã thử

awk '{if ($ 2 == "something") in $ 0;}'

Nhưng tôi nghĩ phản hồi là ở Json do đó định dạng thông minh không hoạt động.

Cũng chỉ là một lệnh duy nhất mà tôi cần chạy vì vậy tôi không muốn sử dụng bất kỳ thư viện bên ngoài nào.

+0

Các bạn đã nhìn [JQ ] (http://stedolan.github.io/jq/)? Nó có một cú pháp thuận tiện để lọc. – SheetJS

+0

Xem thêm [Trình phân tích cú pháp JSON dòng lệnh của Unix] (http://stackoverflow.com/questions/3858671/unix-command-line-json-parser) – koppor

+0

Để phân tích cú pháp JSON dựa trên AWK, hãy xem [JSON.awk] (https: //github.com/step-/JSON.awk) – koppor

Trả lời

12

JSON phân tích cú pháp là tốt hơn cho nhiệm vụ này

awksed là tiện ích để phân tích văn bản dòng theo định hướng, nhưng không json. Nếu định dạng json của bạn sẽ thay đổi thì sao? (một số dòng sẽ đi trên một dòng?).

Bạn nên sử dụng bất kỳ trình phân tích cú pháp json chuẩn nào ở đó. Hoặc sử dụng một số ngôn ngữ kịch bản mạnh mẽ, chẳng hạn như PHP, Python, Ruby, v.v.

Tôi có thể cung cấp cho bạn ví dụ về cách thực hiện bằng python.

Điều gì xảy ra nếu tôi không thể sử dụng ngôn ngữ kịch bản mạnh mẽ?

Nếu bạn hoàn toàn không thể sử dụng python, sau đó là tiện ích jq ngoài kia: link

Nếu bạn có một số distro gần đây, jq có lẽ đã có trong kho (ví dụ: Ubuntu 13.10 có nó trong Repos).

Tôi có thể sử dụng python!

Tôi sẽ làm điều đó bằng cách sử dụng tập lệnh nội tuyến python đơn giản.

Ví dụ: chúng tôi có một số some_command trả về kết quả là json.

Chúng tôi phải nhận giá trị data["name"].

Ở đây chúng ta đi:

some_command | python -c "import json, sys; print json.load(sys.stdin)['name']" 

Nó sẽ ra vdisk7 trong trường hợp của bạn

Để làm việc này bạn cần phải chắc chắn, json là hoàn toàn hợp lệ.

Nếu bạn có một danh sách các đối tượng json:

[ 
    { 
    ... 
    "name": "vdisk17" 
    ... 
    }, 
    { 
    ... 
    "name": "vdisk18" 
    ... 
    }, 
    { 
    ... 
    "name": "vdisk19" 
    ... 
    }, 
... 
] 

Bạn có thể sử dụng một số comprehensions danh sách:

some_command | python -c "import json, sys; [sys.stdout.write(x['name'] + '\n') for x in json.load(sys.stdin)]" 

Nó sẽ ra:

vdisk17 
vdisk18 
vdisk19 
+0

Điều đó có hiệu quả. Nhưng tôi không được phép sử dụng Python, lệnh bash đơn giản như awk, grep, sed, head, tail, bạn có được ý tưởng. –

+0

Điều gì giới hạn bạn sử dụng python? Python nằm trong LSB (cơ sở tiêu chuẩn Linux). Vì vậy, nó sẽ có sẵn trên mọi bản phân phối Linux. – Waterlink

+0

@Waterlink Điều đó có hiệu quả trong AIX không? Tôi không thể thử nghiệm trên AIX ngay bây giờ nhưng tôi có thể cần thực hiện điều đó trong một vài ngày. –

Các vấn đề liên quan