この記事は、進行中の Awk チュートリアル サンプル シリーズの一部です。 Awk には、いくつかの強力な組み込み変数があります。 Awk には 2 種類の組み込み変数があります。
<オール>
1. Awk FS の例:入力フィールド区切り変数。
Awk は、デフォルトで空白文字に基づいて入力から各行を読み取って解析し、変数 $1、$2 などを設定します。Awk FS 変数は、各レコードのフィールド区切り文字を設定するために使用されます。 Awk FS は、任意の 1 文字または正規表現に設定できます。次の 2 つのオプションのいずれかを使用して、入力フィールド区切り記号を使用できます。
<オール>Syntax: $ awk -F 'FS' 'commands' inputfilename (or) $ awk 'BEGIN{FS="FS";}'
- Awk FS 入力フィールドのセパレータとして使用する単一の文字または正規表現です。
- Awk FS 何度でも変更でき、明示的に変更されるまでその値を保持します。フィールドセパレーターを変更したい場合は、行を読む前に変更することをお勧めします。その変更は、あなたが読む内容に影響を与えます。
以下は、フィールド区切り文字として「:」を含む /etc/passwd ファイルを読み取る awk FS の例です。
$ cat etc_passwd.awk BEGIN{ FS=":"; print "Name\tUserID\tGroupID\tHomeDirectory"; } { print $1"\t"$3"\t"$4"\t"$6; } END { print NR,"Records Processed"; }
$awk -f etc_passwd.awk /etc/passwd Name UserID GroupID HomeDirectory gnats 41 41 /var/lib/gnats libuuid 100 101 /var/lib/libuuid syslog 101 102 /home/syslog hplip 103 7 /var/run/hplip avahi 105 111 /var/run/avahi-daemon saned 110 116 /home/saned pulse 111 117 /var/run/pulse gdm 112 119 /var/lib/gdm 8 Records Processed
2. Awk OFS の例:出力フィールド区切り変数
Awk OFS awk FS 変数に相当する出力です。デフォルトでは、awk OFS は単一のスペース文字です。以下は awk OFS の例です。
$ awk -F':' '{print $3,$4;}' /etc/passwd 41 41 100 101 101 102 103 7 105 111 110 116 111 117 112 119
print ステートメントの連結子「,」は、デフォルトで awk OFS の値であるスペースを使用して 2 つのパラメーターを連結します。したがって、以下に示すように、出力のフィールド間に Awk OFS 値が挿入されます。
$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd 41=41 100=101 101=102 103=7 105=111 110=116 111=117 112=119
3. Awk RS の例:レコード区切り変数
Awk RS 行を定義します。 Awk はデフォルトで 1 行ずつ読み取ります。
生徒の採点がファイルに保存され、各レコードが 2 つの改行で区切られ、各フィールドが改行文字で区切られているとしましょう。
$cat student.txt Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 65 Edwin 2537 78 67 45 Dayan 2415 30 47 20
以下の Awk スクリプトは、上記の入力ファイルから生徒の名前とロール番号を出力します。
$cat student.awk BEGIN { RS="\n\n"; FS="\n"; } { print $1,$2; } $ awk -f student.awk student.txt Jones 2143 Gondrol 2321 RinRao 2122 Edwin 2537 Dayan 2415
スクリプト student.awk では、各学生の詳細を 1 つのレコードとして読み取ります。これは、awk RS が 2 つの改行文字に割り当てられており、FS が改行文字であるため、レコードの各行がフィールドであるためです。
4. Awk ORS の例:出力レコード区切り変数
問題のある ORS RS に相当する出力です。出力の各レコードは、この区切り文字で出力されます。以下は awk ORS の例です:
$ awk 'BEGIN{ORS="=";} {print;}' student-marks Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=
上記のスクリプトでは、student-marks ファイル内の各レコードが文字「=」で区切られています。
5. Awk NR の例:レコード変数の数
よくわからない NR 処理中のレコードの総数または行番号を示します。次の awk NR の例では、NR 変数に行番号があり、END セクションの awk NR はファイル内のレコードの総数を示します。
$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks Processing Record - 1 Processing Record - 2 Processing Record - 3 Processing Record - 4 Processing Record - 5 5 Students Records are processed
6. Awk NF の例:レコード内のフィールド数
ぎこちない NF レコード内のフィールドの総数を示します。 Awk NF は、すべてのフィールドがレコードに存在するかどうかを検証するのに非常に役立ちます。
以下に示すように、学生の成績ファイルを取り込んでみましょう。Test3 のスコアが学生に不足しています。
$cat student-marks Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 Edwin 2537 78 67 45 Dayan 2415 30 47
次の Awk スクリプトは、レコード (行) 番号とそのレコード内のフィールド数を出力します。したがって、Test3 のスコアが欠落していることを見つけるのは非常に簡単です。
$ awk '{print NR,"->",NF}' student-marks 1 -> 5 2 -> 5 3 -> 4 4 -> 5 5 -> 4
7. Awk FILENAME 例:現在の入力ファイルの名前
FILENAME 変数は、読み取られるファイルの名前を示します。 Awk は、処理する入力ファイルの数を受け入れることができます。
$ awk '{print FILENAME}' student-marks student-marks student-marks student-marks student-marks student-marks
上記の例では、入力ファイルの各レコードのファイル名、つまり学生の成績を出力します。
8. Awk FNR の例:現在の入力ファイルに関連するレコード数
awk が複数の入力ファイルから読み取る場合、awk NR 変数は、すべての入力ファイルに関連するレコードの総数を示します。 Awk FNR 各入力ファイルのレコード数が表示されます。
$ awk '{print FILENAME, FNR;}' student-marks bookdetails student-marks 1 student-marks 2 student-marks 3 student-marks 4 student-marks 5 bookdetails 1 bookdetails 2 bookdetails 3 bookdetails 4 bookdetails 5
上記の例では、awk FNR の代わりに awk NR を使用すると、ファイル bookdetails に対してレコードごとに 6 から 10 を取得します。
推奨読書
<強い> 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 ユーティリティの機能に驚かれることでしょう。