Bash脚本,分析日志文件

时间:2017-06-12 08:12:14

标签: bash awk grep

如果有可能以不是一行格式显示这个,而是bash脚本。它更容易理解,并希望了解如何使用数组和记录字段进行操作。没有Perl,Python等等。

我有日志文件out.log

03:01:29.317    info    process 1   PC1
05:22:42.211    info    process 3   PC2
05:22:42.302    info    process 3   acknowledge
06:09:32.083    info    process 2   PC5
05:12:32.759    ERROR   process 1   acknowledge
07:21:45.112    info    process 22  PC16
08:12:32.300    info    process 19  PC1
09:25:41.000    info    process 19  acknowledge
06:09:35.083    info    process 2   acknowledge
03:01:25.714    info    process 14  PC1
05:12:32.308    info    process 14  acknowledge
05:12:32.309    ERROR   process 22  acknowledge
05:12:32.300    info    process 7   PC1
07:25:41.000    info    process 7   acknowledge

我想找到关于PC1的所有条目,关于PC1的每条记录都有确认记录并且确认我们可以通过进程号字段找到它,它对于PC1和确认是相同的。顺便说一下对于相同的PC1进程号是不同的。 一步一步:

  1. 找到PC1的所有字段并记住进程号
  2. 再次浏览该文件,找到所有连接到PC1的进程号的条目
  3. 如果状态为ERROR打印: 关于它所属的PC1的记录和记录。并按时间对它们进行排序
  4. 如何操作结果字段,例如比较时间?预期结果:

    03:01:29.317    info    process 1   PC1
    05:12:32.759    ERROR   process 1   acknowledge
    

    这是我的所有尝试和结果,对不起长文

    CASE1

    a=($(awk '$5 == "PC1" { print}' out.log))
    echo ${a[@]:0}
    
    03:01:29.317 info process 1 PC1 08:12:32.300 info process 19 PC1 03:01:25.714 info process 14 PC1 05:12:32.300 info process 7 PC1
    

    如果我使用echo $ {a [index]我会打印出所有找到PC1的记录。但看起来它们不是数组而是字符串,因为echo $ {a [0]是第一个字段03:01:29.317 echo $ {a [4]是PC1,而echo $ {a [5] 08:12:32.300与下一条记录相关联的

    当我尝试完成循环时

    a=($(awk '$5 == "PC1" { print $4}' out.log))
    for i in "${a[@]}"
    do
        awk -v search="$i" '$0 ~ search { print}' out.log
    

    完成 它输出所有文件而不进行任何搜索

    案例2

    awk '$5=="PC1" { h[$4]; print; next } $4 in h { print; delete h[$4] }' out.log
    
    03:01:29.317    info    process 1   PC1
    05:12:32.759    ERROR   process 1   acknowledge
    08:12:32.300    info    process 19  PC1
    09:25:41.000    info    process 19  acknowledge
    03:01:25.714    info    process 14  PC1
    05:12:32.308    info    process 14  acknowledge
    05:12:32.300    info    process 7   PC1
    07:25:41.000    info    process 7   acknowledge
    

    它还不错,但知道我不知道如何处理它。我想方式应该是一样的,但我不知道如何实现它。这样的事情 awk' $ 5 ==" PC1" {h [$ 4];打印;下一个} $ 4 in h {print;删除h [$ 4]}' out.log | awk' $ 2 ==" ERROR" {h [$ 4];打印;下一个} $ 4 in h {print;删除h [$ 4]}' out.log 给出

    05:12:32.759    ERROR   process 1   acknowledge
    05:12:32.309    ERROR   process 22  acknowledge
    

    所有错误消息但没有相关的流程消息

    案例3由schorsch312

    grep -w "PC1" out.log | awk '{print $4}' | xargs -i grep -w "process {}" out.log
    

    输出是:

    03:01:29.317    info    process 1   PC1
    05:12:32.759    ERROR   process 1   acknowledge
    08:12:32.300    info    process 19  PC1
    09:25:41.000    info    process 19  acknowledge
    03:01:25.714    info    process 14  PC1
    05:12:32.308    info    process 14  acknowledge
    05:12:32.300    info    process 7   PC1
    07:25:41.000    info    process 7   acknowledge
    

    它也很棒。 和扩展字符串

    grep -w "PC1" out.log | awk '{print $4}' | xargs -i grep -w "process {}" out.log |grep -w "ERROR"| awk '{print $4}' |xargs -i grep -w "process {}" out.log
    

    根据需要提供结果

    03:01:29.317    info    process 1   PC1
    05:12:32.759    ERROR   process 1   acknowledge
    

    但我不喜欢它看起来如何

    我仍然没有任何简单的bash脚本,但我相信它很简单:(

1 个答案:

答案 0 :(得分:0)

我会做以下

 grep -w "PC1" st1 | awk '{print $4}' | xargs -i grep -w "process {}" st1

1。)你在PC1之后哭了 2.)从那个grep你得到使用awk的进程号 3.)你在这个流程编号之后grep,xargs将流程编号放在正确的位置

您可以以相同的方式处理错误案例。