A guide to intermediate awk scripting

この記事では、コマンドを実行可能なスクリプトに構造化する方法を知っているからこそ使いやすい、awk の機能について説明します。

論理演算子と条件式

論理演算子の and (書かれている &&) と or (書かれている ||) を使用して、条件式に具体性を持たせることができます。

例えば、2列目に文字列「紫」、3列目に金額が5未満のレコードのみを選択して印刷するには、次のようにします。

$2 == "purple" && $3 < 5 {print $1}

2列目に「紫」があっても、3列目に5以上の値がある場合は、そのレコードは選択されません。

例えば、ファイルの中で金額が 8 以上のすべてのレコードを選択し、一致するレコードに 2 つのアスタリスク (**) を表示したいとします。 また、値が5(含む)から8までのすべてのレコードに、アスタリスク(*)を1つだけ表示したいとします。

以下に例を示します。

NR == 1 {
print $0;
next;
}
$3 >= 8 {
printf "%s\t%s\n", $0, "**";
next;
}
$3 >= 5 {
printf "%s\t%s\n", $0, "*";
next;
}
$3 < 5 {
print $0;
}

BEGINコマンド

BEGINコマンドは、awkがテキストファイルのスキャンを開始する前に、変数の表示や設定を行うことができます。 たとえば、入力フィールドと出力フィールドのセパレータをBEGIN文で定義することにより、awkスクリプト内で設定することができます。

ENDコマンド

ENDコマンドは、BEGINと同様に、awkが処理中のテキストファイルのスキャンを完了した後に、awkでアクションを実行することができます。 ある値の累積結果をすべてのレコードに表示したい場合は、すべてのレコードがスキャンされ、処理された後でなければ実行できません。 BEGINコマンドとENDコマンドはそれぞれ1回だけ実行され、その間のすべてのルールは各レコードに対して0回以上実行されます。

以下に、ENDコマンドなしでは実現できない例を示します。

$1 != "tempfs" {
used += $3;
available += $4;
}
END {
printf "%d GiB used\n%d GiB available\n", used/2^20, available/2^20;
}

このスクリプトを total.awk という名前で保存し、実行してみてください。

df -l | awk -f total.awk

used 変数と available 変数は、他の多くのプログラミング言語の変数と同じように動作します。 型を宣言することなく任意に作成し、自由に値を追加することができます。

数学

これまでのすべての論理演算子やカジュアルな計算からお分かりのように、awk はごく自然に数学を行います。 これは間違いなく、ターミナル用の非常に便利な計算機になります。

$ awk 'BEGIN { print 2*21 }'
42
$ awk 'BEGIN {print 8*log(4) }'
11.0904

確かに、単純な (そしてそれほど単純ではない) 計算のために多くの文字を入力することになりますが、フロントエンドを書くのにそれほど労力はかからないでしょう。

この記事は、コミュニティ・テクノロジー・ポッドキャストであるHacker Public Radioのエピソードから引用しています

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です