GNU/Linux >> Linux の 問題 >  >> Linux

8 つの強力な Awk 組み込み変数 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

この記事は、進行中の Awk チュートリアル サンプル シリーズの一部です。 Awk には、いくつかの強力な組み込み変数があります。 Awk には 2 種類の組み込み変数があります。

<オール>
  • フィールド区切りやレコード区切りなど、変更可能な値を定義する変数
  • レコード数、フィールド数などの処理やレポートに使用できる変数。
  • 1. Awk FS の例:入力フィールド区切り変数。

    Awk は、デフォルトで空白文字に基づいて入力から各行を読み取って解析し、変数 $1、$2 などを設定します。Awk FS 変数は、各レコードのフィールド区切り文字を設定するために使用されます。 Awk FS は、任意の 1 文字または正規表現に設定できます。次の 2 つのオプションのいずれかを使用して、入力フィールド区切り記号を使用できます。

    <オール>
  • -F コマンド ライン オプションの使用。
  • Awk FS は通常の変数のように設定できます。
  • 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 ユーティリティの機能に驚かれることでしょう。


    Linux
    1. Awk チュートリアル:3 つの実践例で Awk 変数を理解する

    2. AWK 対 NAWK 対 GAWK

    3. ORS、NR、FS、RSを使ったawkコマンドの解説

    1. awkを使用して文字の頻度を計算します

    2. awkを学ぶための実用的なガイド

    3. grep と awk の使用

    1. 強力なテキスト解析ツールであるawkの使用を開始する

    2. gawkの初心者向けガイド

    3. Awkの外部変数?