1

我有一个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 书......欢迎任何反馈。

4

2 回答 2

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

高温高压

于 2012-07-08T02:32:16.897 回答
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]}

于 2012-07-08T02:36:40.653 回答