我想在文件中搜索两个目标字符串。对于第一个目标,我希望返回该行及其后面的 3 行。对于第二个目标字符串,我只想返回包含该目标的行。
所以我想做一些类似这样的伪命令:
cat <file> | grep (-A 3 'target1') OR ('target2')
问题是我不知道如何防止其-A 3
应用于第二个目标。
有办法实现这个吗?我无法grep
单独运行这两个,因为这些行是有序的。
答案1
您可以在 sed 中做这样的事情:
sed -n -e '/target1/,+3p' -e '/target2/p'
或者在 awk 中:
awk '$0 ~ "target1" {a = FNR+3} (FNR <= a) || ($0 ~ "target2")'
如果您使用 GNU awk(又名gawk
),那么~
操作员应该接受与 GNU 相同的正则表达式模式grep -E
。
答案2
只需 grep 两次即可。如果您需要交错行,则使用行号并排序
(cat <file> | grep -A 3 'target1') && (cat <file> | grep 'target2')
# or for interleaved line numbers
# sed is required because grep prefixes lines that are included with -A with <line#>- instead of <line#>:
((cat <file> | grep -n -A 3 'target1') && (cat <file> | -n 'target2')) | sort -n | sed 's/\([0-9]\+\)-/\1:/g' | uniq
# or if you don't want the line numbers in your output
((cat <file> | grep -n -A 3 'target1') && (cat <file> | -n 'target2')) | sort -n | sed 's/^\([0-9]\+\)-/\1:/g' | uniq | sed 's/^[0-9]\+://g'