awkコマンドの使い方について


どうもこんにちは。
システムソリューション部の岡崎です。
今回はログの確認の際に併せて使うコマンドawkについて記入します。

awkコマンドとは

スペースや特定の文字で区切られた複数行のデータを処理する際に
特定の列のデータのみ出力したり、合計値を出したりできるコマンドです。

awk '{print$[出力したい列数];}'

例えば、以下のようなファイルがあります。

test.txt
1 2 3 5
1 2 3 6
1 2 3 7
1 2 3 8

1列目のみ表示したい場合は以下のようにすることで出力することができる。

cat test.txt | awk '{print$1;}'
1
1
1
1

使い方について

任意の文字を区切り文字として使用する場合

awk -F [区切り文字] '{print$1;}'
  • 使用例
  • 2列目のみ表示

    sed -e 's/ /:/g' test.txt | awk -F ':' '{print$2;}'
    2
    2
    2
    2
    

    行番号を出力する場合

    awk '{print NR $1;}'
    
  • 使用例
  • 3列目のみ表示

    sed -e 's/ /:/g' test.txt | awk -F ':' '{print NR $3;}'
    13
    23
    33
    43
    

    ただこれだとわかりずらいので以下のようにする

    sed -e 's/ /:/g' test.txt | awk -F ':' '{print NR " " $3;}'
    1 3
    2 3
    3 3
    4 3
    

    特定の列が特定の文字列となっている行を出力する場合

    awk '$1==[任意の文字]'
    
  • 使用例
  • 4行目が5のみ表示

    sed -e 's/ /:/g' test.txt | awk -F ':' '$4=="5" {print NR " " $4;}'
    1 5
    

    逆の場合は

    sed -e 's/ /:/g' test.txt | awk -F ':' '$4!="5" {print NR " " $4;}'
    2 6
    3 7
    4 8
    

    特定の列の数字を合計する場合

    awk '{sum+=$1;}END{print sum;}'
    
  • 使用例
  • 1行目の合計を表示

    sed -e 's/ /:/g' test.txt | awk -F ':' '{sum+=$1;}END{print sum;}'
    4
    

    平均値の場合は

    sed -e 's/ /:/g' test.txt | awk -F ':' '{sum+=$1;}END{print sum/NR;}'
    1
    

    まとめ

    運用にてログファイルを開くことはかなり多いと思いますが
    ファイルを整形して開くとより見やすくなり、
    エラーやアクセスの集計などかなり効率的に行えると思います。
    今回のawkとほかのコマンドと併せて日々の運用に役立てると運用の効率化ができると思います。


この記事をかいた人

About the author