映射查询字符串参数出现
map query string parameter occurrences
我有一个包含许多查询字符串的日志文件,例如:
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=100
我想计算每个参数的唯一值
我尝试用新行替换“&”,使用以下命令排序并获取不同的值
tr '&' '\n' | sort | uniq -c | sort -nr
但它计算了所有参数,我需要它们按键排序,例如,当前输出:
2 width=1440
13 width=480
3 width=540
9 param1=3
8 param2=4
7 param1=2
请求的输出:
13 width=480
3 width=540
2 width=1440
..
9 param1=3
7 param1=2
..
8 param2=4
更新,更好的例子:
$ cat test1.txt
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=100
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=100
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=300
param1=val2¶m2=asdf&p3=fgh3&p4=j3kl&width=200
$ cat test1.txt | tr '&' '\n'
param1=val1
param2=asd
p3=fgh
p4=jkl
width=100
param1=val1
param2=asd
p3=fgh
p4=jkl
width=100
param1=val1
param2=asd
p3=fgh
p4=jkl
width=300
param1=val2
param2=asdf
p3=fgh3
p4=j3kl
width=200
$ cat test1.txt | tr '&' '\n' | sort | uniq -c | sort -nr
3 param2=asd
3 param1=val1
3 p4=jkl
3 p3=fgh
2 width=100
1 width=300
1 width=200
1 param2=asdf
1 param1=val2
1 p4=j3kl
1 p3=fgh3
预期输出:
按参数键分组
3 param1=val1
1 param1=val2
..
2 width=100
1 width=300
1 width=200
...
3 param2=asd
1 param2=asdf
...
3 p4=jkl
1 p4=j3kl
...
3 p3=fgh
1 p3=fgh3
无法确定 unix 论坛是否更适合这个问题
您可以使用此 awk + sort + sed
命令来执行此操作:
awk -F '&' -v OFS='=' '{for (i=1; i<=NF; i++) freq[$i]++}
END{for (i in freq) print freq[i], i}' file |
sort -t= -k2,2r -k1,1nr |
sed 's/=/ /'
2 width=100
1 width=200
1 width=300
3 param2=asd
1 param2=asdf
3 param1=val1
1 param1=val2
3 p4=jkl
1 p4=j3kl
3 p3=fgh
1 p3=fgh3
awk
命令将字段分隔符设置为 &
并将输出字段分隔符设置为 =
并计算每个 name=value
参数的频率并打印 =
分隔输出.
sort
命令使用 =
作为分隔符对 field2 和 field1(数字) 进行反向排序
sed
命令将第一个 =
替换为 space 以获得格式化输出。
我有一个包含许多查询字符串的日志文件,例如:
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=100
我想计算每个参数的唯一值
我尝试用新行替换“&”,使用以下命令排序并获取不同的值
tr '&' '\n' | sort | uniq -c | sort -nr
但它计算了所有参数,我需要它们按键排序,例如,当前输出:
2 width=1440
13 width=480
3 width=540
9 param1=3
8 param2=4
7 param1=2
请求的输出:
13 width=480
3 width=540
2 width=1440
..
9 param1=3
7 param1=2
..
8 param2=4
更新,更好的例子:
$ cat test1.txt
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=100
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=100
param1=val1¶m2=asd&p3=fgh&p4=jkl&width=300
param1=val2¶m2=asdf&p3=fgh3&p4=j3kl&width=200
$ cat test1.txt | tr '&' '\n'
param1=val1
param2=asd
p3=fgh
p4=jkl
width=100
param1=val1
param2=asd
p3=fgh
p4=jkl
width=100
param1=val1
param2=asd
p3=fgh
p4=jkl
width=300
param1=val2
param2=asdf
p3=fgh3
p4=j3kl
width=200
$ cat test1.txt | tr '&' '\n' | sort | uniq -c | sort -nr
3 param2=asd
3 param1=val1
3 p4=jkl
3 p3=fgh
2 width=100
1 width=300
1 width=200
1 param2=asdf
1 param1=val2
1 p4=j3kl
1 p3=fgh3
预期输出: 按参数键分组
3 param1=val1
1 param1=val2
..
2 width=100
1 width=300
1 width=200
...
3 param2=asd
1 param2=asdf
...
3 p4=jkl
1 p4=j3kl
...
3 p3=fgh
1 p3=fgh3
无法确定 unix 论坛是否更适合这个问题
您可以使用此 awk + sort + sed
命令来执行此操作:
awk -F '&' -v OFS='=' '{for (i=1; i<=NF; i++) freq[$i]++}
END{for (i in freq) print freq[i], i}' file |
sort -t= -k2,2r -k1,1nr |
sed 's/=/ /'
2 width=100
1 width=200
1 width=300
3 param2=asd
1 param2=asdf
3 param1=val1
1 param1=val2
3 p4=jkl
1 p4=j3kl
3 p3=fgh
1 p3=fgh3
awk
命令将字段分隔符设置为&
并将输出字段分隔符设置为=
并计算每个name=value
参数的频率并打印=
分隔输出.sort
命令使用=
作为分隔符对 field2 和 field1(数字) 进行反向排序
sed
命令将第一个=
替换为 space 以获得格式化输出。