模仿`grep的--only-matching`在AWK(mimicking `grep --onl

2019-09-19 04:56发布

我有一个bash ,处理一堆输入,然后打印出娇滴滴格式的输出脚本。 目前,它是非常模块化-它产生吨子shell,并使用echogrepsortwc ,与sed很多,但我的工作有较大的替代多个块的功能awk块,提高了效率。

一个奋斗:我一直在试图找出如何搜索输入特定字符串,只有打印我在寻找确切的事情。 我一直在玩awk的match功能,但都没有成功呢。 这里有一两件事我想弄清楚如何融入一个更大的awk脚本的例子:

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

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

Answer 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



Answer 2:

我认为这会做你的工作:

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功能。 例如,如果可以设置这样的记录分离器,以便匹配occures每个记录只有一次,然后将溶液并不复杂: gawk -v RS="your_separator" 'match($0, /pae|lm|vmx|svm|ht, m)" {print m[0]}



文章来源: mimicking `grep --only-matching` in awk
标签: bash awk grep