awk
■ awkとは
テキストデータの処理に長けたプログラミング言語。 Linux環境でよく利用される。
■ 特徴
- Cに近い
- 高速
- awkだけで、処理を実装可能
■ 基本構文
awk パターン {アクション}'
cat text.txt | awk 'NR <= 4 && NR >=1 {value="test"; print $1}'
※ アクションがない場合は、そのまま表示
echo 100 | awk 1
■ 真偽値
- 0 : False
- 空文字 : False
- 上記以外 : True
* TRUEの場合
# echo 100 | awk 1
100
* FALSEの場合
# echo 100 | awk 0
代入を行う際は、戻り値が左辺値になることに注意が必要。
※ 第2文字列を空文字にする処理
※ 戻り値は, $2になるので、$2がFalseだと表示されない
# echo "a b c" | awk '$2 = ""'
# echo "a b c" | awk '!($2 = "")'
a c
■ 組み込み変数
- NF : フィルード(列)の数
- NR : レコード(行)の数
- FS : フィールドの区切り文字 (デフォルトは空白)
- RS : レコードの区切り文字 (デフォルトは改行)
- OFS : 出力するときのフィールドの区切り文字 (デフォルトは空白)
- ORS : 出力するときのレコードの区切り文字 (デフォルトは改行)
■ 組み込み関数
-
substr(対象文字列, 切り出し開始文字位置, 切り出す文字数)
-
sub(置換対象文字列, 置換後文字列, 対象文字列) => 最初に検索にヒットした文字だけ
-
gsub(置換対象文字列, 置換後文字列, 対象文字列) => 検索にヒットした文字全て
-
index(文字列, 検索文字) => 検索文字位置
-
match(文字列, 正規表現) => 真偽値 => RSTART : マッチした文字位置 => RLENGTH : マッチした文字数
-
split() : 文字列から配列を作る、配列数を返す
-
patsplit() : パターンを指定して配列を作成
-
length(配列) => 配列の数
-
printf
echo "1 2 3" | awk '{var = $2; printf("test %s test", var);}'
- sprintf : 文字列を結合する
echo "1 2 3" | awk '{var = $2; string=sprintf("test %s test", var); print string}'
- fork : 並列処理
@load "fork";
BEGIN {
for (i = 1; i <= 3; i++) {
pid = fork();
# pid が 0 なら子プロセス
if (pid == 0) {
for (j = 1; j < 3; j++) {
print i j
}
}
}
}
■ 正規表現
パターンを/で囲む。
ps aux | awk '/.+sh/ { print $0 }'
■ スイッチ
※ NR = 1でTrueに、NR = 5でFalseni
NR == 1, NR == 5
■ 計算
2進数で表現できない数値は計算する際に誤差がでる場合もある
70.21 * 100 = 7021にならないケースがある
■ 乱数
awk '{ srand('"$RANDOM"'); print rand() }'
■ 繰り返し文
awk 'BEGIN {for (i = 1; i <= 5; i++) print i;}'