映射查询字符串参数出现

时间:2017-08-07 19:17:00

标签: linux bash grep uniq

我有一个包含许多查询字符串的日志文件,例如:

param1=val1&param2=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&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'
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论坛是否更适合这个问题

1 个答案:

答案 0 :(得分:1)

您可以使用此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参数的频率并打印=分隔的输出。< / LI>
  • sort命令使用=作为分隔符对field2和field1(数字)进行反向排序
  • sed命令用空格替换第一个=以获取格式化的输出。