所以,我有一个名为'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%。但由于某种原因,它只打印出一个空白字符串。任何人都可以帮助我吗?
答案 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可以自己完成的事情。