プログラミング

Bashコマンドawkチートシート

Linuxコマンドライン言語のBash上で動作する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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です