我倾向于在服务器启动期间查看我的日志文件中的错误,并使用less
来实现此目的。
但是,我想要更高效的东西。
我希望看到两种模式之间的日志“服务器停止”和“启动”
我使用sed
sed -n '/Stopping/,/Server startup/p' test.txt
这很好但是有问题。日志文件一遍又一遍地包含这些模式(当服务器停止和启动时),我怎样才能获得此模式的最后一个块? (这将是服务器和日志启动时的最后一次关闭。)
答案 0 :(得分:0)
基于tac
和sed
的简单解决方案:
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