webサーバのメモリリークを調べようとしてコマンド打った(2007/9/26修正)
$ ps axu | awk '$11 ~ /httpd/ {print $6, $2}' | sort -n | tail
カラムの並びはRedhat系のOSのpsコマンドの仕様に依存してる。もしpsコマンドの仕様が異なる環境でカラムの順番が違うことがあったら、、、(カラム名も違うだろうけど)、、
ps axu | awk ' NR == 1 { for (i = 1; i <= NF ; i++ ) { if ($i == "PID") pidcol = i ; if ($i == "RSS") rsscol = i; if ($i == "COMMAND") cmdcol = i } if ( (cmdcol < pidcol) || (cmdcol < rsscol) ) { print "ERROR: command line shall not be before PID nor RSS column" ; exit } } { for (j = 1; j <= NF; j++) { if ( j == pidcol) p = $j ; if (j == rsscol) r = $j; if ( (j == cmdcol) && ( $j ~ /httpd/) ) print r,p } }' | sort -n | tail
うーん、長い。
$[colname]という記法は許されるのかな?
テストしてみよう。
$ ps axu | awk 'BEGIN { col1 = 1} {print $[col1]}' | head awk: BEGIN { col1 = 1} {print $[col1]} awk: ^ syntax error $ ps axu | awk 'BEGIN { col1 = 1} {print $col1}' | head USER root (以下略)
なるほど、$colnameでよいのか($colnumが意味的に正しいか,,)。、、って$jとかで使ってたでしょ>俺
あとは、カラム名は引数で指定したい、ということがあるのだが、awkの引数は処理対象のファイル名、もしくはname=valueの形、という規約があるので、次のようなコードを書いても引数が美しくない。
$ ps axu | awk ' NR == 1 { for (i = 1; i <= NF ; i++ ) { for (v = 1; v < (ARGC - 1); v++ ) { if (sprintf("select_name=%s", $i) == ARGV[v]) { col[v] = i coln[v] = $i } if (sprintf("search_name=%s", $i) == ARGV[v]) cmdcol = i } } line = "" for (v = 1; v <= (ARGC - 3); v++) { line = sprintf("%s %s", line, coln[v]) } print line print "----------------------------------" } NR > 1 { if ($cmdcol ~ search_txt ) { line = "" for (v = 1; v <= (ARGC - 3); v++ ) { c = col[v] line = sprintf("%s %s", line, $c) } print line } } ' select_name=RSS select_name=PID search_name=COMMAND search_txt=apache | sort -n
ああ、仕事しなくちゃ(汗