【问题标题】:Echoing text before each line after grep and cut on Unix在 Unix 上 grep 和 cut 之后在每一行之前回显文本
【发布时间】:2015-06-18 04:01:35
【问题描述】:

我正在尝试使多个日志文件的作业输出在 Unix 上更加用户友好。

日志文件从最新的 Web.log 到最旧的 Web.log.30。我正在从这些文件中 grepping 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,我只需要使其尽可能易于阅读。我在回声部分苦苦挣扎。

此外,每个日志文件的长度约为 25MB,因此这一系列管道可能会占用内存,因此如果有人对加快速度有任何建议,我们将不胜感激。

请注意,这是在生产服务器上,因此安装其他脚本(如 multigrep)是不可能的。我试图将其作为单行脚本来执行,以使用户的使用更加简单。

有什么方法可以在我当前使用的脚本上回显该文本?我已经尝试过分几个阶段回应它,但没有成功。

谢谢。

【问题讨论】:

  • 您可以将其通过管道传输到 awk。 for file in ls -tr Web.log*`;执行 grep job123 $file | grep 退出 |剪切 -d "," -f1 | awk '{print "脚本 job123 运行在:"$0}';完成
  • 感谢@c4pone,您的解决方案是最快的!
  • 别担心,伙计。很高兴我能帮上忙

标签: bash shell unix scripting


【解决方案1】:

重用你的代码,这可以通过将cut命令(cut -d "," -f1)替换为awk -F, '{print "Script job123 ran at: " $1}'来实现

另外,单独使用awk 也可以达到同样的效果:

for file in `ls -tr Web.log*`; do awk -F, '/job123/&&/Exit/{print "Script job123 ran at: " $1}' $file; done

【讨论】:

    【解决方案2】:

    将命令的输出存储在变量中并打印附加文本:

    for file in `ls -tr Web.log*`; do 
      out=$(grep job123 $file | grep Exit | cut -d "," -f1;)
      echo "Script job123 ran at: ${out}"
    done
    

    您也可以将两个 grep 合二为一:

    out=$(grep -E 'job123.*Exit|Exit.*job123' $file)
    

    如果你可以使用awk,那么它可以简化为单个命令:

    out=$(awk -F, '/job123/&&/Exit/{print $1}' $file)
    

    由于您必须解析每一行,awk 解决方案(无管道)会更好。但我不能说你会得到多少加速。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2014-04-27
      • 2020-01-27
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多