使用awk解析可变长度

时间:2016-05-02 14:59:52

标签: awk

我无法完全围绕这一个。我需要在第9行或第9行之后解析一行或多行,不包括"",

所以如果输出是:

{
    "hash" : "000000000fe549a89848c76070d4132872cfb6efe5315d01d7ef77e4900f2d39",
    "confirmations" : 88029,
    "size" : 189,
    "height" : 227252,
    "version" : 2,
    "merkleroot" : "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a",
    "tx" : [
        "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a"
],
    "time" : 1398824312,
    "nonce" : 1883462912,
    "bits" : "1d00ffff",
    "difficulty" : 1.00000000,
    "chainwork" : "000000000000000000000000000000000000000000000000083ada4a4009841a",
    "previousblockhash" : "00000000c7f4990e6ebf71ad7e21a47131dfeb22c759505b3998d7a814c011df",
    "nextblockhash" : "00000000afe1928529ac766f1237657819a11cfcc8ca6d67f119e868ed5b6188"
    }

我想要c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a

或者输出是:

{
    "hash" : "000000000fe549a89848c76070d4132872cfb6efe5315d01d7ef77e4900f2d39",
    "confirmations" : 88029,
    "size" : 189,
    "height" : 227252,
    "version" : 2,
    "merkleroot" : "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a",
    "tx" : [
        "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a",
        "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a",
        "c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a"
    ],
    "time" : 1398824312,
    "nonce" : 1883462912,
    "bits" : "1d00ffff",
    "difficulty" : 1.00000000,
    "chainwork" : "000000000000000000000000000000000000000000000000083ada4a4009841a",
    "previousblockhash" : "00000000c7f4990e6ebf71ad7e21a47131dfeb22c759505b3998d7a814c011df",
    "nextblockhash" : "00000000afe1928529ac766f1237657819a11cfcc8ca6d67f119e868ed5b6188"
}

我想要c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a

这些数字总是至少出现在第9行,但可能远远超出它。

请注意,为清晰起见,我使用了哈希c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a。哈希每次都是唯一的(但总是相同的长度)。

我更喜欢用实际awk的答案。没有傻瓜。没有Perl。

3 个答案:

答案 0 :(得分:2)

$ cat tst.awk
/^[[:space:]]*\]/ { inTx=0 }
inTx { gsub(/^[^"]*"|"[^"]*$/,""); print }
/^[[:space:]]*"tx"[[:space:]]*:[[:space:]]*\[/ { inTx=1 }

$ awk -f tst.awk file
c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a

以上只是:

的实现
 awk '/end/{f=0} f{print} /start/{f=1}'
常见的awk成语。

答案 1 :(得分:1)

问题对您来说很复杂,因为您使用了错误的工具。 awk无法解析json,请使用jq

jq -r .tx[] input.json

答案 2 :(得分:0)

基于输入格式的另一个awk

$ awk -F' +: +' 'NF!=1{p=0} p&&!/]/{gsub(/"|,/,""); print} $1~/"tx"/{p=1}' json

        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a

和其他输入

$ awk ... json2

        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a