在awk中模仿`grep --only-matching`

时间:2012-07-08 01:39:51

标签: bash awk grep

我有一个bash脚本处理一堆输入,然后打印出漂亮格式的输出。目前它是非常模块化的 - 它产生了大量的子壳并使用echogrepsortwc和& sed很多,但我正在努力用更大的awk块替换多个块的功能,以提高效率。

一个挣扎:我一直在试图找出如何搜索特定字符串的输入,只打印我正在搜索的确切内容。我一直在玩awk的match功能,但还没有取得任何成功。这是我试图弄清楚如何集成到更大的awk脚本中的一个例子:

$ egrep -o "pae|lm|vmx|svm|ht" /proc/cpuinfo | sort -u
ht
lm
pae
vmx

如果我使用awk做同样的事情,我想最终得到一个数组或变量,其中包含我找到的每个搜索到的字符串。我看到的主要问题是我正在搜索的每个字符串可能在输入中存在多次。也许我只需要买一本awk书......欢迎任何反馈。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为这会完成你的工作:

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函数。例如,如果您可以设置此类记录分隔符,则每个记录只发生一次匹配,那么解决方案并不复杂: gawk -v RS="your_separator" 'match($0, /pae|lm|vmx|svm|ht, m)" {print m[0]}