使用awk解析可变长度

使用awk解析可变长度,awk,Awk,我不能完全理解这一点。我需要分析第9行上或之后的一行或多行,不包括“或, 因此,如果输出为: { "hash" : "000000000fe549a89848c76070d4132872cfb6efe5315d01d7ef77e4900f2d39", "confirmations" : 88029, "size" : 189, "height" : 227252, "version" : 2, "merkleroot" : "c738fb8e227

我不能完全理解这一点。我需要分析第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"
    }
{
    "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"
}
我想要
C738FB8E22750B6D3511ED0049A96558B0BC57046F3F7771EC825B22D6A6F4A

或者如果输出为:

{
    "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"
    }
{
    "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"
}
我想要
C738FB8E22750B6D3511ED0049A96558B0BC57046F3F7771EC825B22D6A6F4A
C738FB8E22750B6D3511ED0049A96558B0BC57046F3F7771EC825B22D6A6F4A
C738FB8E22750B6D3511ED0049A96558B0BC57046F3F7771EC825B22D6A6F4A

数字将始终至少出现在第9行,但可能远远超出第9行

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


我更喜欢实际awk的答案。别傻了。没有Perl。

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

jq -r .tx[] input.json

这个问题对你来说很复杂,因为你使用了错误的工具
awk
无法解析json,请使用
jq
进行解析:

jq -r .tx[] input.json
以上仅是以下各项的实施:

 awk '/end/{f=0} f{print} /start/{f=1}'
常见的awk习语

以上仅是以下各项的实施:

 awk '/end/{f=0} f{print} /start/{f=1}'

常见的awk习惯用法。

另一种基于输入格式的
awk

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

        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
对于另一个输入

$ awk ... json2

        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a

另一个基于输入格式的
awk

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

        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
对于另一个输入

$ awk ... json2

        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a
        c738fb8e22750b6d3511ed0049a96558b0bc57046f3f77771ec825b22d6a6f4a


你已经试过什么了?@Dietermemken除了大量的搜索外,什么都没有
我不能完全理解这一点。
你说的是“第9行”,但看起来你实际上只是想要
tx
字段的值。“是吗?”埃德默顿说得对。你已经试过什么了?“迪特尔梅肯除了大量的搜索外什么都没有
我不能完全理解这一点。
你说的是“第9行”,但看起来你实际上只是想要
tx
字段的值。是吗?@EdMorton说得对。这会返回什么?它会输出你想要的东西。
.tx
的成员们,我可以像awk一样把东西导入jq吗
a.sh | jq-r.tx[]
?是的,为什么不尝试它呢?它返回的确切含义是什么?它确实输出您想要的内容。
.tx
的成员们,我可以像awk一样把东西导入jq吗
a.sh | jq-r.tx[]
?是的,为什么不试试呢?如果可以的话,我会+1。反直觉(对我来说)。如果你有任何问题,请随时提问。我相信如果右方括号(闭合数组)与数据在同一行上,这将失败。这将是有效的JSON,但会导致
inTx
在数组有效关闭后保持在
1
。是的,如果输入与OP发布的内容不同,则需要不同的脚本来解析它。我假设OP有一个严格的格式,这就是为什么他在寻找awk而不是jq或类似的解决方案。请注意,OP在他的问题或任何评论中都没有提到JSON——他只是显示了一块需要解析的文本。如果可以的话,将+1。反直觉(对我来说)。如果你有任何问题,请随时提问。我相信如果右方括号(闭合数组)与数据在同一行上,这将失败。这将是有效的JSON,但会导致
inTx
在数组有效关闭后保持在
1
。是的,如果输入与OP发布的内容不同,则需要不同的脚本来解析它。我假设OP有一个严格的格式,这就是为什么他在寻找awk而不是jq或类似的解决方案。请注意,OP在他的问题或任何评论中都没有提到JSON——他只是展示了一块需要解析的文本。