AWK アドベントカレンダー1日目
AWK(オーク)コマンドとは?
行と列(もしくは行のみ)でできたテキストデータを処理するためのコマンドです。
例えば、次のデータをawkコマンドで処理するとこんな結果になります。
$ cat fileA
aaa
bbb
ccc
aaa
ccc
bbb
ddd
// 重複を削除
$ cat fileA | awk -F'\n' '!a[$0]++'
aaa
bbb
ccc
ddd
初めてawkを見る人が見ても何がなんだかわからないかもしれませんが、とにかく受けとたデータを行と列(上記の例だと列は使ってませんが)からできているテキストデータを一行づつ読み込んで、後ろに書いてある式を使っていい感じに加工してくれるコマンドとおぼえていただければ大丈夫かと思います。
シェル芸勉強会に出るためには必須のコマンドなので、将来シェル芸人になりたい人は頑張って覚えましょう。
私は知らないまま行ってぼこぼこにされました
なお、awkはプログラミング言語ですので、ターミナルで打つだけではなくてもちろん実行ファイルにして実行することもできます。
awkコマンドの基本文法
awkの基本文法は、
$ awk 'パターン アクション'
または
$ awk <オプション> 'パターン アクション'
というような感じです。
実際に使うときにはawkに文字列を渡す必要があるので、次のような使い方を良くします。
$ awk 'パターン アクション' 対象文字列のファイル
$ awk 'パターン アクション' < 対象文字列のファイル
$ cat 対象文字列のファイル | awk 'パターン アクション'
$ echo "対象文字列" | awk 'パターン アクション'
$ <適当なコマンド> | awk 'パターン アクション'
パターンとアクションとは?
パターンとアクションについて解説しますが、感のいい人だったら次の使い方を見ただけでなんとなくパターンとアクションがどんなことをしているかわかると思います。
$ cat fileA
aaaaaaaaaaaaaaaaatest
bbbbbbbbbbbbbbbbbbbbb
testccccccccccccccccc
ddddddddddddddddddddd
// testが含まれている行だけを出力
$ cat fileA | awk '/test/ {print $0}'
aaaaaaaaaaaaaaaaatest
testccccccccccccccccc
結果を見てわかる通り、「test」という文字列の行が、出力されていますね。
これを見てもう俺はawk完璧に理解した!!って人は飛ばしていただいて大丈夫ですが、そうでない方はパターンとアクションを理解するために処理を分解してみましょう。
処理を分解
さっきの処理は次のようなことを行っていました。
1.fileAの内容がawkに渡される
2.awkが1行目の「aaaaaaaaaaaaaaaaatest」を読み込む
3.読み込んだ行をつかってパターンを評価する(/hoge/は、正規表現にマッチしているか調べる)
4.trueなのでアクションが実行される
5.「aaaaaaaaaaaaaaaaatest」が出力される($0は行の情報すべてを指す)
→1行目終了
6.awkが1行目の「bbbbbbbbbbbbbbbbbbbbb」を読み込む
7.読み込んだ行をつかってパターンを評価する
8.falseなのでアクションが実行されない
9.「bbbbbbbbbbbbbbbbbbbbb」が出力される
→2行目終了
→3行目処理...
→4行目処理...
あれ、これってどこかで見たことある、、、
そう、これって簡単に言うと一行ごとにif文を回してくれますよっていうことです。
同じ処理をPHPで書いてあげるとこんな感じですかね。
// 正規表現にマッチした行を出力する
<?php
// ファイルを読み込み
$file = fopen("list.txt", "r");
if($file){
// ファイルを一行づつ処理
while ($line = fgets($file)) {
// 正規表現にmatchしたら出力
if (preg_match("/test/", $line)) {
echo $line."\n";
}
}
}
まとめ
awkコマンドってこんな処理してるんだへーってなって興味を持ってくださる方がいらっしゃると幸いです。
私もまだまだawkコマンド使いにはなれてないので、今回のアドベントカレンダーで一歩でもawkerになれるように努力致します。
本日は読んでくださってありがとうございました。