我有一个bash
,处理一堆输入,然后打印出娇滴滴格式的输出脚本。 目前,它是非常模块化-它产生吨子shell,并使用echo
, grep
, sort
, wc
,与sed
很多,但我的工作有较大的替代多个块的功能awk
块,提高了效率。
一个奋斗:我一直在试图找出如何搜索输入特定字符串,只有打印我在寻找确切的事情。 我一直在玩awk的match
功能,但都没有成功呢。 这里有一两件事我想弄清楚如何融入一个更大的awk脚本的例子:
$ egrep -o "pae|lm|vmx|svm|ht" /proc/cpuinfo | sort -u
ht
lm
pae
vmx
如果我用awk做同样的事情,我想每个包含我搜索它找到字符串数组或变量结束。 我看到它的主要问题是,每个字符串我在寻找可能存在多次输入。 也许我只是需要买一个awk书...任何意见欢迎。
在awk
,也许这就是你想找的东西,或者至少可以包含一些有用的代码:
awk '{ for (i = 1; i <= NR; i++) if ($i ~ /^(pae|lm|vmx|svm|ht)$/) array[$i]++ } END { for (j in array) print j }' /proc/cpuinfo
我的系统上的输出:
vmx
pae
lm
ht
HTH
我认为这会做你的工作:
awk -v RS="pae|lm|vmx|svm|ht" 'RT != "" {print RT}' /proc/cpuinfo
或者,如果你还需要在做AWK排序:
gawk -v RS="pae|lm|vmx|svm|ht" 'RT != "" {m[RT]} END{n=asorti(m, m_sorted); for(i=1;i<=n;++i){print m_sorted[i]}}' /proc/cpuinfo
说明 :我们设置记录分隔符RS
必要的正则表达式和awk存储的精确匹配RS
在正则表达式RT
变量。 RT
是空的最后一个记录,所以我们需要检查非空虚。
排序版本使用功能asorti
这是gawk
扩展。
对于更通用的方法,看看match
功能。 例如,如果可以设置这样的记录分离器,以便匹配occures每个记录只有一次,然后将溶液并不复杂: gawk -v RS="your_separator" 'match($0, /pae|lm|vmx|svm|ht, m)" {print m[0]}