我有一个带有示例行的日志文件:
xxx.xxx.xxx.xxx - - [07/Jun/2015:14:18:39 +0000] "GET /file/?t=70 HTTP/1.1" 200 35 "http://1234.com/p/talk-about-owning-it/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome"
每行的第7列如下所示:
/file/?t=70
/file/?t=4785&k=1
/file/?t=120
/file/?t=95&k=0
/file/?t=120
/file/?t=120&k=0
/file/?t=95&k=1
...
根据包含唯一值t的递减顺序的行数排列输出。
所需的输出:
120 - 3
95 - 2
4785 - 1
70 - 1
...
我正在使用awk,但它没有提供所需的输出:
awk -F'[=&]' '{print $2}' /var/log/nginx/t.access.log | sort | uniq -c | sort -rn
它输出7号后的所有列,这是不需要的。我究竟做错了什么?请提出任何建议。
答案 0 :(得分:2)
使用1个样本输入行:
$ awk '{split($7,a,/[=&]/); print a[2]}' file | sort | uniq -c | sort -rn
1 70
或者如果输入行的其余部分完全遵循那一行的格式:
$ awk -F'[=& ]' '{print $8}' file | sort | uniq -c | sort -rn
1 70
或完全以awk:
$ cat tst.awk
{
split($7,a,/[=&]/)
sum[a[2]]++
}
END {
PROCINFO["sorted_in"] = "@val_num_desc"
for (val in sum) {
print val "\t- " sum[val]
}
}
$ awk -f tst.awk file
70 - 1
或:
$ cat tst.awk
BEGIN { FS="[=& ]" }
{ sum[$8]++ }
END {
PROCINFO["sorted_in"] = "@val_num_desc"
for (val in sum) {
print val "\t- " sum[val]
}
}
$
$ awk -f tst.awk file
70 - 1
上面使用GNU awk 4. *来PROCINFO["sorted_in"]
对输出进行排序。如果没有,请删除该行并使用适当的args管道到sort -rn
。无论如何,您都不需要中间| sort | uniq -c
。
答案 1 :(得分:0)
这应该做的工作:
cat file.dat
xxx.xxx.xxx.xxx - - [07/Jun/2015:14:18:39 +0000] "GET /file/?t=70 HTTP/1.1" 200 35 "http://1234.com/p/talk-about-owning-it/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome"
xxx.xxx.xxx.xxx - - [07/Jun/2015:14:18:39 +0000] "GET /file/?t=70 HTTP/1.1" 200 35 "http://1234.com/p/talk-about-owning-it/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome"
xxx.xxx.xxx.xxx - - [07/Jun/2015:14:18:39 +0000] "GET /file/?t=72 HTTP/1.1" 200 35 "http://1234.com/p/talk-about-owning-it/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome"
awk -F" " 'BEGIN{FS="=|&| "}{print $8}' file.dat | sort | uniq -c | sort -rn
2 70
1 72
说明:我使用了多个分隔符,然后你的字段是8号,只是使用了你的订购代码。
希望有所帮助