bash - 在 Unix 上 grep 和 cut 之后在每行之前回显文本

标签 bash shell unix scripting

我正在尝试使多个日志文件的作业输出在 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/

相关文章:

c - sbrk() 是如何工作的?

matlab - MATLAB 中的列表目录不适用于 Fish

linux - 如何使用 shell 脚本在文件中查找/获取数字

linux - 从 bash shell 脚本中的整个字符串中提取路径

python - 使用子进程通过 shell 卸载 OpenJDK

c - 使用 stat (st_uid) 的段错误(核心转储)

linux - 改进我的密码生成脚本

bash - 如何使用 sed 或 awk 打印第一行和段落的模式

bash - 在crontab中调用时,带有hive命令的shell脚本未将数据写入文件

linux - Shell 脚本 while 循环