用于日志分析的shell脚本

时间:2013-02-14 08:52:55

标签: linux shell

我在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?任何解决此问题的建议。

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

3 个答案:

答案 0 :(得分:0)

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

或者你可以直接使用没有grep的awk。

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

答案 1 :(得分:0)

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”的脚本

答案 2 :(得分:0)

#% 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