【问题标题】:Parse string with bash and extract number用 bash 解析字符串并提取数字
【发布时间】:2011-03-03 23:53:42
【问题描述】:

我有主管的状态输出,看起来像这样。

frontend                         RUNNING    pid 16652, uptime 2:11:17
nginx                            RUNNING    pid 16651, uptime 2:11:17
redis                            RUNNING    pid 16607, uptime 2:11:32

我需要提取 nginx 的 PID。我已经通过 grep -P 命令完成了它,但是在远程机器上 grep 是在没有 perl 正则表达式支持的情况下构建的。

看起来 sed 或 awk 正是我需要的,但我不熟悉它们。

请帮助我找到一种方法来做到这一点,在此先感谢。

【问题讨论】:

    标签: regex bash unix parsing


    【解决方案1】:
    sed 's/.*pid \([0-9]*\).*/\1/'
    

    【讨论】:

    【解决方案2】:

    单独使用 AWK:

    awk -F'[ ,]+' '{print $4}' inputfile
    

    【讨论】:

    • 非常适合使用管道:$ status |grep nginx |awk -F'[ ,]+' '{print $4}' -
    • @Keith:没有必要将grep 传送到awk。 AWK 可以自己做这一切:status | awk -F'[ ,]+' '/nginx/ {print $4}'
    【解决方案3】:

    使用 awk 和 cut 的解决方案

    vinko@parrot:~$ cat test
    frontend                         RUNNING    pid 16652, uptime 2:11:17
    nginx                            RUNNING    pid 16651, uptime 2:11:17
    redis                            RUNNING    pid 16607, uptime 2:11:32
    vinko@parrot:~$ awk '{print $4}' test | cut -d, -f 1
    16652
    16651
    16607
    

    仅适用于 nginx:

    vinko@parrot:~$ grep nginx test | awk '{print $4}' | cut -d, -f 1
    16651
    

    【讨论】:

    • 没有必要使用 awk + ​​cut + grep。只需 awk 就可以完成这项工作。 awk -F"," '/nginx/{print $1}' file
    • @ghostdog74:您的命令输出“nginx RUNNING pid 16651”。正确的 awk 唯一解决方案是 Dennis (stackoverflow.com/questions/3045493/…) 的答案,使用 -F '[ ,]+' 而不是 -F ','
    • @vinko,或者只是使用 gsub() 来摆脱不支持多个字段分隔符的 awk 版本的逗号。我只是强调一点,awk 可以完成这项工作,无需使用其他工具。
    • @ghostdog74:对,你只能用 awk 来做。
    【解决方案4】:
    $ cat $your_output | sed -s 's/.*pid \([0-9]\+\),.*/\1/'
    16652
    16651
    16607
    

    【讨论】:

    • 这被称为 UUOC(无用的 cat)
    • @mikerobi :这只是一个如何将内容输入命令的示例......他没有说他是如何得到他的输出的......但无论如何。
    【解决方案5】:

    看看pgrep,一个专门为grep进程表定制的grep变体。

    【讨论】:

      【解决方案6】:

      假设 grep 实现支持 -o 选项,您可以使用两个 grep:

      output \
        | grep -o '^nginx[[:space:]]\+[[:upper:]]\+[[:space:]]\+pid [0-9]\+' \
        | grep -o '[0-9]\+$'
      

      【讨论】:

        猜你喜欢
        • 2010-10-18
        • 2020-10-04
        • 2017-07-16
        • 2013-10-24
        • 2021-12-11
        • 2022-10-19
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多