【发布时间】:2012-12-15 05:07:59
【问题描述】:
TL;DR
想法是:
awk '{
IP[$1]++;
}
END {
for(var in IP)
print IP[var]
}
}' getline < sockstat | awk '{print $2 "@" $3}' | grep -v '^PROCESS@PID'
我想计算输出中每个块的实例数 -> 袜子统计 | 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 结构,但这似乎适用于文件,我无法让它直接从上述命令中提取输入。
我不想使用临时文件,因为这会带走解决方案的优雅。
【问题讨论】:
-
如果您提供像
getline这样的文件名,awk将不会读取其标准输入(文件sockstat)。第一个脚本中存在区分大小写的问题(Ip出现两次,IP出现一次)。由于第一个脚本的输出是一个字段,第二个awk脚本不能读取字段 2 和 3。输出中的“块”是什么?您的数据实际上是什么样的?你期望输出什么? -
修复了这个问题。错字,我的错。
-
uniq -c在这里不是更好的解决方案吗? -
你好先生,刚刚解决了整个问题。我不知道
uniq接受了争论。将其添加为文档的答案。