gpt4 book ai didi

regex - 如何使用 awk 正则表达式按查询字符串值排序?

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:50 24 4
gpt4 key购买 nike

我有一个包含示例行的日志文件:

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 个之后的所有列,这不是必需的。我究竟做错了什么?如有任何建议,请。

最佳答案

使用您的 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"]对输出进行排序。如果没有,请删除该行并通过管道连接到 sort -rn带有适当的参数。您不需要中间| sort | uniq -c无论哪种方式。

关于regex - 如何使用 awk 正则表达式按查询字符串值排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com