LoginSignup
33
40

More than 5 years have passed since last update.

AWK によるテキストのワンライナー処理クックブック集

Last updated at Posted at 2015-05-07

ログ集計など、コマンドラインで作業するとき、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

参考

本稿は、自分の過去のブログ記事から加筆修正してまとめ直しました:

33
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
40