如何计算awk中输出的实例数?

时间:2012-12-15 05:08:00

标签: linux bash awk

TL; DR

这个想法是:

awk '{
    IP[$1]++;
  }
  END {
    for(var in IP) 
      print IP[var]
  }
}' getline < sockstat | awk '{print $2 "@" $3}' | grep -v '^PROCESS@PID'

我想计算输出中每个块的实例数 - &gt; sockstat | awk'{print $ 2“@”$ 3}'| grep -v'^ PROCESS @ PID'

看起来像:

ubuntu-geoip-pr@2382
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
rhythmbox@4759
rhythmbox@4759
rhythmbox@4759

最后,我希望输出为:

1
8
3

这对应于先前输出中每个项目的出现次数。

完整问题:

sockstat 命令输出localhost的某些网络统计信息。我首先从输出(分别为PROCESS和PID)的第二和第三列打印出一个单键,格式为PROCESS @ PID。然后,我想从该输出计算每个唯一键的频率。一种方法是使用awk getline结构,但这似乎适用于文件,我无法直接从上面的命令拉取输入。

我不想使用临时文件,因为这会消除解决方案的优雅。

3 个答案:

答案 0 :(得分:1)

sockstat | awk '{print $2 "@" $3}' | grep -v '^PROCESS@PID' | sort | uniq -c | awk '{print $1}'

答案 1 :(得分:0)

这个怎么样?

sockstat | grep -v PROCESS | awk '{key=$2"@"$3; count[key]++} END {for ( key in count ) { print key" "count[key]; } }'

答案 2 :(得分:0)

您可以简化命令:

sockstat | awk 'NR>1 { a[$2 "@" $3]++ } END { for (i in a) print a[i], i }'

如果您只想要计数,只需编辑打印语句:

sockstat | awk 'NR>1 { a[$2 "@" $3]++ } END { for (i in a) print a[i] }'