![按文本块\行进行 Grep](https://linux22.com/image/697416/%E6%8C%89%E6%96%87%E6%9C%AC%E5%9D%97%5C%E8%A1%8C%E8%BF%9B%E8%A1%8C%20Grep.png)
我有包含几行的文本。因此,我需要对几行进行 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 awk
或Gnu 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 可能会警告未实现的功能。”