ログ集計など、コマンドラインで作業するとき、awk でさらっとワンライナーが書けると捗ることがあります。
本記事で、ユースケースに応じた awk のコマンド実行例を記していきます。主にサーバ運用に従事する方向けの内容になるでしょう。
私自身のユースケースに当てはまらないものは書かないこともありそうです。
何かお気づきの点があればお知らせ下さい。
入門編
指定したフィールドを抽出
% awk '{print $2,$3}' sample.tsv # 2,3列目
-F
オプションで区切り文字を変える
% awk -F, '{print $2,$3}' sample.csv # ,で区切って 2,3列目を出力
基本編
組み込み変数・特殊変数
-
NF
... フィールド数 -
NR
... 行番号 -
$0
... 行全体の文字列
末尾からn番目のフィールドを指定する
$NF
で末尾のフィールド、 $(NF-n)
で末尾から n 番目のフィールドを指定できます。
% awk '{print $1,$(NF-1),$NF}' sample.csv # 1列目と最後の2列を出力
書式指定
printf 書式, 変数1, 変数2, ...
の構文が使えます。
% awk '{printf "%10s %5d\n",$1,$3}' sample.dat
各行の長さを出力
length(string)
関数で改行を含む文字列の長さを取得できるので、これを利用します。
% awk '{print length($0)}' sample.txt
応用例としては、 sort
と組み合わせて長い行から順に出力するということが、簡単にできます。
# 1行が長い順に TOP 10 を行長とともに表示
% awk '{print length($0), $0}' sample.txt | sort -nr | head
# 1行が短い順に TOP 10 を行長とともに表示
% awk '{print length($0), $0}' sample.txt | sort -n | head
集計処理
以下、sample.dat の4つめのフィールドに値が入っているとします。
平均値の算出
% awk '{sum += $4} END {print sum/NR}' sample.dat
最大値の算出
% awk '{if (max<$4) max=$4} END {print max}' sample.dat
連想配列を使ってキーごとに集計
% awk '
{sum_of[$3] += $4} END {for (key in sum_of) {printf "Key: %s, SUM: %d\n", key, sum_of[key]}}
' sample.dat
応用編
指定したフィールド"以外"を出力
#!bash
% echo {1..5} | awk '{$1=$3="";print}'
2 4 5
参考
- The GNU Awk User’s Guide
- awkガナス(4) – 組み込み変数NF(フィールド数) NR(行番号) — SOUM/misc
- awkで末尾から数えてn番目のフィールドを取り出す。 - Qiita
- "awk" 指定した列を除いて表示する @LCD -Linux Command Dictionary-|Replog!株式会社レップワンスタッフによるブログです
- Let's AWK
- awk の連想配列 — WTOPIA v1.0 documentation
本稿は、自分の過去のブログ記事から加筆修正してまとめ直しました: