(shell) awkチートシート [外部コマンド実行]

    >


単語:
レコード … 行。上から下
カラム … 列。左から右

変数:
FS セパレーター(デフォルトでは空白スペース)
NF カラムの合計数
NR レコードの合計数
$1 第一カラム
$2 第二カラム



正規表現に当てはまる行を出力 (=grep -E)

awk '/regex/'

第一カラムが正規表現に当てはまる行を出力

awk '{if ($1 ~ /regex/){print $1,$2,$3,$4}}'

e.g. df | awk '{if ($1 ~ /\w{1,2}:/){print $1,$2,$3}}'

pythonを実行 / 外部コマンド実行

(第四カラムの数値をpythonを利用して100倍にする例)

awk '{"python -c \"print("$4"*100)\" | perl -pe 'chomp'" |& getline $11 ; print "The 4th column was being x100:"$11 }}'

e.g.

$ df 2>/dev/null | tail -3
E:             2930133932  381876300 2548257632  14% /mnt/e
G:             2930133932 1545875952 1384257980  53% /mnt/g
H:             2930134012 2625853000  304281012  90% /mnt/h

$ df 2>/dev/null | tail -3 | awk '{if ($1 ~ /\w{1}:/){"python -c \"print("$4"/1000/1000)\" | perl -pe 'chomp'" |& getline $11 ; print $1,$11"(GB)",$5,$6}}'
E: 2548(GB) 14% /mnt/e
G: 1384(GB) 53% /mnt/g
H: 304(GB) 90% /mnt/h

キモ:
* $1などを引数などコマンドに渡したい場合、""で囲わないようにしてやる。
* 大抵の出力は\n改行が入るので、perlなどでchompしてやる。
* |& getline $11で、コマンド出力を$11に代入してやる事が可能。これをしないと、$0(?)として処理されるらしく、出力の0番目のカラムとしてカラムの先頭に出力が挿入される。
* 代入処理をする場合system()は使えない(?)みたい

awk – Assigning system command’s output to variable – Stack Overflow

該当の全てのプロセスをkill

(npmを含むプロセスをkillして実行結果を出力)

ps aux | grep "npm" | awk '{"kill -9 "$2 |& getline $11 ; print $11}'

(関数)

# killp(){
#     ps aux | grep "$1" | awk '{"kill -9 "\\$2 |& getline \\$11 ; print \\$11}'
# }
killp(){
    ps aux | grep "$1" | awk '{"kill -9 "$2 |& getline $11 ; print $11}'
}

該当の全てのバックグラウンドプロセスをkill

(webpack-devを含むものをkill )

ps S | awk '/webpack-dev/' | awk '{"kill -9 "$1 |& getline $11 ; print $11}'


こちらも参考にどうぞ。

AWK Cheat Sheet | ShortcutFoo
AWK cheatsheet



お困りですか?この記事で紹介していることをマンツーマンで指導、解説、代行します。まずはお気軽にお問い合わせください。


Close Menu