我有一个bash
脚本处理一堆输入,然后打印出漂亮格式的输出。目前它是非常模块化的 - 它产生了大量的子壳并使用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书......欢迎任何反馈。
答案 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]}