从匹配行的第一列中删除冒号

时间:2016-11-24 06:27:03

标签: bash awk sed grep

我正在创建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:

我只想存储没有冒号或任何其他特殊字符的数字。我错过了什么?

4 个答案:

答案 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)

使用Awk的替换字符串函数

有多种方法可以做到这一点,但一种简单的方法是使用 sub string function删除不需要的字符。例如:

$ awk '$7 == "eth1" {sub(":", "", $1); print $1}' /proc/interrupts
40

替代方法:使用 tr

删除字符

或者,如果您不需要整个解决方案都在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.不能解释为有效数字的字符串转换为零。