sed和grep获取匹配的行号

geo*_*a_e 11 bash grep sed

我有一个日志文件,我使用sed提取包含单词MATCH的两个字符串之间的行.我使用sed来提取行和grep,只使用包含单词"MATCH"的行.我需要在日志文件中找到匹配项的行号.

Date:...
TST STARTS
DISCARD str1
DISCARD str2
MATCH str3 //line 5
MATCH str4 //line 6
DISCARD str5
TST FINISHED
Run Code Online (Sandbox Code Playgroud)

我用这个命令来提取行:

sed -n "/TST STARTS/,/TST FINISHED/p" log.txt | grep "MATCHED".
Run Code Online (Sandbox Code Playgroud)

我的输出是:

MATCH str3
MATCH str4
Run Code Online (Sandbox Code Playgroud)

但我还需要在输出中的行号:

line 5: MATCH str3
line 6: MATCH str4
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 18

你可以使用:

cat -n
Run Code Online (Sandbox Code Playgroud)

在应用sed之前对行进行编号,如下所示:

cat -n log.txt | sed -n "/TST STARTS/,/TST FINISHED/p" | grep "MATCHED"
Run Code Online (Sandbox Code Playgroud)

或者,您可以cat -n使用以下变体替换nl:

nl -n ln log.txt | sed ...
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 5

我的第一次尝试不是保留行号,因为该sed部分删除了某些行。

一切都可以用这个来完成awk

$ awk '/TST STARTS/ {p=1} p && /MATCH/ {print "line "NR" --> "$0}; /TST FINISHED/ {p=0}' a
line 5 --> MATCH str3 //line 5
line 6 --> MATCH str4 //line 6
Run Code Online (Sandbox Code Playgroud)
  • '/TST STARTS/ {p=1}设置一个标志,p=1以便从现在开始所有行都将被考虑在内。
  • p && /MATCH/ {print "line "NR" --> "$0}如果该标志p处于活动状态并且该行包含MATCH,则它会打印信息。
  • /TST FINISHED/ {p=0}查找文本时关闭标志TST FINISHED