我正在创建shell脚本来改变debian框中的cpu亲和性。这是cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
39: 522718016 0 0 0 xen-dyn-event eth0
40: 1492310505 0 0 0 xen-dyn-event eth1
41: 1834986298 0 0 0 xen-dyn-event eth2
我想存储第一列的值,其中行与eth1和eth2在变量中匹配,因为值可能因机器而异。我试过这个
$ awk '{if ($7 == "eth1") print $1;}' /proc/interrupts
40:
我只想存储没有冒号或任何其他特殊字符的数字。我错过了什么?
答案 0 :(得分:1)
awk '{if ($7 == "eth1") {split($1,a,":");print a[1]}}' /proc/interrupts
18
在awk
中有一个内置函数split
,它可以根据任何已定义的分隔符将任何字段拆分为块。在此处,$1
被拆分为多个部分,并以:
为分隔符并存储在数组a[]
或者,但是以领先空间为代价。
awk -F: '/eth1/{print $1}' /proc/interrupts
答案 1 :(得分:1)
如果grep
选项可用,则pcre
:
$ grep -oP '^\s*\K\d+(?=.*eth1$)' /proc/interrupts
40
或sed
$ sed -nE '/eth1$/ s/^\s*([0-9]+).*/\1/p' /proc/interrupts
40
答案 2 :(得分:1)
有多种方法可以做到这一点,但一种简单的方法是使用 sub string function删除不需要的字符。例如:
$ awk '$7 == "eth1" {sub(":", "", $1); print $1}' /proc/interrupts
40
或者,如果您不需要整个解决方案都在awk中,您还可以使用标准 tr 实用程序删除不需要的字符。例如:
$ tr -d ':' < /proc/interrupts | awk '$7 == "eth1" {print $1}'
40
或:
$ { tr -d ':' | awk '$7 == "eth1" {print $1}'; } < /proc/interrupts
40
这不是更好或更快,但是当您希望在将结果传递到您的awk脚本之前过滤结果时,可能会派上用场。
答案 3 :(得分:0)
试试这个:
awk '$7=="eth1"{print $1+0}' /proc/interrupts
来自gawk手册:
如果由于某种原因,您需要强制将数字转换为字符串,请将该数字与空字符串连接,&#34;&#34;。要强制将字符串转换为数字,请将该字符串添加为零。通过将字符串的任何数字前缀解释为数字,将字符串转换为数字:&#34; 2.5&#34;转换为2.5,&#34; 1e3&#34;转换为1,000,&#34; 25fix&#34;数字值为25.不能解释为有效数字的字符串转换为零。