首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在awk中模仿‘`grep -only-matching`

在awk中模仿‘`grep -only-matching`
EN

Stack Overflow用户
提问于 2012-07-08 09:39:51
回答 2查看 2K关注 0票数 1

我有一个bash脚本,它可以处理大量输入,然后打印出格式精美的输出。目前,它非常模块化--它产生了大量的子subshells,并大量使用echogrepsortwcsed,但我正在努力用更大的awk块替换多个块的功能,以提高效率。

一个难题:我一直在试图弄清楚如何在输入中搜索特定的字符串,只打印出我正在搜索的内容。我一直在尝试awk的match函数,但还没有成功。下面是我正在尝试弄清楚如何集成到更大的awk脚本中的一个例子:

代码语言:javascript
复制
$ egrep -o "pae|lm|vmx|svm|ht" /proc/cpuinfo | sort -u
ht
lm
pae
vmx

如果我使用awk做同样的事情,我希望得到一个数组或变量,其中包含我搜索到的每个字符串。我所看到的主要问题是,我正在搜索的每个字符串可能在输入中出现不止一次。也许我只需要买本awk书..。欢迎任何反馈。

EN

回答 2

Stack Overflow用户

发布于 2012-07-08 10:32:17

awk中,这可能就是您要查找的内容,或者至少包含一些有用的代码:

代码语言:javascript
复制
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

我的系统上的输出:

代码语言:javascript
复制
vmx
pae
lm
ht

HTH

票数 1
EN

Stack Overflow用户

发布于 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]}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11380039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档