簡體   English   中英

在bash中使用awk / sed解析json以獲取鍵值對

[英]Parsing json with awk/sed in bash to get key value pair

我已經在SO上閱讀了許多現有的問題,但是沒有一個問題可以回答我所尋找的問題。 我知道很難使用sed / awk在bash中解析json,但是在每條記錄的鍵值對的整個列表中,每條記錄只需要幾個鍵值對。 我想這樣做,是因為它更快,因為主要的JSON擁有數百萬條記錄,因此相當大。

JSON格式如下:

{
    "documents":
    [
        {
            "title":"a",   //needed
            "description":"b",  //needed
            "id":"c",  //needed
            ....(some more:not useful)....
            "conversation":
            [
                {
                    "message":"",
                    "id":"d",   //not needed
                    .....(some more)....
                    "createDate":"e",   //not needed
                },
                ...(some more messages)....
            ],
            "createDate":"f",  //needed
            ....(many more labels).....
        }
    ],
    ....(some more global attributes)....
}

現在,為此,我需要標記為需要的屬性,但是它們的通用密鑰使通過簡單的sed / awk獲取成為一個問題。 誰能建議我們可以用sed / awk做到這一點。 如果可能的話,任何幫助實現這一目標的方法將不勝感激。

PS:我了解jsawk但我不想引入任何依賴關系,因此,如果可能,請建議使用sed / awk。

編輯:下面給出的格式的多個擴展(如文檔中我們有一個列表)

"title":"a",
"description":"b"
"id":"c"
"createDate":"f"

編輯:JSON沒有任何空格。 它已被格式化以提高可讀性。

我建議您使用“ jq”或真正的JSON解析器。 您不能使用任意正則表達式來“解析” JSON。 您可以使用awk破解某些內容,但是如果您輸入的內容出乎意料,那將很容易中斷。

因此,答案是,引入一個廉價的依賴項(jq或類似工具),並圍繞該腳本編寫腳本。 除非您在路由器或嵌入式計算機上運行此腳本,否則很容易安裝jq。

如果關鍵字符[{{}]始終在每一行中隔離,則將起作用:

#!/usr/bin/awk -f

function walk(level, end) {
    while (getline > 0) {
        if (level && $NF ~ end) {
            return
        } 
        if ($NF == "{") {
            walk(level + 1, "},?")
        } else if ($NF == "[") {
            walk(level + 1, "],?")
        } else if (level == 3 && match($0, /"(title|description|id|createDate)":"[^"]*"/)) {
            print substr($0, RSTART, RLENGTH)
        }
    }
}

BEGIN {
    walk(0)
    exit
}

輸入:

{
"documents":
[
{
"title":"a",   //needed
"description":"b",  //needed
"id":"c",  //needed
....(some more:not useful)....
"conversation":
[
{
"message":"",
"id":"d",   //not needed
.....(some more)....
"createDate":"e",   //not needed
},
...(some more messages)....
],
"createDate":"f",  //needed
....(many more labels).....
}
],
....(some more global attributes)....
}

輸出:

"title":"a"
"description":"b"
"id":"c"
"createDate":"f"

好吧,如果您要使用正則表達式來解析JSON,而JSON本質上會快速,骯臟並且嚴重依賴於輸入文件的確切語法,則您可以編寫一些內容,該內容取決於在輸入文件之前出現的空白量您感興趣的鍵值對。根據您要尋找的輸出類型,可以使用以下方法:

awk '/^ {12}"title/
/^ {12}"description/
/^ {12}"id/
/^ {12}"createDate/' input_file.json

不太好,但是可以解決您的示例輸入問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM