awkの基礎・grepとの違いについて | 瀬戸内の雲のように

awkの基礎・grepとの違いについて

Posted: 2018-09-18


スポンサーリンク

目次

背景

サーバエンジニアをやっている限り、トラブルというのは付き物です。
そしてトラブルの原因を見つけたり修復したりするためにはログファイルを加工し効率よく確認することが重要です。

今回はそんな時にとても役に立つ awk の使い方の基本を記事にしたいと思います。

 

awkとは

awkとはスクリプト言語の一種で、テキスト処理に優れているという特徴を持っています。
用途として一番わかりやすいのは行の中の特定のカラムを抜き出す場面だと思います。

使い方はいたって簡単で、

  • ファイルから読み込む
  • 標準入力からパイプで渡す

ということをすればすぐに使えます。実際の例をあげてみると

$ echo 'hello world' | awk '{print $1}'
hello

 
というように使うことができます。(上記はパイプで渡しているという例です)

 

awkとgrepの違い

先ほどawkはテキスト処理に優れていると書きましたが、テキスト処理でより身近なのはgrepだと思います。
では、awkとgrepはどのように違うかと言うと(細かいことを言うとものすごく違うのですが)、サーバエンジニアが使う場面での違いとしては

  • grepは文字列が存在する行全体を抜き出す
  • awkは行の中の一部だけ抜き出す(行全体は表示しない)

と言う違いがあります。
(実際にはawkでも全体を表示できますが、よくある使い方としての説明です。)

しかし実際のところ、awkはgrepと組み合わせて使うことが多いと思います。
 

それぞれの使い方

以下のようなファイルがあった時に、

# num.txt
111 222 333
444 555 666
777 888 999

 
grepは

$ grep '1' num.txt
111 222 333

のように、検索文字列に引っかかった行全体が表示されますが、
awkを使う場合には

$ awk '{print $1}' num.txt
111
444
777

 
のように各行の1カラム目だけを表示するような使い方ができます。

 

実際の使用例

ここまでは違いを強調するように説明しましたが、実際のところではawkとgrepは組み合わせて使うことが多いと思います。
例えば以下のようなログファイルがあったとして

# log.txt
Sep 19 00:01:20 connected from 1.2.3.4 method GET
Sep 19 00:01:21 disconnect
Sep 19 00:01:40 connected from 2.3.4.5 method GET
Sep 19 00:01:21 disconnect
Sep 19 00:02:10 connected from 3.4.5.6 method GET
Sep 19 00:02:21 disconnect

 
0時1分に接続があったIPを抽出したい という場合には以下のように実現できます。

$ grep '00:01:' log.txt | grep 'connected' | awk '{print $6}'
1.2.3.4
2.3.4.5

このように、grepの結果をパイプでawkに渡すことで、特定行の特定カラムだけを抽出するということができます。

 
(ちなみに余談ですが、上記はawkだけでも実現できたりします。)

$ awk '$3~/^00:01:/ && $4=="connected"{print $6}' log.txt
1.2.3.4
2.3.4.5

こちらはややこしいのでまた別途。

 

まとめ

以上、awkの簡単な使い方とgrepの違いについてでした。


スポンサーリンク




コメント一覧


コメントを投稿する


お名前


コメント内容





TOP back