我有一个bash脚本,它可以处理大量输入,然后打印出格式精美的输出。目前,它非常模块化--它产生了大量的子subshells,并大量使用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书..。欢迎任何反馈。
发布于 2012-07-08 10:32:17
在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
htHTH
发布于 2012-07-08 10:36:41
我认为这将完成您的工作:
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为空,因此我们需要检查非空。
排序版本使用gawk扩展的function asorti。
有关更一般的方法,请查看match函数。例如,如果您可以设置这样的记录分隔符,使每个记录只匹配一次,那么解决方案就不复杂了:gawk -v RS="your_separator" 'match($0, /pae|lm|vmx|svm|ht, m)" {print m[0]}
https://stackoverflow.com/questions/11380039
复制相似问题