无法使用正则表达式解析bash输出并收集其中的一部分

时间:2016-10-14 14:42:52

标签: regex linux bash sed

我试图从这个命令的输出中解析出最近的负载 -

[sandeepan@ip-10-169-92-150 ~]$ w
 14:22:21 up 17 days, 51 min,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
sandeepa pts/0    115.112.95.170   06:38   43:57   0.51s  0.51s -bash
sandeepa pts/1    115.112.95.170   13:17    4.00s  0.03s  0.00s w

负载平均值后的第一个: -

                |
               \|/
load average: 0.00, 0.01, 0.05

我正在使用它,这有效 -

w | awk '{print $10}' | tr -d ,

然而,我意识到我正在寻找的价值可能并不总是第10个变量。因此,我试图在这里使用正则表达式,但不幸的是,无法使用它与我知道的几个bash命令/实用程序中的任何一个。

我有这个正则表达式,我可以使用它来匹配所需的值 -

/.*load average:\s([0-9]+\.[0-9]+),.*/m

我试着查看了sed手册,查看了其他一些问题,比如Using sed to remove unwanted characters from output,但是对我的工作起了不了解。

1 个答案:

答案 0 :(得分:1)

当您知道之前和之后的文本时,最好使用这样做的后视:检查给定位置的文本,无论该行的其余部分是什么。

鉴于您的示例文件,我将其存储在一个文件中并执行此操作:

$ grep -Po '(?<=load average: )[^,]*' file
0.00

这是说:嘿,在load average:之后获取所有文本,直到找到逗号。

所以,如果您有这样的文件:

$ cat file
14:22:21 up 17 days, 51 min,  2 users,  load average: 0.00, 0.01, 0.05
hello how are you,  load average: 1.23, 0.01, 0.05

它将返回如下:

$ grep -Po '(?<=load average: )[^,]*' file
0.00
1.23

请注意,man w可以为您提供有关如何通过某些选项获取此信息的良好提示,以及man top