我的文件有10行:
line one word=bnd0 src=123.456.5.444 dst=123.456.5.35
line two word=bnd1 src=123.456.5.78 dst=123.456.5.35
line three word=bnd1 src=123.456.5.78 dst=123.456.5.35
line four word=bnd0 src=123.456.5.444 dst=123.456.5.35
line five word=bnd0 src=123.456.5.234 dst=123.456.5.35
line six word=bnd0 src=123.456.5.234 dst=123.456.5.35
line seven word=bnd0 src=123.456.5.234 dst=123.456.5.35
line eight word=bnd0 src=123.456.5.775 dst=123.456.5.35
line nine word=bnd0 src=123.456.5.775 dst=123.456.5.35
line ten word=bnd1 src=123.456.5.78 dst=123.456.5.3
我需要计算出现word = bnd0的src ip地址的发生率。 我应该只考虑值为bnd0的行,其他行可以排除。
我的输出应该像
123.456.5.444 - 2
123.456.5.234 - 3
123.456.5.775 - 2
我是Shell脚本的新手。非常感谢您的投入。
答案 0 :(得分:2)
尝试一下:
这是您的文件:
mayankp@mayank:~/$ cat ff.txt
line one word=bnd0 src=123.456.5.444 dst=123.456.5.35
line two word=bnd1 src=123.456.5.78 dst=123.456.5.35
line three word=bnd1 src=123.456.5.78 dst=123.456.5.35
line four word=bnd0 src=123.456.5.444 dst=123.456.5.35
line five word=bnd0 src=123.456.5.234 dst=123.456.5.35
line six word=bnd0 src=123.456.5.234 dst=123.456.5.35
line seven word=bnd0 src=123.456.5.234 dst=123.456.5.35
line eight word=bnd0 src=123.456.5.775 dst=123.456.5.35
line nine word=bnd0 src=123.456.5.775 dst=123.456.5.35
line ten word=bnd1 src=123.456.5.78 dst=123.456.5.3
输出:
mayankp@mayank:~/$ grep 'word=bnd0' ff.txt | awk -F'src=' '{print $2}' | awk -F'dst=' '{print $1}' |uniq -c
2 123.456.5.444
3 123.456.5.234
2 123.456.5.775
您可以使用上面的输出以所需的格式进行打印。
说明:
grep 'word=bnd0' ff.txt
:这将搜索具有word=bnd0
的行,其余行将被排除。
awk -F'src=' '{print $2}'
:此awk命令将基于src=
作为分隔符分割以上各行,并选择src=
之后的内容。
awk -F'dst=' '{print $1}'
:此awk命令将在定界符dst=
上分割,并在dst=
之前选取内容。
因此,现在只剩下所选行的实际ip_addr。
uniq -c
:将从上述输出中仅找到唯一的行,并打印出重复项的数量。