linux - 如何组合多个 grep 命令?

标签 linux grep

我有一个很长的 .txt 文件 (LONG.txt)。在那个 txt 文件中,我想搜索 3 种类型的模式,然后我想将 grep 结果捕获到一个新的 txt 文件 (SHORT.txt)。

模式:

  1. AAAA

  2. BBBB

  3. CCCC

注意:

当找到模式 AAAAABBBBB 时,我只想打印包含 AAAAABBBBB 的行>.

当找到模式 CCCCC 时,我想打印包含 CCCCC 的那一行 + 下 1 行。

例子:

LONG.txt:

bla bla 
bla bla 
bla bla 
something something AAAAA something something
bla bla 
bla bla 
something something CCCCC something something
bla bla 
bla bla 
bla bla 
bla bla 
bla bla 
bla bla 
something something BBBBB something something
bla bla 
bla bla 
bla bla 
something something AAAAA something something
bla bla 
something something AAAAA something something
bla bla 
something something BBBBB something something
bla bla 
bla bla 
bla bla 
something something CCCCC something something
bla bla
bla bla
bla bla

输出应该是:

something something AAAAA something something
something something CCCCC something something
bla bla 
something something BBBBB something something
something something AAAAA something something
something something AAAAA something something
something something BBBBB something something
something something CCCCC something something
bla bla

我尝试的是:

grep -B0 "AAAAA" LONG.txt > SHORT.txt
grep -B0 "BBBBB" LONG.txt > SHORT.txt
grep -B1 "CCCCC" LONG.txt > SHORT.txt

但这并没有给我想要的输出。

最佳答案

您的代码会不断覆盖文件,因为您使用了单个箭头。

第一次使用单箭头,随后使用双箭头附加到文件。

grep "AAAAA" LONG.txt > SHORT.txt
grep "BBBBB" LONG.txt >> SHORT.txt
grep -A1 "CCCCC" LONG.txt >> SHORT.txt

前两个 grep 命令只打印匹配的行,最后一个命令打印该行和之后的一行。


grep的补充说明:

默认情况下它只返回匹配的行。如果您传递带有数字的 -A 标志,它将显示匹配的行和后面的行数。例如。 -A1 根据您的要求打印匹配行和下一行。类似地,-B 标志在匹配之前打印行。

记住:-A = 之后,-B = 之前。


更新

还有一个额外的要求,即输出保留它们在原始文件中出现的顺序。

这是一个脚本:

grep -n "AAAAA" LONG.txt > SHORT.txt
grep -n "BBBBB" LONG.txt >> SHORT.txt
grep -n -A1 "CCCCC" LONG.txt >> SHORT.txt
sort -n -o SHORT.txt SHORT.txt

sed -i 's/^[0-9]\+//' SHORT.txt
sed -i 's/^.//g' SHORT.txt

这里唯一的主要区别是我在 grep 中使用 -n 标志来打印行号,然后我使用 sort 进行排序这些行号的文件。行号仍会出现在该输出文件中,因此您可能想要删除它们。

关于linux - 如何组合多个 grep 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808007/

相关文章:

bash - Grep --byte-offset 不返回偏移量(Grep 版本 2.5.1)

unix - Grep OR 操作符不工作

linux - grep:字符类语法是 [[:space:]],而不是 [:space:]

bash - 检查 git 分支是否包含给定主题的提交

linux - 无法允许 jenkins 对 shell 脚本进行 sudo 访问

python - 在 Linux 中使用 sudoers 将文件的所有者从用户更改为 root

Linux - 在软链接(soft link)中执行命令

linux - 如何在 Linux 中协调 'top' 和 'free -m' 的内存使用报告?

xml - 在 bash 脚本中访问 xml 属性

python - 如何获取 grep 命令的输出(Python)