【问题标题】:shell script for log analysis用于日志分析的 shell 脚本
【发布时间】:2013-02-14 08:52:54
【问题描述】:

我在我的 linux 服务器上以特定格式获取日志

id \t IP \t login-id \t login-error Code \t attempts

我想知道用户可能遇到的所有可能的登录错误代码。

示例文件为:

123  10.12.34.234 anshul     11 1
432  10.12.34.234 ra     11 2
342  10.12.34.234 anshul     12 1
445  10.12.34.234 yahoo  3  1

输出应该是:

anshul: 11,12

我试过了:

cat aaa | sort +2 -3 | grep anshul | awk -F"\t" {' print $4'}

这会打印出来

11

12

但我希望输出格式为anshul: 11,12

我们可以将值存储在一些变量中并根据需要显示吗? 这段代码的问题是它是否捕获了所有的 anshul,无论是 anshulg、anshuln 还是 anshulp?任何解决此问题的建议。

我已经在登录时进行了排序,只是为了验证我得到的数据是否正确,因为所有唯一名称都会被排序为单个块。

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    1) 简单的解决方案,但最后你会得到额外的,

    cat aaa | grep "anshul" | awk '{print $4}' | tr '\n' ','
    

    输出:11,12,

    2) 没有额外的,:

    tmp=`cat aaa | grep "anshul" | awk '{print $4}' | tr '\n' ','`
    echo ${tmp%?}
    

    输出:11,12

    当然,您可以轻松地将其转换为以用户名作为参数并输出类似“user: anshul error(s): 11,12”的脚本

    【讨论】:

    • catgrep 都是不必要的:使用 < aaa awk '/anshul/{print $4}
    • 你也可以去掉tr,但是这样代码可读性更好。此问题未提及性能。
    【解决方案2】:
    #% cat t
    123  10.12.34.234 anshul     11 1
    432  10.12.34.234 ra     11 2
    342  10.12.34.234 anshul     12 1
    445  10.12.34.234 yahoo  3  1
    

    一行 Perl。

     perl -ane 'BEGIN{$x='anshul';}push @{$X{@F[2]}}, $F[3];END{print "$x: ",join(",",@{$X{$x}}),"\n";}' < t
    

    给予:

    anshul: 11,12
    

    【讨论】:

      【解决方案3】:
      awk '{a[$3]=a[$3]","$4;next}END{for(i in a)print i,substr(a[i],2)}' <your_file>|grep anshul
      

      或者你可以直接使用 awk 而不用 grep。

      awk '{a[$3]=a[$3]","$4;next}END{print "anshul",substr(a["anshul"],2)}' <your_file>
      

      测试如下:

      > cat temp
      123  10.12.34.234 anshul     11 1
      432  10.12.34.234 ra     11 2
      342  10.12.34.234 anshul     12 1
      445  10.12.34.234 yahoo  3  1
      
      > awk '{a[$3]=a[$3]","$4;next}END{for(i in a)print i,substr(a[i],2)}' temp
      anshul 11,12
      ra 11
      yahoo 3
      
      > awk '{a[$3]=a[$3]","$4;next}END{for(i in a)print i,substr(a[i],2)}' temp|grep anshul
      anshul 11,12
      > 
      > awk '{a[$3]=a[$3]","$4;next}END{print "anshul",substr(a["anshul"],2)}' temp
      anshul 11,12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-27
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多