对不起,伙计们,我想知道,是否可以grep列?例如,我们有类似(vmstat)的输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 706108 75536 328172 0 0 142 88 489 1042 5 11 84 0
如果我运行./script.sh in
,输出将是:
$ ./script.sh in
$ 489
或者可能不是grep,但我只需要使用bash(为考试做准备)。提前谢谢。
我想你想要的是,你给一个列标题作为参数,比如in
、buff
或wa
。。。然后得到相应的值。
所以试试这个:
vmstat|awk -v f="in" '!o{for(x=1;x<=NF;x++)if($x==f){o=1;next}}o{print $x}'
这里CCD_ 5是列标题。"in"
是硬编码的,它可以像f="$foo"
一样是外壳变量
小测试,我将您的vmstat输出保存为out
文件:
kent$ cat out
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 706108 75536 328172 0 0 142 88 489 1042 5 11 84 0
kent$ awk -v f="in" '!o{for(x=1;x<=NF;x++)if($x==f){o=1;next}}o{print $x}' out
489
kent$ awk -v f="buff" '!o{for(x=1;x<=NF;x++)if($x==f){o=1;next}}o{print $x}' out
75536
以下是如何使用awk根据列name获取值:
vmstat |
awk -v col="in" '
NR==2 {for (i=1; i<=NF; i++) if ($i == col) break}
NR==3 {print $i}
'
bash脚本中的switch
+awk
命令应该可以解决问题
您可以使用cut
来获取列。
vmstat | cut -b 57-60
因此,我提出了以下内容:
假设在名为test.txt
:的文件中有一个包含以下行的文件
abe 123 bdb 532
xyz 593 iau 591
现在,您要查找包含第一个字段的行,该字段的第一个和最后一个字母都是元音。如果你做了一个简单的grep,你会得到这两行,但下面只会给你第一行,这是你想要的输出:
egrep "^([0-z]{1,} ){0}[aeiou][0-z]+[aeiou]" test.txt
然后你想找到包括第三个字段的行,其中第一个和最后一个字母是元音。类似地,如果你做了一个简单的grep,你会得到这两行,但下面只会给你第二行,这是你想要的输出:
egrep "^([0-z]{1,} ){2}[aeiou][0-z]+[aeiou]" test.txt
第一个大括号{1,}
中的值指定前面的字符(根据ASCII表,范围从0到z)可以出现任意次数。在这之后,我们得到了这个例子中的字段分隔符空间。更改第二个大括号{0} or {2} to the desired field number-1
内的值。然后,使用正则表达式来提及您的条件。