☆gawk
┌──┐
│目次│
├──┘
│◆バージョン ver
│◆概念 idea
│◆起動 exec
│◆オプション option
│◆基本構文 basics
│ _◇パターンと処理 pat
│ _◇関数定義 func
│ _◇組み込み変数 emb
│ _◇演算子 opr
│ _◇変数、配列 var
│ _◇制御文 cont
│ _◇入出力処理 io
│ _◇数学関数 math
│ _◇文字列関数 str
│ _◇時間関数 time
│ _◇その他 others
│◆サンプル sample
◆概念
パターンマッチによるテキストファイル処理言語
ファイルはレコードの集まりとして扱われる
通常、レコードは行
│ (通常の行区切りは改行文字)
gawk [option] ‘script’ var=value [ファイル]
gawk [option] -f scriptFile var=value [ファイル]
※ここでvarはawkスクリプト中での変数、valueは初期値
※コマンド行で与えた値は、BEGINが終わるまで参照できないことに注意。
※ファイル名が与えられないか「-」のときは、標準入力が処理対称になる。
※gawkでは環境変数 AWKPATH でスクリプトのパスを指定できる。
—
│ 後に続く文字はオプションではない
-f file
│ fileからgawkコマンドを読み込む
-v var=value
│ 変数varに値valueを代入。スクリプトの実行開始前に値が設定され、BEGIN中で参照できる。
-Fc
│ フィールド区切り子をcにする。変数 FS を設定しても良い。cには正規表現も可能
※各フィールドは$1,…,$nによって参照できる
※$0はレコード全体
-W [option]
│ gawkの拡張オプション
-W lint
│ 他の版で機能しない可能性のあるコマンドに警告
パターン { 処理 }
※パターン
① /正規表現/
│ 「^」「$」は行の先頭と終わりでなくフィールドの先頭と終わりを意味する
②比較演算式
③パターン一致表現
│ ~ 一致
│ !~ 不一致
④パターン,パターン
│ 対象となる行範囲の指定
⑤複合パターン
│ 論理演算子をつかって複合させた条件
⑥BEGIN
│ 最初の入力行を処理する前に実行。グローバル変数の宣言など
⑦END
│ 最後の入力レコードを処理した後に実行
※BEGINとENDは複数あっても良い。
⇒スクリプトの先頭から順に実行される(複数スクリプトファイルもありえる)
※パターンに使用できる要素
│ 文字列
│ 数字
│ 演算子
│ 関数
│ ユーザ定義関数
│ 組み込み変数
※処理
コマンドや変数代入を改行かセミコロンで区切って指定
│ 組み込み関数
│ ユーザ定義関数
│ フロー制御コマンド
例)
│ { print $1 }
│ パターン指定なし、全ての行の第一フィールド表示
│ /pattern/
│ 処理指定なし、patternを含む行をすべて表示
│ NF > 2
│ NFは入力レコードの中のフィールド数
│ 3フィールドある全レコードを表示
│ BEGIN { FS = “\n”; RS = “” }
│ FSはフィールド区切り文字
│ RSはレコード区切り文字
│ 先頭から空白行までを1レコードとする
function 関数名(引数) {関数本体}
$n
│ 入力レコードのn番目のフィールド
$0
│ 入力レコード
ARGC
│ コマンド行引数の数
ARGIND
│ 処理中のファイルのコマンド行での位置(0から)
ARGV
│ コマンド行引数配列
CONVFMT
│ 数値を文字列に変換するときの書式 (%.6g)
ENVIRON
│ 環境変数連想配列
ERRNO
│ 直前のシステムエラー
FIELDWIDTHS
│ 固定長フィールド分割用フィールド長さをスペースで区切って並べたもの
FILENAME
│ 入力ファイル名
FNR
│ 処理中のファイルで今までに処理したレコード数
FS
│ フィールド区切り文字
IGNORECASE
│ 0以外ならパターンマッチ時に大文字と小文字を区別せず
NF
│ 入力レコード中のフィールド数
NR
│ 現在までに処理したレコードの総数
OFMT
│ 出力時の数値文字列変換書式(%.6g)
OFS
│ 出力時のフィールド区切り子
ORS
│ 出力時のレコード区切り子
RLENGTH
│ match関数で一致した文字列長さ
RS
│ レコード区切り子(デフォルトは改行)
RSTART
│ match関数で一致した文字列の位置
SUBSEP
│ 多次元配列の添え字区切り子(デフォルトは\034)
= += -= *= /= %= ^=
│ 代入
? :
│ 条件文
||
│ 論理和
&&
│ 論理積
~
│ 正規表現一致
!~
│ 正規表現不一致
< <= > >= != ==
│ 比較
「変数間に何もなし」
│ 文字列連接
+ –
│ 和、差
* / %
│ 乗、徐、剰余
+ – !
│ 単行のプラス、マイナス、論理否定
^
│ べき乗(gawkでは**でもよい)
++ —
│ インクリメント、デクリメント
$
│ フィールド参照
_◇変数、配列
型宣言、配列宣言不要。使用時に自動確保される。すべての変数値は文字列であるが、数値の代入も可能。文字列と数値の解釈は前後関係からの自動判断。
※代入
│ 代入演算子による
│ 例)
│ FS = “,”
※配列
│ 代入もしくは split()関数による
│ 配列添字は数値でも文字列でもよい
│ 例)
│ array[1]
│ array[“/pattern/”]
※文字列として強制的に認識させる
│ 空文字を付加
│ 例)
│ var “”
※数字として強制的に認識させる
│ 数値0を足す
│ 例)
│ var + 0
_◇制御文
※break
│ while, forから抜ける
※continue
│ while, forで次の繰り返しを開始
※do
│ 例)
│ do {
│ コマンド
│ } while(条件式)
※for
│
│ 繰り返し
│ 例)
│ for (初期化; 継続条件; ループ処理) {
│ コマンド
│ }
│ 連想配列をなめる
│ 例)
│ for (変数 in 配列) {
│ コマンド
│ ※要素の参照は 配列[変数]
│ }
※if
│ 例)
│ if (条件式)
│ {
│ }
│ else
│ {
│ }
※next
現レコードの処理を中止し、次のレコード処理に進む。ファイルの終わりならEND処理に入る
※return [expr]
ユーザ定義関数からの戻り。値exprを返す。
※while(条件式) command
条件式が真の間、commandを実行する
│
_◇入出力処理
※close
│ ファイルまたはパイプを閉じる(閉じて再び開くために使用する)
│ close(ファイルまたはパイプを開いたときと同じ文字列)
※getline
ファイルもしくは、コマンド行の次のファイルから入力結果を読み込む
│ getline [var] [<file]
外部コマンドの実行結果を読み込む
│ 外部コマンド | getline [var]
│ ファイル名、外部コマンド名は “”で囲む
│ varが指定されなければ$0に読み込まれる
│ レコードの読みとりに成功すれば1、EOFで0
│ 読み込み失敗で-1を返す
※print [args][出力先]
引数をス津力先に送る。複数の変数を「,」でならべると、出力はOFSで区切られる。「 」(空白)でならべると出力は区切られない。出力先は
│ シェルリダイレクト、パイプが指定できる
│ ファイル名や外部コマンド名は””で囲む
※printf [フォーマット[,テキスト]]
テキストを指定フォーマットに従って出力。フォーマットはCのprintf()と同じ
_◇数学関数
※atan2(y, x)
│ y/x のアークタンジェント。ラジアン単位。
※cos(x)
│ コサイン。ラジアン単位。
※exp(x)
│ 指数関数 e^x
※int(x)
│ 実数値xの整数部分を返す。
※log(x)
│ xの自然対数
※rand()
│ 0以上1未満の乱数
│ ⇒異なる乱数列を得るにはsrand()関数で種を変更
※sin()
│ サイン。ラジアン単位
※sqrt(x)
│ xの平方根を返す。
※srand(expr)
│ exprを新しい乱数の種とする。省略すると現在時刻が使われる。
_◇文字列関数
※gsub(r,s,[t])
文字列t(tが指定されなければ$0)の中で、正規表現rに一致する部分をsに置換し、置換した回数を返す
※index(キー文字列、文字列)
文字列内でキー文字列が最初に現れる位置を返す。見つからなければ0
※length(arg)
文字列の長さを返す。argが省略されると$0が使われる
※match(s,r)
正規表現rに最初に一致した文字列sの位置を返す。RSTARTとRLENGTHの値も設定する。一致しなかったら0を返す
※split(文字列, 配列 [,区切り子])
文字列を区切り子で分解して配列に格納。区切り子を省略するとFSが使われる。分割した要素の数を返す。
※sprintf [フォーマット[,テキスト]]
printf同様にテキストを変換するが、出力はせず変換したものを返す。
※sub(r,s[,t])
文字列tの中で正規表現rに最初に一致した部分を文字列sに置換する。tが省略されたら$0が対象。正常終了で1、他は0.
※substr(s,m[,n])
文字列sのうち開始位置mからn文字分の部分文字列を返す。nが省略されたら文字列の終わりまで
※tolower(str)
文字列strの全文字を小文字に変換して返す
※toupper(str)
文字列strの全文字を大文字に変換して返す
※strftime(フォーマット, time)
時刻timeを指定されたフォーマットで変換して返す。
timeの書式はsystime関数と同じ。
フォーマットはCのstrftime()関数と同じ。
※systime()
1970/1/1/0:00UTCからの経過秒数
_◇その他
※delete
│ 配列の要素を削除
│ 例)
│ delete(配列[要素])
※exit
│ スクリプトの実行を終了する。ENDの処理は行われる。
※function
│ ユーザ定義関数の定義
│
│ function 関数名(引数リスト) {
│ コマンド
│ }
⇒gawkではfuncと書いてもよい
※system(command)
指定したコマンドをシェルで実行し、その終了ステータスを返す。
│ 多くのコマンドで
│ 正常終了:0
│ 一応完了:1
│ 予期せぬエラー:-1
│ ⇒コマンドの出力を読み込む場合はパイプを使う
_◇/etc/passwdをフィールドにわけて表示
gawk -F: ‘{print $1; print $2; print $3}’ /etc/passwd
_◇patternが現れた回数を表示
/pattern/ {++x} END {print x}
_◇第2カラムの数字を合計
{total += $2}; END {print “total =”, total}
_◇フィールドの順番を逆順に表示
{ for (i=NF; i >= 1; i–) print $i}
│ NFは入力レコードのフィールド数