我尝试使用awk在包含字母数字字符的系统计数器文件中读取数字总整数(total = *****)数字,而不将结果传递给另一个命令。
即:
TCP time wait closed (net): 0 (total=0)
TCP gc closed (net): 0 (total=0)
TCP internal closed (net): 0 (total=0)
192.168.254.2:80 sockets (cpu0) (knet): 0 / 0 (total=0)
起初我试过了:
awk -F "total=" '{print $2 }'` counters
导致:
0)
0)
0)
0)
问题是")"字符,这将导致系统读取错误,因为它不是数字。然后我把第一个awk结果输出到这个:
awk -F '[^0-9]+' '{OFS=" "; for(i=1; i<=NF; ++i) if ($i != "") print($i)}'
只读数字。这导致:
0
0
0
0
它在bash中运行良好。但是,我使用的系统在第一个awk参数中没有理解管道,如果我配置它会导致以下错误:
awk -F "total=" '{print $2 }' counters | awk -F '[^0-9]+' '{OFS=" "; for(i=1; i<=NF; ++i) if ($i != "") print($i)}`'
awk: cmd. line:1: fatal: cannot open file `counters' for reading (No such file or directory)"
任何想法如何编写一个可以提取(total = *)?
中的数字的awk答案 0 :(得分:2)
任何想法如何写一个可以提取数字的awk 数字(总计= *)?
如果您可以使用[ GNU awk ],请在脚本下方
awk '{$0=gensub(/.*total=(.*)\)/,"\\1","1",$0);print}' file
应该这样做。
示例运行
$ cat 38081612
TCP time wait closed (net): 0 (total=21)
TCP gc closed (net): 0 (total=28)
TCP internal closed (net): 0 (total=45)
192.168.254.2:80 sockets (cpu0) (knet): 0 / 0 (total=100)
$ awk '{print gensub(/.*total=(.*)\)/,"\\1","1",$0)}' file
21
28
45
100
awk [ user guide ]表示gensub()
可以在替换文本中指定正则表达式的组件。这是通过在正则表达式中使用括号来标记组件然后在替换文本中指定“\ N”来完成的。
简而言之,在记录中,我们取代了
(anything)total=(interested_value)ending_parenthesis
与
(interested_value)
并打印结果。
使用sed ,您可以获得更便携的解决方案:
$ sed -E 's/.*total=(.*)\)/\1/' 38081612
21
28
45
100
Sed还提供了在替换文本中指定正则表达式组件的功能,即(\1
)。