如何从特定文本的某一行开始 grep 总是发生变化的文本?

如何从特定文本的某一行开始 grep 总是发生变化的文本?
contentJSON is :-
{"id":"0","name":"inc_timestamp","workspaceId":"37158928","infoJSON":"{a:{\"a\":\"bcd\",\"b\":{\"c\":\"d\"}}}","contentJSON":"{\n  \"tasks\": [\n    {\n      \"name\": \"Input\",\n      \"taskType\": \"executeCustomSQLQueryForIncrementalLoad\",\n      \"id\": 10,\n      \"x\": 95,\n      \"y\": 44,\n      \"inputConnectors\": [],\n      \"outputConnectors\": [\n        {\n          \"nodeID\": 11,\n          \"type\": \"Output\",\n          \"name\": \"\"\n        }\n      ],\n      \"argsMap\": {\n        \"taskId\": 10,\n        \"datasetId\": 49053696,\n        \"deltaColumnName\": \"timestamp\",\n        \"deltaColumnDataType\": \"timestamp\",\n        \"deltaColumnValue\": \"null\",\n        \"primaryKeysList\": [\n          \"id\"\n        ]\n      },\n      \"datasetId\": 49053696\n    },\n    {\n      \"name\": \"Output\",\n      \"taskType\": \"saveToES\",\n      \"id\": 11,\n      \"x\": 453,\n      \"y\": 44,\n      \"inputConnectors\": [\n        {\n          \"nodeID\": 10,\n          \"type\": \"Input\",\n          \"name\": \"\"\n        }\n      ],\n      \"outputConnectors\": [],\n      \"argsMap\": {\n        \"bizvizcubeId\": 46759937,\n        \"cfg\": {\n          \"es.mapping.id\": \"id\"\n        }\n      }\n    }\n  ],\n  \"connections\": [\n    {\n      \"source\": {\n        \"taskId\": 10,\n        \"connectorIndex\": 0\n      },\n      \"dest\": {\n        \"taskId\": 11,\n        \"connectorIndex\": 0\n      }\n    }\n  ],\n  \"isIncrementalLoadModeWorkflow\": 1\n}\n"}
Status:200
{"wokspaceResp":{"success":true,"workspaces":[],"params":"{\"id\":\"49086475\"}"}}
{"wokspaceResp":{"success":true,"workspaces":[],"params":"{\"id\":\"49086475\"}"}}
{"success":true,"workspaces":[],"params":"{\"id\":\"49086475\"}"}
{"id":"49086475"}
wfid is : 49086475
finally wfid is : 49086475
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.136s
[INFO] Finished at: Tue Oct 24 15:30:48 IST 2017
[INFO] Final Memory: 33M/392M
[INFO] ------------------------------------------------------------------------

我需要 grep,49086475每次执行程序时它都会发生变化。

请指导我捕捉之后的文本finally wfid is :

答案1

使用 awk:

awk '/finally wfid is :/{print $NF}'

...打印包含的行的最后一个字段finally wfid is :

答案2

使用grep方法如下:

grep -oP 'finally wfid is : \K.*' <filename>
  • 来自的解释来源答案

    grep并且-P因为拥有PCRE(将该模式解释为erl-C兼容R常规xpression)和-o单独打印匹配的模式。\K通知将忽略其之前的匹配部分。


或者你可以sed这样使用:

sed -n 's/finally wfid is : //p' <filename>
  • 此命令将仅打印包含字符串的行finally wfid is :,但它将被替换为空字符串。

答案3

尽管已经发布了所有好的解决方案,但我还是要添加一个仅使用 的解决方案。由于我无法记住和命令,grep我经常以这种方式做事。sedawk

grep 'finally wfid is' input_file | grep -o '[0-9]*'

第一个 grep 将获取正确的行。第二个 grep 使用参数-o获取o仅匹配行的一部分,这里是任何数字。

答案4

我觉得到目前为止发布的所有答案都没有抓住问题的重点。或者,也许我抓住了。我理解这个问题的意思是

我需要找到之后出现的文本(八位数字)finally wfid is : ,然后grep找到该文本的文件。

发布的答案很好地完成了第一部分,但没有完成工作。恕我直言,muru 的回答是最好的;我将以此为基础:

grep "$(awk '/finally wfid is :/{print $NF}' contentJSON)" contentJSON

捕获来自哪里的 输出$(command)command(在本例中为awk)并在外部命令中使用它(在本例中为grep)。我从问题中假设文件名是contentJSON

相关内容