grep命令知道两个字符串是否按特定顺序

时间:2017-08-04 06:36:04

标签: bash shell unix

我试图编写一个shell脚本来检查文件中是否存在两个字符串,同时,我还要检查它们是否按特定顺序排列。

让我们说file.txt有以下文字:

bcd
def
abc

我使用命令:grep -q abc file.txt && grep -l bcd file.txt

当两个字符串以任何顺序出现时,这将给出输出file.txt。我希望仅在abc出现在bcd之前才能获得输出。请帮帮我这个

3 个答案:

答案 0 :(得分:3)

使用 grep PCRE 选项:

grep -Pzl 'abc[\s\S]*bcd' file.txt
  • -z - 将输入和输出数据视为行序列,每行以零字节(ASCII NUL字符)而不是换行符结束。

如果您不支持 PCRE -P选项):

grep -zl 'abc.*bcd' file.txt

答案 1 :(得分:2)

awk之后,您可以使用grep代替abc来匹配bcd

awk '/abc/{p=NR} p && /bcd/{print FILENAME; exit}' file

答案 2 :(得分:1)

awk -v RS='' '/abc.*bcd/{print FILENAME}' file.txt

您可以将RS(记录分隔符)从默认'\n'重新分配到'',并开始处理整个文件,因为它在一条记录中。那么使用/abc.*bcd/来区分abc是否领先bcd是没有问题的。

注意,如果空行是空的,则无法成功识别,因为abcbcd之间的空行会将它们拆分为不同的记录。这会导致标准误判。