3

内で実行されるコマンドにawk変数を渡すにはどうすればよいですか?bashawk

特定のプロセスごとに実行中のスレッドの合計を計算するために awk を使用していますが、各 pid を使用して/proc/$pidファイルシステムにアクセスしたいと考えています。

以下の破線でマークされた行は、存在しないため、正しくありませ$pidん。

pid実行するシェルコマンドにawk 変数をエクスポートするにはどうすればよいawkですか?

(読みやすくするために改行が追加されています)

$ ps -ALf | grep $PROC | grep -v grep | \         # get each pid
    awk '{threads[$2]+=1} END \                   # count num threads per pid
         { \
           for (pid in threads) \
              "cat /proc/$pid/cwd"|getline cwd; \ # get 'cwd' (**broken**)
               print cwd ": " threads[pid] \      # display 'cwd' and num threads
         }'
4

3 に答える 3

4

/proc/$pid/cwdディレクトリへのシンボリックリンクであることを cat することはできません。シンボリック リンクを解決する 1 つの方法はreadlink、coreutils を使用することです。

TrueYBarmerのビットを使用した実際の例を次に示します。

ps -C $PROC | 
awk '{ t[$1] } END { for(p in t) { "readlink -f /proc/" p "/cwd" | getline c; print c } }'

注意すべき点がいくつかあります。

  • パイプは行継続文字を兼ねています。
  • 配列エントリを参照して作成するだけで十分です ( t[$1])。
于 2013-05-16T10:47:35.803 に答える
2

これをリンクせずにですべてを行うことができます:grep

% ps -ALf | awk -v proc="${PROC}" '
$0 ~ proc && !/awk/ {
    threads[$2] += 1
}
END {
    for (pid in threads) {
        "readlink /proc/" pid "/cwd" | getline dir
        printf "%d: %d %s\n", pid,  threads[pid], dir
        dir=""
    }
}'

注目に値するいくつかのこと:

  • -v proc="${PROC}"${PROC}環境変数を変数に割り当てawkます。proc
  • "readlink /proc/" pid "/cwd"3 つの文字列を連結します。に連結演算子は必要ありませんawk
  • dir=""dir次回のループでシンボリックリンクが読み取れない場合に備えて、変数をリセットします。
于 2013-05-16T11:03:05.200 に答える