阻止文本与日志文件隔离

时间:2017-05-18 11:30:04

标签: shell unix sed pattern-matching

我倾向于在服务器启动期间查看我的日志文件中的错误,并使用less来实现此目的。

但是,我想要更高效的东西。

我希望看到两种模式之间的日志“服务器停止”和“启动” 我使用sed

实现了这一目标
sed -n '/Stopping/,/Server startup/p' test.txt

这很好但是有问题。日志文件一遍又一遍地包含这些模式(当服务器停止和启动时),我怎样才能获得此模式的最后一个块? (这将是服务器和日志启动时的最后一次关闭。)

3 个答案:

答案 0 :(得分:0)

基于tacsed的简单解决方案:

tac test.txt  | sed -e '/stopping/,$d' |  tac | sed -e '/startup/,$d'

<强>解释

tac反向连接并打印文件。

sed -e '/your_keyword/,$d'输出从开始直到达到'your_keyword'的行。

...所以从最后开始打印你的日志文件,剪切第一部分,再次反转,剪切第二部分......etvoilà!

测试它:

echo  "
xxxxxxxxxxx
xxxxxxxxxxx
xxx start xxxx
aaa1
aaa2
xx stop xxx
xxxyyyyxxxxyyyxxxx
xxxyyyyxxxxyyyxxxx
xyyyxx start xxxyyyyx
bbb1
bbb2
yy stop yy
yyyyyyyyy
yyyyyyyyy" | tac |sed -e '/start/,$d' |  tac | sed -e '/stop/,$d' 

输出:

bbb1
bbb2

答案 1 :(得分:0)

这可能适合你(GNU sed);

sed '/Stopping/,/Server startup/{/Stopping/h;//!H};$!d;x' file

将所需行的每个出现都存储在保留空间(HS)中,并删除所有其他行。在文件末尾交换到HS并打印已存储的内容。

HS中的最新行将覆盖以前任何此类行。

答案 2 :(得分:0)

永远不要使用范围表达式,因为它们使得琐碎任务的代码非常简单,但稍微更有趣的任务需要完全重写或重复条件。只需使用awk就可以简单地使用标志而不必尝试强制范围工作,如果合适,你甚至可以进行字符串比较而不是正则表达式比较。

从包含5的最后一行打印到包含8的最后一行:

$ seq 20 | awk '/5/{f=1;s=""} f{s=s $0 ORS} /8/{f=0} END{printf "%s", s}'
15
16
17
18