【メモ】AWKについて

AWKについて調べた際のメモおよび「『シェル芸』に効くAWK処方箋」の読書メモです。

  • マニュアルはここ(あとで読む)
  • 【 awk 】コマンド(基本編)――テキストの加工とパターン処理を行う
    • awk ‘pattern {action}’ filename
    • $番号でフィールドを指定
    • スクリプトをファイルに保存して実行することもできる
    • 入力の一行目を削除したい場合はパイプラインの前段にsed 1dを通しておく
    • いくつか組み込み変数がある
    • デフォルトで拡張正規表現でパターンの位置に/pattern/で記述する
    • &&||で条件をつなぐことができる
    • ~はマッチ演算子で例えば$4 ~ /pattern/というようにどのフィールドのマッチングをとるか指定できる
    • BEGIN { … }で全行処理前のアクション、END { … }で全行処理後のアクションを記述できる
    • アクション内では複数の処理を実行してもいい
    • shebang#! /usr/bin/awk -f
    • 一行単位の処理では不可能な条件分岐は制御構文を使う
    • if, switch ~ case, while, do ~ while, forなど一通り使える
    • いくつかの組み込み関数が使える
  • [初心者向け]Awkの使い方
  • AWKのまとめ
    • 関数定義はfunction name(args) { … }で記述できる
  • AWK リファレンス
    • 独立したスクリプト言語なのでawkスクリプト/インタプリタというのが正確
    • 複数のパターン・アクションが指定された場合、入力の行ごとに上から順に評価・実行される
      • next構文を使うと以下のパターン・アクションを無視して次の行にいける(for分のcontinue的役割)
      • そのほかnextfilereturnexitもある
    • —assign var=“value”awkスクリプトに変数を渡すことができる
    • あるいはスクリプト内から$変数名で直接シェル変数を参照してもいい
    • 正規表現に変数を使いたい場合はmatch関数を使う
  • AWK - wikipedia
    • もともとはテキスト処理プログラムとして開発された
    • プリミティブ型は数値と文字列のみ
    • 変数は関数の引数を除いてはグローバルスコープを持つ
      • 関数の引数を余分に定義してローカル変数とするきな臭いプラクティスがある
  • awk とはどんな言語か
  • AWKコマンドの使い方
    • getline関数で次の行を取得できる
  • 実例でわかる awk: 第 1 回
    • 区切り文字は-Fオプションで指定
    • スクリプトで実行する場合は区切り文字を(オプションではなく)スクリプト内で設定するのがよい
    • 変数に数値を文字列として代入しても算術演算が適用される
  • はじめてのAWK
    • 配列はA[2,4,6,8]で表現できる
    • grepawkで書いたコードがあるのであとで読む
  • Getting Started with awk
  • なるべく書かないawkの使い方
    • awkスクリプトとは 'パターン{アクション}' の集合”
    • cutとの違いは単純に使いやすさの問題
      • デフォルトの区切り文字が一文字以上の空白であったりするところ
    • awkとは、表計算コマンドなのかもしれない。”
    • 組み込み変数は7つ
  • 実用 awk ワンライナー
    • awkAWKの処理系のことを指しており、別物なので注意
    • パターンをカンマで区切ると”その範囲内はマッチする”という動作になる
    • レシピ集になっているので必見
  • 「シェル芸」に効くAWK処方箋
    • 第1章:導入
      • シェル芸:ワンライナーで文字列加工すること
      • パターンは条件式そのもの
      • 比較・マッチング演算子の返り値は数字の0または1
      • 代入の戻り値は左辺値
      • 戻り値が0の場合でも数値を表示したいときはダブルクオートをつけて文字列として処理させる
    • 第2章:行操作
      • AWKでtailを作りたいときはtacを使った方がいい
      • カンマは範囲指定演算子と呼ばれ、スイッチのような働きをする
      • カンマの後半を偽な値にすることで、マッチした行以降という表現になる
    • 第3章:列操作
      • AWKとcutの最大の違いは区切り文字に正規表現が使えるかどうか
      • コマンドラインで組み込み変数を指定するときは-vオプションを使う
      • OFSで期待通りに出力するには$1 = $1でレコードの再構築をする必要がある
    • 第4章:文字列関数
      • AWKのインデックスは1から始まるので注意
      • substr関数とindex関数の組み合わせで文字列を抜き出す
      • match関数は組み込み変数に結果を代入するので後から参照できる
        • grep -oと等価なので文字数の少ないそっちがおすすめ
      • sub/gsubの返り値は置換した個数であり置換結果ではないので注意
    • 第5章:数値演算
      • 数字は全て倍精度不動少数点数扱い
    • 第6章:配列・連想配列
      • 配列はインデックスが数値、連想配列は文字列なだけで同じデータ構造
      • for i in arrayでループ処理できるがiに入るのは値ではなくインデックス
      • split関数で手軽に配列を作成できる
      • if “key” in arrayで配列の検査ができる
    • 第7章:GNU AWK拡張機能
      • match関数の第3引数でマッチした値を参照できる
    • 第8章:パイプ
      • かつてsrandを使って時刻を取得するという裏技があった
      • gensub関数を使えば置換後の文字列を返り値として取得できる。後方参照もできる
      • 双方向パイプを使ってAWK内で他のコマンドの実行、値の受け渡しができる
      • (xargsの本質は列の行への変換)
      • 双方向パイプでソケットに直接書き込むことでインターネット通信すらできる
        • まあ、curl/wgetを使おうね……
    • 第9章:GNU拡張とCSVファイルの扱い
      • フィールドの中のパターンを指定するFPAT変数を使うことでカンマをフィールドに含むCSVも簡単に扱える
      • gawkは多次元配列を正式にサポートする
      • BEGINFILE部によりファイルが存在するかを確認できる
      • @変数()で変数を関数として呼び出す
    • 第10章:もっとGNU拡張
      • MPFRによる浮動小数点数演算の精度向上
      • @loadによりライブラリ・ファイルの読み込みができる
      • fork関数でforkシステムコールを呼び出せる
      • in-placeオプションでファイルの更新ができる
    • 第11章:実践
      • コマンドをAWKで書き換えていくという方法がある
      • さらに応用としてサーバを立てたり、CMSを作ることもできる
    • 第12章:Podcastダイジェスト

まとめ

  • awkAWKという処理系の実装であり両者は別物
  • awk ‘pattern {action}’ [filename]、特にパターン・アクションの組み合わせの集合が全て
  • 独立したスクリプト言語なのでサーバプログラムも作れる

とりあえずなんとか読むことはできるはず。書けるようになるのはまた今度頑張る。