针对一个目标 (+ 接下来的 3 行) 或另一个目标 (仅该行) 查找文件

针对一个目标 (+ 接下来的 3 行) 或另一个目标 (仅该行) 查找文件

我想在文件中搜索两个目标字符串。对于第一个目标,我希望返回该行及其后面的 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'

相关内容