【问题标题】:To read specific path string from generation of curl result(SED/AWK/Grep)从 curl 结果的生成中读取特定的路径字符串(SED/AWK/Grep)
【发布时间】:2021-09-06 16:21:12
【问题描述】:

我正在尝试从我使用 curl 命令提取结果的位置读取特定路径(/opt/links/stances/2)。

卷曲命令:-

curl -s http://localhost:8080/stances/1/Dirs 

上述命令的结果:-

{"LocalWorkingDir":"/opt/links/stances/1","Workers":[{"WorkerInstanceID":2,"WorkerHostname":"yolo.automation.local","WorkerInstanceRunDir":"/opt/links/stances/2"}]}

我正在尝试从生成的输出中读取 /opt/links/stances/2 的命令:-

curl -s http://localhost:8080/stances/1/Dirs |  sed 's|$1|" "|' | awk '{print $1}'

我最终没有结果。 请帮助我使用命令读取路径(/opt/links/stances/2)。提前致谢。

【问题讨论】:

  • 你为什么不用jq?
  • @oguzismail 不知道怎么用!!
  • 这很简单。像jq -r '.Workers[0].WorkerInstanceRunDir' 这样的东西应该做你想做的事。
  • @oguzismail 系统配置了自定义存储库。我不能使用 jq,因为它的包在 repo 中不可用!
  • 那很糟糕。那么祝你好运

标签: curl awk sed grep


【解决方案1】:

如果您有gnu grep,那么您可以使用这样的 PCRE 正则表达式:

curl -s http://localhost:8080/stances/1/Dirs | 
grep -oP '"WorkerInstanceRunDir":"\K[^"]+'

/opt/links/stances/2

详情:

  • "WorkerInstanceRunDir":":匹配文字文本"WorkerInstanceRunDir":"
  • \K: 重置匹配信息
  • [^"]+:匹配 1+ 个非" 字符

如果您没有安装gnu grep,请使用此sed

curl -s http://localhost:8080/stances/1/Dirs |
sed -E 's/.*"WorkerInstanceRunDir":"([^"]+).*/\1/'

【讨论】:

    【解决方案2】:

    由于 OP 无法安装 jq,因此可以使用显示的示例尝试以下操作。但这不可能是完整的,这完全是根据示例显示的。

    awk 'match($0,/"WorkerInstanceRunDir":"[^"]*"}/){print substr($0,RSTART+24,RLENGTH-26)}' Input_file
    

    解释: 使用match 函数匹配正则表达式"WorkerInstanceRunDir":"[^"]*"},这将匹配从“WorkerInstanceRunDir 到下一次出现" 后跟} 的所有内容然后打印从RSTART+24RLENGTH-26 的值的子字符串。

    或尝试仅根据所示示例设置字段分隔符。

    awk -F'"|}' '$(NF-5)=="WorkerInstanceRunDir"{print $(NF-3)}' Input_file
    

    【讨论】:

    • 通过在match 正则表达式的末尾使用},不是假设WorkerInstanceRunDir 是JSON 输出中的最后一个字段吗?
    • @anubhava,谢谢先生,我现在已经更改了代码以检查 WorkerInstanceRunDir。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2013-03-01
    • 2017-01-16
    • 1970-01-01
    • 2021-09-19
    • 2015-06-07
    • 2020-12-04
    • 2019-10-20
    相关资源
    最近更新 更多