繁体   English   中英

如何在N行内grep多个字符串

[英]How to grep multiples strings within N lines

我想知道是否我可以grep(或任何其他命令)在N行内搜索多个字符串。

在3行中搜索“橙色”,“石灰”,“香蕉”

如果输入文件是

xxx
a lime
b orange
c banana
yyy
d lime
foo
e orange
f banana

我要打印以a,b,c开头的三行。 带有搜索字符串的行可以按任何顺序出现。

我不想打印d,e,f行,因为它们之间有一行,因此这三个字符串没有组合在一起。

您的问题还不清楚。 这是一个简单的Awk脚本,该脚本收集连续的匹配行并在数组长于三个元素时进行打印。

awk '/orange|lime|banana/ { a[++n] = $0; next }
    { if (n>=3) for (i=1; i<=n; i++) print a[i]; delete a; n=0 }
    END { if (n>=3) for (i=1; i<=n; i++) print a[i] }' file

目前尚不清楚是否需要所有表达式都匹配。 这个没有尝试。 如果看到三个连续的orange行,则表示匹配,将被打印。

逻辑应该很简单。 数组a收集匹配项,其中n索引。 当我们看到不匹配项时,我们检查其长度,并打印是否为3或更大,然后从一个空数组和索引开始。 如果文件以匹配结尾,也将在文件末尾重复(重复)此操作。

如果要允许间隙(因此,如果连续三行中有一个匹配“橙色”和“香蕉”,那么不匹配的一行,然后匹配“石灰”的一行,则打印这三行?尚不清楚),您可以更改为始终保留最后三行的数组,尽管这时您还需要指定如何处理例如由这些规则匹配的五行序列。

与Tripleee的答案类似,我也将awk用于此目的。 主要思想是实现一个简单的状态机。

简单的例子

作为一个简单的示例,首先尝试查找连续三行香蕉。 考虑模式动作语句

/banana/ { bananas++ }

对于与regex banana匹配的每一行,它都会增加变量bananas (在awk中,所有变量均以0初始化)。

当然,当有不匹配的行时,您希望将bananas重置为0,因此搜索从头开始:

/banana/ { bananas++; next }
{ bananas = 0 }

您还可以测试操作模式中的变量值。 例如,如果要在包含banana三行之后打印“ Found”,请扩展​​规则:

/banana/ {
    bananas++
    if (bananas >= 3) {
        print "Found"
        bananas = 0
    }
    next
}

这会将变量bananas重置为0,并打印字符串“ Found”。

如何进一步进行

使用这个基本思想,您应该能够编写自己的处理所有情况的awk脚本。 首先,您应该熟悉awk(模式,操作,程序执行)。

然后,扩展并调整我的示例以适合您的需求。

  • 特别是,您可能需要一个matched数组,其索引为“香蕉”,“橙色”,“石灰”。
  • 当前行匹配/banana/时,您可以设置matched["banana"] = $0 这将保存当前行以供以后输出。
  • 当当前行与您的任何表达式都不匹配时,请清除整个数组。
  • 找到所有字符串后(每个字符串s matched[s]都不为空),您可以打印matched[s]的内容。

我将实际的实现留给您。 正如其他人所说,您的描述使许多极端情况不清楚。 您应该自己弄清楚它们,并相应地调整实现。

我想你想要这个:

awk '
  /banana/ {banana=3}
  /lime/   {lime=3}
  /orange/ {orange=3}
 (orange>0)&&(lime>0)&&(banana>0){print l2,l1,$0}
 {orange--;lime--;banana--;l2=l1;l1=$0}' OFS='\n' yourFile

因此,如果看到banana一词,则将banana=3设置为对接下来的3行有效。 同样,如果您看到lime ,给它3行机会以组成一个小组,同样地给orange

现在,如果在前三行中都看到了orangelimebanana ,则打印倒数第二行( l2 ),最后一行( l1 )和当前行$0

现在减少每个水果的计数,然后再移至下一行,并保存当前行并按时间顺序将前2行按顺序向后移。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM