我正在尝试使多个日志文件的作业输出在 Unix 上更加用户友好。
日志文件从最新的 Web.log 到最旧的 Web.log.30。我从这些文件中 grep job123,然后通过管道传输到一个新的 grep,其中仅包含带有 Exit 消息的行,这意味着作业已完成。然后我用逗号将其剪切,这样我只打印时间戳而不是整行。这是我的脚本:
for file in `ls -tr Web.log*`; do grep job123 $file | grep Exit | cut -d "," -f1; done
它按时间顺序输出我想要的时间戳:
2015-06-17 21:07:00
2015-06-17 22:07:00
2015-06-17 23:07:00
2015-06-18 00:07:00
2015-06-18 01:07:00
2015-06-18 02:07:00
2015-06-18 03:07:00
我想做的就是在每行的开头添加一个回显,说“Script job123 ran at:”,所以它看起来像这样:
Script job123 ran at: 2015-06-17 21:07:00
Script job123 ran at: 2015-06-17 22:07:00
Script job123 ran at: 2015-06-17 23:07:00
Script job123 ran at: 2015-06-18 00:07:00
Script job123 ran at: 2015-06-18 01:07:00
Script job123 ran at: 2015-06-18 02:07:00
Script job123 ran at: 2015-06-18 03:07:00
由于用户几乎不了解 Unix,我只需要使其尽可能方便用户阅读。我正在努力解决 echo 部分。
此外,每个日志文件长约 25MB,因此一系列管道可能会消耗内存,因此如果有人有任何加快速度的建议,我们将不胜感激。
请注意,这是在生产服务器上,因此安装其他脚本(例如 multigrep
)是不可能的。我尝试将其作为单行脚本来执行,以使用户的使用更加简单。
有什么方法可以在我当前使用的脚本上回显该文本吗?我已经尝试过分几个阶段回应它,但没有成功。
谢谢。
最佳答案
重新使用您的代码,这可以通过将 cut
命令 (cut -d ","-f1
) 替换为 awk -F 来实现, '{print "脚本 job123 运行于:"$1}'
另外,单独使用 awk
也可以实现相同的效果:
for file in `ls -tr Web.log*`; do awk -F, '/job123/&&/Exit/{print "Script job123 ran at: " $1}' $file; done
关于bash - 在 Unix 上 grep 和 cut 之后在每行之前回显文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30906229/