0

TL; DR

アイデアは:

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

->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コマンドは、ローカルホストのいくつかのネットワーク統計の情報を出力します。最初に、出力の2番目と3番目の列(それぞれPROCESSとPID)から1つのキーをPROCESS@PIDの形式で出力します。次に、その出力から各一意キーの頻度を計算します。これを行う1つの方法は、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

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 に答える
0

コマンドを単純化できます。

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

カウントだけが必要な場合は、printステートメントを編集するだけです。

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