スポンサーリンク
私がエンジニアになりたてだった頃、先輩から「awkが使えるようになって一人前だ」ということを言われました。
今にして思えばawkができるだけでは一人前と呼べない気もしますが、awkを使いこなせるようになれば作業効率化に効果があるのは間違いありません。
ということで、今回は初心者エンジニアの方に
・awkとは何か
・何ができるのか
・どうやって使うのか
ということをわかりやすく説明していきたいと思います。
早速ですがawkとは
プログラミング言語の一つ。テキストファイルの加工・抽出等の処理が得意な言語。
です。
つまりawkとはpythonやrubyと同じような位置づけのものだと思って頂ければ良いです。
オーク
と読みます。
ちなみにawkとは開発者3人の名前の頭文字を取って付けられたらしいです。
上にも少し書きましたが、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とどう違うのか? ということです。
次はそれを理解するために、以下のように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 '{ 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とは
というようなものです。
スポンサーリンク
2020/12/23 06:49:30
Medicinali Per Disfunzione Erettile usacybes generic cialis from india glicky Amoxicillin 50mg Bmp 193