Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使此awk命令更简单_Linux_Awk_Cut_Gawk - Fatal编程技术网

Linux 如何使此awk命令更简单

Linux 如何使此awk命令更简单,linux,awk,cut,gawk,Linux,Awk,Cut,Gawk,有没有办法使这个命令更简单(即不使用awk两次): ? 谢谢。第一个是这样的: 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 ip addr show dev eth0 | awk

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

?


谢谢。

第一个是这样的:

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
ip addr show dev eth0 | awk '$1=="inet" {print $2}' | cut -f1 -d '/'
如果只想将数字的整数部分用于第一行,可以执行以下操作:

$ 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
也就是说,要匹配该行,请打印倒数第二个字段,然后退出以避免额外处理

根据注释,您还希望在不同的命令中获得第二个匹配行。为此,您可以执行以下操作:

$ 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
它所做的是使用一个标志。在第一次匹配时,标志被激活,因此在下一次匹配时,它打印值并退出


第二个是这样的:

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
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

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

ip addr show dev eth0
如果接口有另一个名称,或者您有多个接口,并且
eth1
是连接到internet的接口,该怎么办

相反,我们:

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,因此对于任何接口名称都可以正确工作。

谢谢。但是第二行我该怎么做呢?我在我的cpuinfo:cpumhz:1000.000 cpumhz:1000中有这个。000@user3628725查看我的更新。此外,如果我的解决方案与您的要求不匹配,请使用您当前的示例输入进行更新,以便我可以猜出什么不起作用。谢谢,ip地址显示功能正常。关于第一个问题,我需要提取第一行和第二行(在两个单独的命令中)。我如何调整您建议的命令以匹配第二行?@user3628725我刚刚更新了一个版本以打印第二行的匹配。我认为这应该是两个问题。此外,我建议将示例输入和预期输出添加到问题中。例如,
/proc/cpuinfo/
的内容,
ip addr的输出显示dev eth0
以及您试图提取的部分。包含输入和所需输出的示例总是很有用的。
awk'/cpu MHz/{print int($4)}'/proc/cpuinfo
ip addr show dev eth0 | awk'/inet/{print gensub(“/.*”,“,”,“,$2)}
?@twalberg而不是使用
int()
函数,您只需向其中添加
0
awk'/cpumhz/{print$4+0}'/proc/cpuinfo
@jaypal我怀疑这与版本有关。我的
awk
版本在我
echo 1.5 | awk'{print$0+0}'
时给出了“1.5”。。。或者是因为小数点后的数字都是零。显然,在一般情况下并非如此,不过……谢谢你,@Jotne,这对我来说并不重要(我只有一个接口),但我会使用它,它更简单。@daimonion欢迎你。如果将服务器移动到
VPS
服务器场,则单个If的名称可能类似于:
venet0
+1;建议在
awk
程序中重复输入IP地址进行匹配,还是
IP路由获得8.8.8.8 | awk'{print$NF;exit}'
也工作?@mklement0实际上也工作:
IP路由获得1 | awk'{print$NF;exit}'
谢谢,有意思;这是可行的,因为
1
被解释为
1.0.0.0
,这显然是一个有效地址。