2012-07-08 38 views
1

我有一个bash脚本来处理一堆输入,然后打印出精美格式的输出。目前,它是非常模块化 - 它产生吨子shell,并使用echogrepsortwc,& sed了很多,但我的工作有更大的awk块替换多个块中的功能,提高了效率。一个挣扎:我一直想弄清楚如何搜索特定字符串的输入,只打印我正在搜索的确切东西。我一直在玩awk的match函数,但还没有成功。这里有一两件事我想弄清楚如何融入一个更大的awk脚本的例子:在awk中模仿`grep --only-matching`

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

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

+1

[http://support.microsoft.com/kb/159179/] to-grep-o-without-the-o) – 2012-07-08 02:23:51

回答

1

awk,也许这是你在寻找什么,或者至少可以包含一些有用的代码:

vmx 
pae 
lm 
ht 

HTH

+0

'/ ^(pae | lm | vmx | svm | ht)$ /' – 2012-07-08 02:33:31

+0

@DennisWilliamson谢谢:-) – Steve 2012-07-08 02:36:01

+0

谢谢史蒂夫。这给了我一些新的东西来咀嚼。 – rsaw 2012-07-08 16:54:03

1

我想:我的系统上

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 

输出这将做你的工作:

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]}

+0

谢谢你。当我回到我的编码机器时,我会看看我能否得到所需的东西。 – rsaw 2012-07-08 17:13:57