2

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

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

4

3 回答 3

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
于 2013-02-14T22:57:13.080 回答
0
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
于 2013-02-14T09:08:49.020 回答
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”的脚本

于 2013-02-14T09:12:44.530 回答