假设我有一个包含异常的日志文件,如图所示
java.lang.NullPointerException blabla
ABC.Exception blalabbla
dogchacecat.Exception yadayada
我希望能够输出从头到尾(包括)“异常”的每一行
期望的输出:
java.lang.NullPointerException
ABC.Exception
dogchacecat.Exception
如何使用任何 GNU 工具(grep、awk、sed)执行此操作?谢谢你!
答案1
使用grep
:
grep -o '.*Exception' file
-o, --仅匹配
仅打印行的匹配部分。
'.*Exception'
这将匹配 0 次到无限次出现的任何字符(行终止符除外),直到单词“Exception”
为了获得您在评论中提到的行为(拉动之前的字符串并包括Exception
直到任何前导空格),您可以使用扩展或 perl 正则表达式来使用\S
控制字符(任何非空格字符):
grep -oE '\S+Exception' file
答案2
使用 POSIX 实用程序(因此可以与 GNU 和非 GNU 实现一起使用):
一切直到第一的Exception
一行中出现:
sed -n 's/\(Exception\).*/\1/p'
一切直到最后的发生:
sed -n 's/\(.*Exception\).*/\1/p'
如果您想保留(未修改)不包含 的行,请删除-n
和。p
Exception
答案3
和你的最喜欢的标准编辑器,ed:
ed -s input <<< $'1,$s/Exception.*/Exception/\nw\nq'
input
这将使用此处的命令字符串列表编辑输入文件,即:
1,$
-- 文件中的每一行(从 1 到结尾$
),s/Exception.*/Exception/
-- 搜索并替换字符串“Exception”,后跟任何内容 (.*
),仅使用单词“Exception”w
-- 将文件写回磁盘q
——退出编辑