この記事は、進行中の Awk チュートリアル サンプル シリーズの一部です。以前の awk 記事では、awk print、awk ユーザー定義変数、および awk 組み込み変数について説明しました。
他のプログラミング言語と同様に、Awk にも数値および文字列操作用の演算子が多数あります。この記事では、すべての主要な awk 演算子について説明します .
Awk には 2 種類の演算子があります。
Awk 単項演算子
演算子 | 説明 |
+ | 数字を肯定する |
– | 数字を否定 |
++ | 自動インクリメント |
— | 自動減分 |
Awk バイナリ演算子
Awk ではさまざまな種類の二項演算子を使用できます。用途に基づいて分類されています。
Awk 算術演算子
次の演算子は、算術計算の実行に使用されます。
演算子 | 説明 |
+ | 追加 |
– | 引き算 |
* | 掛け算 |
/ | 部門 |
% | 剰余除算 |
Awk 文字列演算子
文字列連結用に、Awk には次の演算子があります。
演算子 | 説明 |
(スペース) | 文字列連結 |
awk 代入演算子
Awk には、以下に示す代入演算子とショートカット代入演算子があります。
演算子 | 説明 |
= | 課題 |
+= | ショートカットの追加割り当て |
-= | ショートカット減算割り当て |
*= | ショートカット乗算の割り当て |
/= | ショートカット部門の割り当て |
%= | ショートカット モジュロ除算の割り当て |
Awk 条件演算子
Awk には、次の記事で取り上げる制御構造とループ ステートメントで使用できる条件演算子の次のリストがあります。
演算子 | 説明 |
> | より大きい |
>= | 以上 |
< | 未満 |
<= | 以下 |
<= | 以下 |
== | 等しい |
!= | 等しくない |
&& | 両方の条件式が真であること |
|| | 条件式のいずれかが真であること |
Awk 正規表現演算子
演算子 | 説明 |
~ | 一致演算子 |
!~ | No Match 演算子 |
awk オペレーターの例
ここで、awk 演算子を使用するいくつかの例を見てみましょう。これらの例では、/etc/passwd を入力ファイルとして使用してみましょう。
$ cat /etc/passwd gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh libuuid:x:100:101::/var/lib/libuuid:/bin/sh syslog:x:101:102::/home/syslog:/bin/false hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false saned:x:110:116::/home/saned:/bin/false pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false
Awk の例 1:ファイル内のフィールドの総数をカウントします。
以下の awk スクリプトは、ショートカット加算代入演算子を使用して、すべての行に一致し、各行にフィールド数を追加し続けます。これまでに表示されたフィールドの数は、「total」という名前の変数に保持されます。入力が処理されると、特別なパターン「END {…}」が実行され、フィールドの総数が出力されます。
$ awk -F ':' '{ total += NF }; END { print total }' /etc/passwd 49
Awk の例 2:/bin/sh シェルを使用しているユーザーの数をカウントする
以下の awk スクリプトでは、パターン /bin/sh を含むすべての行の最後のフィールドに一致します。正規表現は //. の間で閉じる必要があります。そのため、すべてのフロントスラッシュ (/) を正規表現でエスケープする必要があります。行が変数「n」に一致すると、1 ずつインクリメントされます。 END セクションに「n」の値を出力しました。
$ awk -F ':' '$NF ~ /\/bin\/sh/ { n++ }; END { print n }' /etc/passwd 2
Awk の例 3:最大のユーザー ID を持つユーザーの詳細を見つける
以下の awk スクリプトは、変数「maxuid」のフィールドの最大数を追跡し、対応する行が変数「maxline」に格納されます。すべての行をループしたら、それらを出力します。
$ awk -F ':' '$3 > maxuid { maxuid=$3; maxline=$0 }; END { print maxuid, maxline }' /etc/passwd 112 gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false
Awk の例 4:偶数行を出力する
以下の awk スクリプトは、各行を処理し、NR % 2 ==0、つまり NR が 2 の倍数であるかどうかをチェックします。行全体を出力するデフォルトの操作を実行します。
$ awk 'NR % 2 == 0' /etc/passwd libuuid:x:100:101::/var/lib/libuuid:/bin/sh hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false
Awk の例 5. 同じユーザー ID とグループ ID を持つすべての行を出力
以下の awk スクリプトは、$3(USER ID) と $4(GROUP ID) が等しい場合にのみ行を出力します。入力の各行についてこの条件をチェックし、一致する場合は行全体を出力します。
$awk -F ':' '$3==$4' passwd.txt gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
Awk の例 6:100 以上の USER ID を持ち、/bin/sh を使用する必要があるユーザーの詳細を出力する
以下の Awk ステートメントには、2 つの条件式があり、1 つは User id($3) が 100 以上で、2 番目は最後のフィールドが /bin/sh と一致する必要があり、'&&' は上記の両方の場合にのみ出力されます。条件は真です。
$ awk -F ':' '$3>=100 && $NF ~ /\/bin\/sh/' passwd.txt libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Awk の例 7:/etc/passwd ファイルにコメントがないユーザーの詳細を出力する
以下の Awk スクリプトは、各行を読み取り、5 番目のフィールドが空であることを確認し、空の場合は行を出力します。
$awk -F ':' '$5 == "" ' passwd.txt libuuid:x:100:101::/var/lib/libuuid:/bin/sh syslog:x:101:102::/home/syslog:/bin/false saned:x:110:116::/home/saned:/bin/false
推奨読書
<強い> Ramesh Natarajan による Sed と Awk の 101 ハック .テキスト ファイル (データ、構成、およびログ ファイル) を扱う UNIX/Linux 環境で、1 日に数時間を費やしています。私はすべてのテキスト操作作業に Sed と Awk を使用しています。私の Sed と Awk の経験に基づいて、Sed と Awk のさまざまな高度な機能に関する 101 の実用的な例を含む Sed and Awk 101 Hacks eBook を書きました。これにより、UNIX/Linux の生活が向上します。 Sed と Awk を数年間使用しており、この本をまだ読んでいない場合でも、ぜひこの本を読んでください。 Sed および Awk ユーティリティの機能に驚かれることでしょう。