如何使这个awk命令更简单

时间:2014-05-12 13:46:38

标签: linux awk cut gawk

有没有办法让这个命令更简单(即不使用 awk 两次):

awk '/cpu MHz/ {print $4}' < /proc/cpuinfo | awk -F'.' 'NR==1 {print $1}'

另外,有没有办法避免在这里使用 cut 命令:

ip addr show dev eth0 | awk '$1=="inet" {print $2}' | cut -f1 -d '/'

感谢。

2 个答案:

答案 0 :(得分:1)

第一个是这样的:

awk '/cpu MHz/ {print $4}' < /proc/cpuinfo | awk -F'.' 'NR==1 {print $1}'

考虑到你有这样的字符串:

cpu MHz         : 800.000
cpu MHz         : 800.000
cpu MHz         : 800.000
cpu MHz         : 800.000

你希望数字的整数部分仅用于第一行,你可以这样做:

$ awk -F"[ .]" '/cpu MHz/ {print $(NF-1); exit}' /proc/cpuinfo
800

也就是说,要匹配该行,请打印倒数第二个字段然后退出以避免额外处理。

根据评论,您还希望在另一个命令中获得第二个匹配行。为此,您可以:

awk -F"[ .]" '/cpu MHz/ {if (f) {print $(NF-1); exit}; f=1}' /proc/cpuinfo

它的作用是使用旗帜。在第一场比赛中,旗帜被激活,所以在下一场比赛中,它会打印出值并退出。


第二个是这样的:

ip addr show dev eth0 | awk '$1=="inet" {print $2}' | cut -f1 -d '/'

您可以做的是根据/拆分切片中的第二个字段并打印第一个字段:

$ ip addr show dev eth0 | awk '$1=="inet" {split($2, a, "/"); print a[1]}'
192.168.123.123

答案 1 :(得分:1)

如果目标是在您的界面上显示IP地址,那么这不是一个好的选择:

ip addr show dev eth0

如果界面有其他名称,或者您有多个界面并且eth1是连接到互联网的界面怎么办?

取而代之的是:

ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}'
192.168.0.33

将其存储在变量中:

IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')

它使用ip route命令查看如何访问公共IP,因此可以正确使用任何接口名称。