gawkチートシート
個人用メモです。
-fオプション 入力フィールド区切り文字の設定
入力フィールド区切り文字の設定をします。
-vオプション 変数の設定
プログラムの実行が開始される前に、変数varに値valを割り当てます。そのような変数値は、AWKプログラムの開始規則に利用可能です。
ビルトイン変数を書き換えることで、default動作を変更することもできます。
gawk -v RS="" '{gsub("aaa", "test"); print $0 }'
gawkのビルトイン変数
変数名 | 説明 |
---|---|
ARGC | コマンドライン引数の個数(gawkへのオプションと、プログラム指定は含みません)。 |
ARGIND | 現在処理中のファイル名が格納されている配列ARGVのインデックス。 |
ARGV | コマンドライン引数の配列。配列は、0からARGC-1までのインデックスを持ちます。ARGVの内容を変更することで、入力に用いるファイル名を変更することができます。 |
CONVFMT | 数値の変換フォーマット。デフォルト値は"%.6g"です。 |
ENVIRON | 現在の環境変数の値からなる配列。配列は、環境変数名によりインデックスされ、各要素の値はその環境変数の値です(例えばENVIRON["HOME"]は/home/arnoldとなるでしょう)。本配列に代入を行っても、gawkからリダイレクトやsystem()関数により実行されるプログラムの環境には影響を与えません(これは、将来のgawkでは変更される可能性があります)。 |
ERRNO | getlineのリダイレクト、getlineによる読み込み、close()関数の実行時のいずれかにシステムエラーが発生した場合、変数ERRNOにはエラーの内容を示した文字列が設定されます。 |
FIELDWIDTHS | 空白で区切られたフィールド長のリスト。もしこの値が設定されていれば、gawkはFSの値を用いてフィールド分割するかわりに、固定長のフィールド分割を行います。固定長のフィールド分割機能はまだ実験的なもので、gawkが改良されるに従って意味が変化する可能性があります。 |
FILENAME | 現在の入力ファイル名。もし、コマンドラインで入力ファイルが指定されていなければ、FILENAMEの値は``-''です。しかしながら、BEGINブロック内ではFILENAMEは未定義です。 |
FNR | 現在の入力ファイルにおける入力レコード番号。 |
FS | 入力フィールドセパレータ。デフォルトでは単一の空白です。上述のフィールドを参照してください。 |
IGNORECASE | すべての正規表現と文字列操作において大文字小文字の区別を制御します。もし、IGNORECASEが0でない値に設定されていれば、文字列比較、ルールのパターンマッチ、FSによるフィールド分割、RSによるレコード分割、~と!~による正規表現マッチ、定義済み関数gensub(),gsub(),index(),match(),split(),sub()において大文字と小文字の違いは無視されます。このため、IGNORECASEが0以外の値なら、/aB/は"ab","aB","Ab","AB"のいずれにもマッチすることになります。他のAWK変数と同様にIGNORECASEの初期値は0なので、通常は正規表現と文字列操作において大文字と小文字は区別されます。Unixでは、大文字小文字を無視する場合、ISO8859-1Latin-1文字集合全てを使用できます。注:3.0以前のgawkではIGNORECASEは正規表現操作のみに影響しました。現在は文字列比較にも影響します。 |
NF | 現在の入力レコードのフィールド数。 |
NR | 現在までに読み込んだ入力レコード数の合計。 |
OFMT | 数字の出力フォーマット。デフォルト値は"%.6g"です。 |
OFS | 出力フィールドセパレータ。デフォルトは空白です。 |
ORS | 出力レコードセパレータ。デフォルトは改行です。 |
RS | 入力レコードセパレータ。デフォルトは改行です。 |
RT | レコードターミネータ。gawkは、RSで指定される文字または正規表現にマッチする入力テキストを、RTに設定します。 |
RSTART | match()によりマッチした最初の文字の位置。0はマッチしなかったことを示します。 |
RLENGTH | match()によりマッチした文字列の長さ。-1はマッチしなかったことを示します。 |
SUBSEP | 多次元配列を実現する際に用いられる、配列のインデックスを結合する文字。デフォルト値は"\034"です。 |
-i inplace 上書き
-i inplace
で上書きできます。
gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
最短マッチ
*や、+は最長マッチなので、最短マッチを使用したいときは否定を使う
htmlタグ内を取得したい場合、<.+>
ではなく、<[^>]+>
にする。
gawk '{gsub("aaa[^;]+;", "test"); print $0 }'
行数指定
# 1行目
gawk 'NR==1{print}'
# 2行より下を出力
gawk 'NR>2{print}'
# ログの最後から見て、最初に登場する条件に一致した要素を出力
cat log.txt | tail -r | ggrep "ft" | gawk 'NR==1{print}'
合計
# 2列目の合計
gawk '{s += $2} END {print s}'
# 2列目と4列目の合計
gawk '{time+=$2; cpu+=$4} END {print time, cpu}'
# 2列目と4列目の合計(書式の指定)
gawk '{time+=$2; cpu+=$4} END {printf "std time: %d, cpu: %d\n", time, cpu}'
末尾の要素
# 末尾の要素
gawk '{print $NF}'
# 末尾から数えてn番目の要素
gawk '{print $(NF-n)}'
cutも使おう
echo "/a41dc76cb007e/7.4/buster/fpm" | cut -d / -f 3-