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

ああ、仕事しなくちゃ(汗