按文本块\行进行 Grep

按文本块\行进行 Grep

我有包含几行的文本。因此,我需要对几行进行 GREP。例如,我有重复的文本,我应该 GREP 获取包含此重复关键字的行。

grep -o "test|test2" textfile

我的正文:

123|never for your|test
123421|never for your|test2
123412|never for your|test3
12341|never for your|test4
12311|never for your|test2
123312312|never for your|test
123321312|never for your|test2

我应该:

123|never for your|test
123421|never for your|test2
123312312|never for your|test
123321312|never for your|test2

它可以工作,但不是我想要的那样。它在文本中搜索所有单词“test”和“test2”。但我想获取文本块,就像某种模式,其中只有在“test”之后才有“test2”。你有什么想法吗?

答案1

使用 sed 的简短 shell 脚本。列出第二种情况的行号,并与第一种情况的行号进行比较。打印匹配对。使用第一个参数作为文件名。可以轻松扩展以将第二个和第三个参数作为要匹配的模式。可以另存为 findnext.sh,然后运行:

$ sh findnext.sh testfile

应该很快,因为它只涉及两次文件传递,并且具有完全可移植的优点。

#!/bin/sh 
# Line numbers matching test1
mt2=$(sed -ne '/test1/=' < $1 | tr '\n' '/')

for l in $(sed -ne '/test/=' < $1); do
    nextline=$(expr $l + 1)
    [ "${mt2#*$nextline/}" != "$mt2" ] && sed -ne $l,${nextline}p <$1
done

答案2

您可以尝试 grep -E 或 egrep。请像这样尝试

#this will show lines that have test or test2
    grep -E "test|test2" file

如果你想显示包含 test 和 test2 的行,例如 test|test2,请执行以下操作

# This will show lines that has test|test2
    grep "test\|test2" file

答案3

awk可能是你的工具:

awk '/test$/, /test2$/' < block-text-lines.txt 

一般形式为:

awk '/start-pattern/, /end-pattern/{command}'

但由于命令块默认为打印,因此只需开始和结束模式即可解决问题。

查看man awkGnu Awk 用户指南为了方式更多详情。

答案4

grep -A 1 "test$" in.txt | grep -B 1 "test2$"

在 grep 手册中

-A NUM在匹配的行后打印 NUM 行尾随上下文。

-B NUM在匹配的行之前打印 NUM 行前导上下文。

该命令grep -Pzo ".*test$\n.*test2$" in.txt也有效,但手册中写道“这是高度实验性的,grep -P 可能会警告未实现的功能。”

相关内容