使用bash shell脚本和awk进行子串提取

时间:2010-04-03 23:17:42

标签: bash shell awk

所以,我有一个名为'dummy'的文件,其中包含字符串:

"There is 100% packet loss at node 1".

我还有一个小脚本,我想用来从这个文件中获取百分比。脚本如下。

result=`grep 'packet loss' dummy` |
awk '{  first=match($0,"[0-9]+%")
        last=match($0," packet loss")
        s=substr($0,first,last-first)
        print s}'

echo $result

在这种情况下,我希望$ result的值基本上是100%。但由于某种原因,它只打印出一个空白字符串。任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:4)

您需要在awk命令结束后设置结束反引号,但最好使用$()代替:

result=$( grep 'packet loss' dummy |
awk '{  first=match($0,"[0-9]+%")
    last=match($0," packet loss")
    s=substr($0,first,last-first)
    print s}' )

echo $result

但你可以这样做:

result=$( grep 'packet loss' | grep -o "[0-9]\+%" )

答案 1 :(得分:3)

尝试

awk '{print $3}'

代替。

答案 2 :(得分:2)

当你不知道百分比数字在哪里时,可以使用下面的解决方案(并且不需要使用带有greps的awk)

$ results=$(awk '/packet loss/{for(i=1;i<=NF;i++)if($i~/[0-9]+%$/)print $i}' file)
$ echo $results
100%

答案 3 :(得分:2)

您可以使用expr单独使用bash执行此操作。

i=`expr "There is 98.76% packet loss at node 1" : '[^0-9.]*\([0-9.]*%\)[^0-9.]*'`; echo $i;

这将提取与\( \)内的正则表达式匹配的子字符串。

答案 4 :(得分:0)

这里我假设你感兴趣的输出行严格遵守你的例子,百分比值是唯一的变化。

有了这个假设,你真的不需要比这更复杂的事情:

awk '/packet loss/ { print $3 }' dummy

这实际上意味着“打印包含'丢包'的任何行的第3个字段”。默认情况下,awk将空格视为字段分隔符,这对您来说非常合适。

如果您所做的不仅仅是打印百分比,您可以使用反引号将结果保存到shell变量,或者将输出重定向到文件。但是您的示例代码只是将百分比回显到stdout,然后退出。单行完成同样的事情。无需任何反叛或$()或任何其他贝壳阴谋。

注意:根据我的经验,将grep的输出传递给awk通常会做一些awk可以自己完成的事情。