0

TL;博士

这个想法是:

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

我想计算输出中每个块的实例数 -> sockstat | awk '{打印 $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 结构,但这似乎适用于文件,我无法让它直接从上述命令中提取输入。

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

4

3 回答 3

1
sockstat | awk '{print $2 "@" $3}' | grep -v '^PROCESS@PID' | sort | uniq -c | awk '{print $1}'
于 2012-12-15T06:01:46.180 回答
0

You could simplify your command:

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

If you just want the counts, simply edit the print statement:

sockstat | awk 'NR>1 { a[$2 "@" $3]++ } END { for (i in a) print a[i] }'
于 2012-12-15T11:19:41.970 回答
0

How about this?

sockstat | grep -v PROCESS | awk '{key=$2"@"$3; count[key]++} END {for ( key in count ) { print key" "count[key]; } }'
于 2012-12-15T05:54:12.610 回答