awkって何?何ができるの?をできる限りわかりやすく伝えたい | 瀬戸内の雲のように

awkって何?何ができるの?をできる限りわかりやすく伝えたい

Posted: 2019-01-21


スポンサーリンク

目次

はじめに

私がエンジニアになりたてだった頃、先輩から「awkが使えるようになって一人前だ」ということを言われました。
今にして思えばawkができるだけでは一人前と呼べない気もしますが、awkを使いこなせるようになれば作業効率化に効果があるのは間違いありません。

ということで、今回は初心者エンジニアの方に

・awkとは何か
・何ができるのか
・どうやって使うのか

ということをわかりやすく説明していきたいと思います。

 

awkとは

早速ですがawkとは

プログラミング言語の一つ。テキストファイルの加工・抽出等の処理が得意な言語。

です。

つまりawkとはpythonやrubyと同じような位置づけのものだと思って頂ければ良いです。

 

awkの読み方

オーク と読みます。
ちなみにawkとは開発者3人の名前の頭文字を取って付けられたらしいです。

  

awkは何ができるのか

上にも少し書きましたが、awkは テキストファイルの加工・抽出等の処理が得意な言語。 です。
サーバエンジニアにおける具体的な利用シーンは ログファイルの解析 等だと思います。

利用例

具体的な例を見てみましょう。

以下のようなログがあるとします

# cat connect.log
Dec 30 10:01:30   try  1.2.3.4 success
Dec 30 10:01:31   connected  1.2.3.4
Dec 30 10:01:40   try  2.3.4.5  failed   access_not_allowed
Dec 30 10:01:50   try  3.4.5.6 success
Dec 30 10:01:51   connected  3.4.5.6
Dec 30 10:02:30   disconnected  1.2.3.4
Dec 30 10:03:30   disconnected  3.4.5.6

(内容は適当です。何かのシステムへの接続ログだと思ってください)

 
例えば、この中から 接続に成功したログIPアドレスだけ を抽出したい ということが可能です。

コマンド

$ cat connect.log | awk '$4=="connected"{ print $5}'

 
結果

1.2.3.4
3.4.5.6

 

awkとgrepとの違い

さて、awkに関するよくある疑問は grepとどう違うのか? ということです。
次はそれを理解するために、以下のようにgrepと組み合わせてコマンドを実行してみます。

コマンド

$ cat connect.log | grep ' connected' | awk '{print $5}'

いかがでしょうか。先程と同じ結果が得られたと思います。

 
次に、以下のコマンドを実行してみてください。

コマンド

cat connect.log | grep ' connected'

結果

Dec 30 10:01:31   connected  1.2.3.4
Dec 30 10:01:51   connected  3.4.5.6

今度は接続ログがそのまま(1行まるごと)表示されています。

 
このように、 grepは
特定条件の(ある文字列を含む等の)行を1行全て表示するコマンド

と言えます。

 
一方でawkは

特定条件の行の抽出が可能で、さらに行の中のある部分(カラム)だけを抜き出すことができるコマンド

と言えるかと思います。
(注: これはわかりやすく説明するため簡略化して説明しています。実際にはawkはもっと色々できます。)

 
余談ですが、「じゃあgrepは不要なのか?」というとそういうわけではありません。
単に行を抽出するだけであればgrepのほうがコマンドの記述量が少なく、オプションも豊富です。

経験上、awkを使う場合は複雑な条件での抽出を行う場合であり、単にログを見たいだけであればgrepで十分なことが多いです。

 

awkはどうやって使うのか?

先程少し例を出しましたが、基本的なawkの使い方を説明します。

コマンドラインでの実行

まずawkはプログラミング言語でありながら コマンドのように実行できる のが特徴の一つです。
(他の言語でもコマンドラインで実行できますが、awkは他の言語に比べて直感的でわかりやすいです)

コマンドの構文

基本的な構文は以下のようになります。

awk '{ "やりたい内容" }'

 
この "やりたい内容" という部分では色々なことができるのですが、 あるカラムを表示したい という用途であれば以下のようになります。

awk '{ print カラム番号 }'

 
ちなみにカラム番号は $番号 という記述になります。1カラム目であれば $1 。ちなみに $0 は行全体を表します。

$ echo 'a b c d e' | awk '{print $1}'
a

$ echo 'a b c d e' | awk '{print $2}'
b

$ echo 'a b c d e' | awk '{print $0}'
a b c d e

 

実行方法①: 標準入力から読み込む

先程の例と同じです。パイプでつなげて実行します。

コマンド

$ echo 'aaa bbb' | awk '{print $1}'

結果

aaa

 

実行方法②: ファイルから読み込む

awkコマンドだけで実行することも可能です。先程のログファイルの例は以下のように書き換えられます。

コマンド

$ awk '$4=="connected"{print $5}' connect.log

結果

1.2.3.4
3.4.5.6

 

まとめ

ということでawkについてのまとめです。awkとは

 

  • プログラミング言語の一種
  • テキストファイルの処理が得意
  • コマンドのように実行できる
  • grepと比較して複雑なことができるが、記述も複雑

 
というようなものです。


スポンサーリンク




コメント一覧


コメントを投稿する


お名前


コメント内容





TOP back