見出し画像

awk - パターンマッチング事始め

UNIXというOSの一番素晴らしいところは、データを可能な限りテキストという枠組みに収め、これをストリームという一般化された入出力で扱えるようにしたところで、リダイレクトやパイプを駆使してデータを加工できる仕組みを用意したことです。

それまでの世界では、データごとに決められたデータ形式というのが決められていて、それぞれの形式ごとに処理するプログラムを用意して使うという方法だったのに比べると、処理の手順が一般化出来て過去に作った処理を使い回すのも容易です。

ということでデータは単なるテキストなので、それを文字列のパターンで解釈して処理をするという方法が採られるわけです。そんな解釈と処理を書くには、それが得意なプログラミング言語が必要となり、そのひとつが今回紹介するawkです。

AWK

基本的にはテキストを1行ずつ読み込み、行の中を空白で区切られた文字列の集まりとして解釈して、それぞれの文字列に対して処理を書いていくというスタイルです。文字列に対して、どのような形式であれば、どんな処理をするかという形でパターンごとにアクションと呼ばれる処理を記述します。

このパターンはお馴染みの正規表現を駆使するもので、アクションの部分で、これもお馴染みのスクリプト言語のようなコードを書いていくわけです。

パターン1 {
アクション1
}
パターン2 {
アクション2
}

もちろん関数も作れますが、変数は原則すべてグローバルなので、いちいち引き数で渡す手間が省ける反面、アリ物の関数を再利用するには、ちょっと危ない処理系です(原則には例外があるので、いろいろなテクはある)。

awkの使いかた

特定の場所にある特定の文字列を抜き出して、新しいファイルを作ったり、ソースコードのコメントからドキュメントを作ろうとするにはなかなか役に立ちます。ログからの特定のイベントの抽出とかにもよく使った覚えがあります。

awkの使い方(メモ)

パターンマッチングは慣れが必要ですし、あまり複雑な書き方をすると、自分でも後から何がしたかったのかわからなくなってしまうことすらあるので、過度に複雑なパターンは書かないほうが良いのですが、元になるデータの仕様が変わったりして、都度、それに合わせてパターンを追従させていくと、いつの間にやら何だかわけのわからないマッチングになってしまうこともあったりします。

とほほのAWK入門

そう言えばawkが日本語に対応した時に、マルチバイトに対するパターンマッチングの記述にちょっとした混乱があって、なかなか苦労した遠い記憶もあります。これはこのコマンドに限った話ではなくてシェルでも同じ問題があったのですが、[]で範囲を指定するといっても、その並びが同じとは限らないですしね。

awk コマンド

https://www.ibm.com/docs/ja/aix/7.1?topic=awk-command

このコマンドはあまりに奥が深いので、WEBで調べてササッと書いてみると言うにはハードルがありそうです。じっくり取り組むのであれば書籍に頼るのも良い選択です。以前に書いたsedと合わせて解説されている以下の本がオススメです。

sed & awkプログラミング 改訂版 (A nutshell handbook)

なお、sedの記事はこちら

sed - テキストエディタの操作で記述するコマンド

ヘッダ画像は、以下のものを使わせていただきました。なおnoteのヘッダ画像がアニメgifに対応していないため、アニメーションの最後をpngに変換してあります。
https://commons.wikimedia.org/wiki/File:Awk-example-usage-gimp.gif
VectorVoyager - 投稿者自身による著作物, CC 表示-継承 4.0, https://commons.wikimedia.org/w/index.php?curid=115360616による

#プログラミング言語 #awk #スクリプト言語 #パターンマッチング

この記事が気に入ったらサポートをしてみませんか?