我有一个日志文件,我使用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)
我的第一次尝试不是保留行号,因为该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。| 归档时间: |
|
| 查看次数: |
19870 次 |
| 最近记录: |