循环时无法获取uniq-c



我正在尝试对日志文件进行排序,获得唯一IP地址的总数,并对出现的IP地址进行处理。这是我的第一个命令:

$ grep -B 1 "foobar" ip.log | grep "IP Address" > ip_count.log

输出:

IP Address    : 133.55.39.56
IP Address    : 116.243.70.151
IP Address    : 117.46.13.194
IP Address    : 115.179.82.10
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 13.123.2.123
IP Address    : 33.123.2.123
IP Address    : 33.123.2.123
IP Address    : 33.123.2.123
IP Address    : 33.123.2.123
IP Address    : 33.123.2.123
IP Address    : 33.123.2.123

如果我这样做,我会得到一个正确的计数:

$ awk '{print $4}' ip_count.log | uniq -c
1 133.55.39.56
1 116.243.70.151
1 117.46.13.194
1 115.179.82.10
9 13.123.2.123
6 33.123.2.123

但如果我这样做,我就不会:

$ while read -r line ; do c=$(echo $line | awk '{print $4}' | 
uniq -c | awk '{print $1}') ; if [[ $c -gt 1 ]]; then echo "$line" ; 
fi ; done < ip_count.log
1 133.55.39.56
1 116.243.70.151
1 117.46.13.194
1 115.179.82.10
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 13.123.2.123
1 33.123.2.123
1 33.123.2.123
1 33.123.2.123
1 33.123.2.123
1 33.123.2.123
1 33.123.2.123

我不确定我在循环中做错了什么,所以也许有人可以告诉我。无论如何,可能有更好的方法可以将所有这些组合成一个命令,所以任何提示都将不胜感激,谢谢。

似乎不需要循环:

uniq -c ip_count.log | awk '$1 > 1 { print $1" "$5 }'

当您在循环中读取文件时,它会逐行执行命令。

awk '{print $4}' ip_count.log | uniq -c

在上文中,从stdin读取所有记录并进行处理。

当执行循环while read -r line时,变量$line只包含一条记录,而不是整个文件。

您可以使用关联数组在单个awk命令中执行此操作。

使用awk的替代解决方案

$awk -F':' '{ count=1; a[$2]=a[$2]+count} END {for (i in a) if (a[i]>1 )print i, a[i]} '  ip_count.log
33.123.2.123 6
13.123.2.123 9
$

说明:

-F':'-->我们将自定义字段分隔符设置为:-
count=1;-->将变量初始化为默认值2
a[$2]=a[$2]+count-->创建一个以$2为索引并计数为值的关联数组
END-->等待{ }代码块执行完成
{for (i in a) if (a[i]>1 )print i, a[i]}-->循环遍历数组中的每个值

此外,将排序后的输入传递给uniq命令也是一种很好的做法。

例如:

$echo -e "ananbna"  
a
a
b
a
$echo -e "ananbna"  | uniq -c
2 a
1 b
1 a
$echo -e "ananbna"  | sort | uniq -c
3 a
1 b
$

最新更新