我有一个日志文件,我使用sed来提取包含单词MATCH的两个字符串之间的行。我使用sed来提取行和grep,只使用包含单词“MATCH”的行。我需要在日志文件中找到匹配项的行号。
Date:...
TST STARTS
DISCARD str1
DISCARD str2
MATCH str3 //line 5
MATCH str4 //line 6
DISCARD str5
TST FINISHED
我使用此命令提取行:
sed -n "/TST STARTS/,/TST FINISHED/p" log.txt | grep "MATCHED".
我的输出是:
MATCH str3
MATCH str4
但我还需要在输出中输入行号:
line 5: MATCH str3
line 6: MATCH str4
答案 0 :(得分:18)
您可以使用:
cat -n
在应用sed之前对行进行编号,如下所示:
cat -n log.txt | sed -n "/TST STARTS/,/TST FINISHED/p" | grep "MATCHED"
或者,您可以使用cat -n
的变体替换nl
:
nl -n ln log.txt | sed ...
答案 1 :(得分:3)
我的第一次尝试是不保留行号,因为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
'/TST STARTS/ {p=1}
设置了一个标记p=1
,以便从现在开始考虑所有行。p && /MATCH/ {print "line "NR" --> "$0}
如果标记p
处于活动状态且行包含MATCH
,则会打印信息。/TST FINISHED/ {p=0}
文字时,TST FINISHED
会关闭旗帜。答案 2 :(得分:2)
sed -n '/TST STARTS/,/TST FINISHED/ {
/MATCH/ {
=;p
}
}' log.txt
行号比下一行的行内容
| sed "/^[0-9]/ {
N
s/^\(.*\)\n/line \1:/
}"
用于包含在同一行(可以在1 sed但是巨大的脚本和在这种情况下表现不佳的事件中完成,从shell调用的事件使用第二个sed更容易)。 也可以使用以前编号的行