使用bash和提取数字解析字符串

时间:2010-06-15 13:20:28

标签: regex bash unix parsing

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

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正是我需要的,但我不熟悉它们。

请提前帮助我找一个怎么做的方法。

6 个答案:

答案 0 :(得分:14)

sed 's/.*pid \([0-9]*\).*/\1/'

答案 1 :(得分:6)

单独使用AWK:

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

答案 2 :(得分:5)

使用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

答案 3 :(得分:2)

$ cat $your_output | sed -s 's/.*pid \([0-9]\+\),.*/\1/'
16652
16651
16607

答案 4 :(得分:2)

看一下pgrep,这是一个专为grepping过程表而量身定制的grep变体。

答案 5 :(得分:1)

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

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