logo
Published on

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

Authors

Linuxコマンドライン言語のBash上で動作するawkコマンドのチートシート的ななにか。簡単なレファレンスから外部コマンド実行といった高度なところまで紹介します。

なお、レコードとカラムの概念はExcelの表と同じです。

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

なお、awkでは以下のような変数が用意されています。

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

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

以下は、grep -Eで正規表現に当てはまる行を出力する例です。

awk '/regex/'

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

以下の例では、第一カラムが正規表現に当てはまる行を出力しています。

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

以下は、dfコマンドの出力結果から、第一カラムが正規表現に当てはまる行を出力しています。

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 }}'

以下の例は、第四カラムの数値をpythonを利用して100倍にする例です。

$ 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}'

こちらも参考にどうぞ。