有没有办法让这个命令更简单(即不使用 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 '/'
感谢。
答案 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,因此可以正确使用任何接口名称。