AWK-クイックガイド

AWKはインタープリタ型プログラミング言語です。非常に強力で、テキスト処理用に特別に設計されています。その名前は、その作者の姓に由来しています-Alfred Aho, Peter Weinberger, and Brian Kernighan.

GNU / Linuxが配布するAWKのバージョンは、フリーソフトウェアファウンデーション(FSF)によって作成および保守されています。それはしばしばと呼ばれますGNU AWK.

AWKの種類

以下はAWKの変種です-

  • AWK − AT&T研究所のオリジナルAWK。

  • NAWK − AT&T研究所のAWKの新しく改良されたバージョン。

  • GAWK−それはGNUAWKです。すべてのGNU / LinuxディストリビューションにはGAWKが付属しています。AWKおよびNAWKと完全に互換性があります。

AWKの典型的な使用法

AWKでは無数のタスクを実行できます。以下にリストされているのはそれらのほんの一部です-

  • テキスト処理、
  • フォーマットされたテキストレポートの作成、
  • 算術演算を実行し、
  • 文字列操作の実行、その他多数。

この章では、GNU / LinuxシステムでAWK環境をセットアップする方法について説明します。

パッケージマネージャーを使用したインストール

通常、AWKはほとんどのGNU / Linuxディストリビューションでデフォルトで使用できます。使用できますwhichシステムに存在するかどうかを確認するコマンド。AWKをお持ちでない場合は、Advance PackageToolを使用してDebianベースのGNU / Linuxにインストールしてください。(APT) パッケージマネージャーは次のとおりです-

[jeryy]$ sudo apt-get update [jeryy]$ sudo apt-get install gawk

同様に、RPMベースのGNU / LinuxにAWKをインストールするには、Yellowdog UpdatorModifierを使用します yum パッケージマネージャーは次のとおりです-

[root]# yum install gawk

インストール後、コマンドラインからAWKにアクセスできることを確認してください。

[jerry]$ which awk

上記のコードを実行すると、次の結果が得られます-

/usr/bin/awk

ソースコードからのインストール

GNU AWKはGNUプロジェクトの一部であるため、そのソースコードは無料でダウンロードできます。パッケージマネージャーを使用してAWKをインストールする方法についてはすでに説明しました。ここで、ソースコードからAWKをインストールする方法を理解しましょう。

次のインストールは、すべてのGNU / Linuxソフトウェア、および他のほとんどの無料で入手可能なプログラムにも適用できます。インストール手順は次のとおりです-

Step 1−本物の場所からソースコードをダウンロードします。コマンドラインユーティリティwget この目的を果たします。

[jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz

Step 2 −ダウンロードしたソースコードを解凍して解凍します。

[jerry]$ tar xvf gawk-4.1.1.tar.xz

Step 3 −ディレクトリに移動し、configureを実行します。

[jerry]$ ./configure

Step 4 −正常に完了すると、 configureMakefileを生成します。ソースコードをコンパイルするには、make コマンド。

[jerry]$ make

Step 5−テストスイートを実行して、ビルドがクリーンであることを確認できます。これはオプションの手順です。

[jerry]$ make check

Step 6−最後に、AWKをインストールします。スーパーユーザー権限があることを確認してください。

[jerry]$ sudo make install

それだ!これで、AWKが正常にコンパイルおよびインストールされました。を実行して確認しますawk 次のようにコマンド-

[jerry]$ which awk

このコードを実行すると、次の結果が得られます-

/usr/bin/awk

エキスパートのAWKプログラマーになるには、その内部を知る必要があります。AWKは、読み取り、実行、繰り返しという単純なワークフローに従います。次の図は、AWKのワークフローを示しています-

読んだ

AWKは、入力ストリーム(ファイル、パイプ、またはstdin)から行を読み取り、それをメモリーに保管します。

実行する

すべてのAWKコマンドは、入力に順番に適用されます。デフォルトでは、AWKはすべての行でコマンドを実行します。パターンを提供することでこれを制限できます。

繰り返す

このプロセスは、ファイルが最後に到達するまで繰り返されます。

プログラムの構造

ここで、AWKのプログラム構造を理解しましょう。

BEGINブロック

BEGINブロックの構文は次のとおりです-

Syntax

BEGIN {awk-commands}

BEGINブロックは、プログラムの起動時に実行されます。一度だけ実行されます。これは、変数を初期化するのに適した場所です。BEGINはAWKキーワードであるため、大文字にする必要があります。このブロックはオプションであることに注意してください。

ボディブロック

bodyブロックの構文は次のとおりです-

Syntax

/pattern/ {awk-commands}

bodyブロックは、すべての入力行にAWKコマンドを適用します。デフォルトでは、AWKはすべての行でコマンドを実行します。パターンを提供することでこれを制限できます。Bodyブロックにはキーワードがないことに注意してください。

ENDブロック

ENDブロックの構文は次のとおりです-

Syntax

END {awk-commands}

ENDブロックは、プログラムの最後に実行されます。ENDはAWKキーワードであるため、大文字にする必要があります。このブロックはオプションであることに注意してください。

ファイルを作成しましょう marks.txt これには、シリアル番号、学生の名前、科目名、および取得したマークの数が含まれます。

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

AWKスクリプトを使用して、ヘッダー付きのファイルの内容を表示してみましょう。

Example

[jerry]$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt

このコードを実行すると、次の結果が得られます。

Output

Sr No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

開始時に、AWKはBEGINブロックからヘッダーを出力します。次に、bodyブロックで、ファイルから1行を読み取り、AWKのprintコマンドを実行して、標準出力ストリームにコンテンツを出力します。このプロセスは、ファイルが最後に到達するまで繰り返されます。

AWKは使い方が簡単です。AWKコマンドは、コマンドラインから直接提供することも、AWKコマンドを含むテキストファイルの形式で提供することもできます。

AWKコマンドライン

図のように、コマンドラインで一重引用符で囲んでAWKコマンドを指定できます。

awk [options] file ...

テキストファイルを考えてみましょう marks.txt 次の内容で-

1) Amit     Physics    80
2) Rahul    Maths      90
3) Shyam    Biology    87
4) Kedar    English    85
5) Hari     History    89

次のように、AWKを使用してファイルの完全なコンテンツを表示しましょう-

Example

[jerry]$ awk '{print}' marks.txt

このコードを実行すると、次の結果が得られます-

Output

1) Amit     Physics    80
2) Rahul    Maths      90
3) Shyam    Biology    87
4) Kedar    English    85
5) Hari     History    89

AWKプログラムファイル

図のように、スクリプトファイルでAWKコマンドを提供できます-

awk [options] -f file ....

まず、テキストファイルを作成します command.awk 以下に示すようにAWKコマンドを含みます-

{print}

これで、テキストファイルからコマンドを読み取ってアクションを実行するようにAWKに指示できます。ここでは、上記の例と同じ結果が得られます。

Example

[jerry]$ awk -f command.awk marks.txt

このコードを実行すると、次の結果が得られます-

Output

1) Amit  Physics 80
2) Rahul Maths   90
3) Shyam Biology 87
4) Kedar English 85
5) Hari  History 89

AWK標準オプション

AWKは、コマンドラインから提供できる次の標準オプションをサポートしています。

-vオプション

このオプションは、変数に値を割り当てます。プログラム実行前の割り当てが可能です。次の例では、-vオプションの使用法について説明します。

Example

[jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'

このコードを実行すると、次の結果が得られます-

Output

Name = Jerry

--dump-variables [= file]オプション

グローバル変数とその最終値のソートされたリストをファイルに出力します。デフォルトのファイルはawkvars.out

Example

[jerry]$ awk --dump-variables '' [jerry]$ cat awkvars.out

上記のコードを実行すると、次の結果が得られます-

Output

ARGC: 1
ARGIND: 0
ARGV: array, 1 elements
BINMODE: 0
CONVFMT: "%.6g"
ERRNO: ""
FIELDWIDTHS: ""
FILENAME: ""
FNR: 0
FPAT: "[^[:space:]]+"
FS: " "
IGNORECASE: 0
LINT: 0
NF: 0
NR: 0
OFMT: "%.6g"
OFS: " "
ORS: "\n"
RLENGTH: 0
RS: "\n"
RSTART: 0
RT: ""
SUBSEP: "\034"
TEXTDOMAIN: "messages"

--helpオプション

このオプションは、ヘルプメッセージを標準出力に出力します。

Example

[jerry]$ awk --help

このコードを実行すると、次の結果が得られます-

Output

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options : GNU long options: (standard)
   -f progfile                --file=progfile
   -F fs                      --field-separator=fs
   -v var=val                 --assign=var=val
Short options : GNU long options: (extensions)
   -b                         --characters-as-bytes
   -c                         --traditional
   -C                         --copyright
   -d[file]                   --dump-variables[=file]
   -e 'program-text'          --source='program-text'
   -E file                    --exec=file
   -g                         --gen-pot
   -h                         --help
   -L [fatal]                 --lint[=fatal]
   -n                         --non-decimal-data
   -N                         --use-lc-numeric
   -O                         --optimize
   -p[file]                   --profile[=file]
   -P                         --posix
   -r                         --re-interval
   -S                         --sandbox
   -t                         --lint-old
   -V                         --version

--lint [= fatal]オプション

このオプションを使用すると、移植性のない、または疑わしい構成をチェックできます。引数がfatalが提供されている場合、警告メッセージをエラーとして扱います。次の例はこれを示しています-

Example

[jerry]$ awk --lint '' /bin/ls

このコードを実行すると、次の結果が得られます-

Output

awk: cmd. line:1: warning: empty program text on command line
awk: cmd. line:1: warning: source file does not end in newline
awk: warning: no program text at all!

--posixオプション

このオプションは、POSIXの厳密な互換性をオンにします。この互換性では、すべての一般的な拡張機能とgawk固有の拡張機能が無効になります。

--profile [= file]オプション

このオプションは、ファイルにプログラムのきれいに印刷されたバージョンを生成します。デフォルトのファイルはawkprof.out。以下の簡単な例はこれを示しています-

Example

[jerry]$ awk --profile 'BEGIN{printf"---|Header|--\n"} {print} END{printf"---|Footer|---\n"}' marks.txt > /dev/null [jerry]$ cat awkprof.out

このコードを実行すると、次の結果が得られます-

Output

# gawk profile, created Sun Oct 26 19:50:48 2014

   # BEGIN block(s)

   BEGIN {
      printf "---|Header|--\n"
   }

   # Rule(s) {
      print $0
   }

   # END block(s)

   END {
      printf "---|Footer|---\n"
   }

--traditionalオプション

このオプションは、すべてのgawk固有の拡張機能を無効にします。

--versionオプション

このオプションは、AWKプログラムのバージョン情報を表示します。

Example

[jerry]$ awk --version

このコードを実行すると、次の結果が得られます。

Output

GNU Awk 4.0.1
Copyright (C) 1989, 1991-2012 Free Software Foundation.

この章では、いくつかの便利なAWKコマンドとその適切な例について説明します。テキストファイルを考えてみましょうmarks.txt 以下の内容で処理される-

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

列またはフィールドの印刷

入力フィールドから特定の列のみを印刷するようにAWKに指示できます。次の例はこれを示しています-

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Physics   80
Maths     90
Biology   87
English   85
History   89

ファイル内 marks.txt、3番目の列にはサブジェクト名が含まれ、4番目の列には特定のサブジェクトで取得されたマークが含まれます。AWKprintコマンドを使用してこれらの2つの列を印刷してみましょう。上記の例では、$3 and $4 入力レコードの3番目と4番目のフィールドをそれぞれ表します。

すべての行を印刷する

デフォルトでは、AWKはパターンに一致するすべての行を印刷します。

[jerry]$ awk '/a/ {print $0}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

上記の例では、フォームパターンを検索しています a。パターンマッチングが成功すると、bodyブロックからコマンドを実行します。本文ブロックがない場合-レコードを印刷するデフォルトのアクションが実行されます。したがって、次のコマンドは同じ結果を生成します-

[jerry]$ awk '/a/' marks.txt

パターンによる列の印刷

パターンマッチングが成功すると、AWKはデフォルトでレコード全体を印刷します。ただし、特定のフィールドのみを印刷するようにAWKに指示することはできます。たとえば、次の例では、パターンマッチが成功すると、3番目と4番目のフィールドが出力されます。

[jerry]$ awk '/a/ {print $3 "\t" $4}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Maths    90
Biology  87
English  85
History  89

任意の順序で列を印刷する

列は任意の順序で印刷できます。たとえば、次の例では、4番目の列の後に3番目の列を出力します。

[jerry]$ awk '/a/ {print $4 "\t" $3}' marks.txt

上記のコードを実行すると、次の結果が得られます-

出力

90   Maths
87   Biology
85   English
89   History

一致したパターンのカウントと印刷

パターンマッチングが成功した行数を数えて印刷できる例を見てみましょう。

[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt

このコードを実行すると、次の結果が得られます-

出力

Count = 4

この例では、パターンマッチが成功したときにカウンターの値をインクリメントし、この値をENDブロックに出力します。他のプログラミング言語とは異なり、使用する前に変数を宣言する必要がないことに注意してください。

18文字を超える行の印刷

18文字を超える行のみを印刷してみましょう。

[jerry]$ awk 'length($0) > 18' marks.txt

このコードを実行すると、次の結果が得られます-

出力

3) Shyam   Biology   87
4) Kedar   English   85

AWKは組み込みを提供します length 文字列の長さを返す関数。 $0変数は行全体を格納し、本文ブロックがない場合は、デフォルトのアクション、つまり印刷アクションが実行されます。したがって、1行に18文字を超える場合、比較結果はtrueになり、その行が出力されます。

AWKはいくつかの組み込み変数を提供します。これらは、AWKスクリプトを作成する際に重要な役割を果たします。この章では、組み込み変数の使用法について説明します。

標準のAWK変数

標準のAWK変数については以下で説明します。

ARGC

これは、コマンドラインで提供される引数の数を意味します。

Example

[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four

このコードを実行すると、次の結果が得られます-

Output

Arguments = 5

しかし、4つの引数だけを渡したのに、なぜAWKは5を表示するのでしょうか。次の例を確認して、疑問を解消してください。

ARGV

これは、コマンドライン引数を格納する配列です。アレイの有効なインデックスの範囲は0からARGC-1です。

Example

[jerry]$ awk 'BEGIN { 
   for (i = 0; i < ARGC - 1; ++i) { 
      printf "ARGV[%d] = %s\n", i, ARGV[i] 
   } 
}' one two three four

このコードを実行すると、次の結果が得られます-

Output

ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three

CONVFMT

数値の変換形式を表します。デフォルト値は%.6g

Example

[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'

このコードを実行すると、次の結果が得られます-

Output

Conversion Format = %.6g

環境

これは、環境変数の連想配列です。

Example

[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'

このコードを実行すると、次の結果が得られます-

Output

jerry

他の環境変数の名前を見つけるには、 env コマンド。

ファイル名

現在のファイル名を表します。

Example

[jerry]$ awk 'END {print FILENAME}' marks.txt

このコードを実行すると、次の結果が得られます-

Output

marks.txt

BEGINブロックではFILENAMEが定義されていないことに注意してください。

FS

これは(入力)フィールド区切り文字を表し、デフォルト値はスペースです。を使用してこれを変更することもできます-F コマンドラインオプション。

Example

[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte

このコードを実行すると、次の結果が得られます-

Output

FS =  $

NF

現在のレコードのフィールド数を表します。たとえば、次の例では、3つ以上のフィールドを含む行のみを出力します。

Example

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'

このコードを実行すると、次の結果が得られます-

Output

One Two Three
One Two Three Four

NR

現在のレコードの番号を表します。たとえば、次の例では、現在のレコード番号が3未満の場合にレコードを出力します。

Example

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'

このコードを実行すると、次の結果が得られます-

Output

One Two
One Two Three

FNR

NRに似ていますが、現在のファイルに関連しています。AWKが複数のファイルを操作している場合に便利です。FNRの値は新しいファイルでリセットされます。

OFMT

これは出力フォーマット番号を表し、デフォルト値は %.6g

Example

[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'

このコードを実行すると、次の結果が得られます-

Output

OFMT = %.6g

OFS

これは出力フィールド区切り文字を表し、デフォルト値はスペースです。

Example

[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte

このコードを実行すると、次の結果が得られます-

Output

OFS =  $

ORS

これは出力レコード区切り文字を表し、デフォルト値は改行です。

Example

[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte

上記のコードを実行すると、次の結果が得られます-

Output

ORS = $
$

RLENGTH

一致する文字列の長さを表します match関数。AWKの一致関数は、入力文字列内の特定の文字列を検索します。

Example

[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'

このコードを実行すると、次の結果が得られます-

Output

2

RS

これは(入力)レコード区切り文字を表し、デフォルト値は改行です。

Example

[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte

このコードを実行すると、次の結果が得られます-

Output

RS = $
$

RSTART

によって一致する文字列の最初の位置を表します match 関数。

Example

[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'

このコードを実行すると、次の結果が得られます-

Output

9

SUBSEP

配列添え字の区切り文字を表し、デフォルト値は \034

Example

[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte

このコードを実行すると、次の結果が得られます-

Output

SUBSEP = ^\$

$ 0

入力レコード全体を表します。

Example

[jerry]$ awk '{print $0}' marks.txt

このコードを実行すると、次の結果が得られます-

Output

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

$ n

これは、フィールドがFSで区切られている現在のレコードのn番目のフィールドを表します。

Example

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

このコードを実行すると、次の結果が得られます-

Output

Physics   80
Maths     90
Biology   87
English   85
History   89

GNUAWK固有の変数

GNUAWK固有の変数は次のとおりです-

ARGIND

これは、処理中の現在のファイルのARGV内のインデックスを表します。

Example

[jerry]$ awk '{ 
   print "ARGIND   = ", ARGIND; print "Filename = ", ARGV[ARGIND] 
}' junk1 junk2 junk3

このコードを実行すると、次の結果が得られます-

Output

ARGIND   =  1
Filename =  junk1
ARGIND   =  2
Filename =  junk2
ARGIND   =  3
Filename =  junk3

BINMODE

これは、非POSIXシステム上のすべてのファイルI / Oのバイナリモードを指定するために使用されます。1、2、または3の数値は、入力ファイル、出力ファイル、またはすべてのファイルがそれぞれバイナリI / Oを使用する必要があることを指定します。の文字列値r または w入力ファイルまたは出力ファイルがそれぞれバイナリI / Oを使用するように指定します。の文字列値rw または wr すべてのファイルでバイナリI / Oを使用するように指定します。

ERRNO

文字列は、リダイレクトが失敗した場合のエラーを示します getline または close 呼び出しは失敗します。

Example

[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'

このコードを実行すると、次の結果が得られます-

Output

Error: No such file or directory

FIELDWIDTHS

フィールド幅変数のスペース区切りリストが設定され、GAWKは、FS変数の値をフィールド区切り文字として使用する代わりに、入力を固定幅のフィールドに解析します。

IGNORECASE

この変数を設定すると、GAWKでは大文字と小文字が区別されなくなります。次の例はこれを示しています-

Example

[jerry]$ awk 'BEGIN{IGNORECASE = 1} /amit/' marks.txt

このコードを実行すると、次の結果が得られます-

Output

1) Amit  Physics   80

LINT

それはの動的制御を提供します --lint option from the GAWK program. When this variable is set, GAWK prints lint warnings. When assigned the string value fatal, lint warnings become fatal errors, exactly like --lint=fatal.

Example

[jerry]$ awk 'BEGIN {LINT = 1; a}'

On executing this code, you get the following result −

Output

awk: cmd. line:1: warning: reference to uninitialized variable `a'
awk: cmd. line:1: warning: statement has no effect

PROCINFO

This is an associative array containing information about the process, such as real and effective UID numbers, process ID number, and so on.

Example

[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'

On executing this code, you get the following result −

Output

4316

TEXTDOMAIN

It represents the text domain of the AWK program. It is used to find the localized translations for the program's strings.

Example

[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'

On executing this code, you get the following result −

Output

messages

The above output shows English text due to en_IN locale

Like other programming languages, AWK also provides a large set of operators. This chapter explains AWK operators with suitable examples.

S.No. Operators & Description
1 Arithmetic Operators

AWK supports the following arithmetic operators.

2 Increment and Decrement Operators

AWK supports the following increment and decrement operators.

3 Assignment Operators

AWK supports the following assignment operators.

4 Relational Operators

AWK supports the following relational operators.

5 Logical Operators

AWK supports the following logical operators.

6 Ternary Operator

We can easily implement a condition expression using ternary operator.

7 Unary Operators

AWK supports the following unary operators.

8 Exponential Operators

There are two formats of exponential operators.

9 String Concatenation Operator

Space is a string concatenation operator that merges two strings.

10 Array Membership Operator

It is represented by in. It is used while accessing array elements.

11 Regular Expression Operators

This example explains the two forms of regular expressions operators.

AWK is very powerful and efficient in handling regular expressions. A number of complex tasks can be solved with simple regular expressions. Any command-line expert knows the power of regular expressions.

This chapter covers standard regular expressions with suitable examples.

Dot

It matches any single character except the end of line character. For instance, the following example matches fin, fun, fan etc.

Example

[jerry]$ echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'

On executing the above code, you get the following result −

Output

fun
fin
fan

Start of line

It matches the start of line. For instance, the following example prints all the lines that start with pattern The.

Example

[jerry]$ echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'

On executing this code, you get the following result −

Output

There
Their

End of line

It matches the end of line. For instance, the following example prints the lines that end with the letter n.

Example

[jerry]$ echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'

Output

On executing this code, you get the following result −

fun
fin
fan

Match character set

It is used to match only one out of several characters. For instance, the following example matches pattern Call and Tall but not Ball.

Example

[jerry]$ echo -e "Call\nTall\nBall" | awk '/[CT]all/'

Output

On executing this code, you get the following result −

Call
Tall

Exclusive set

In exclusive set, the carat negates the set of characters in the square brackets. For instance, the following example prints only Ball.

Example

[jerry]$ echo -e "Call\nTall\nBall" | awk '/[^CT]all/'

On executing this code, you get the following result −

Output

Ball

Alteration

A vertical bar allows regular expressions to be logically ORed. For instance, the following example prints Ball and Call.

Example

[jerry]$ echo -e "Call\nTall\nBall\nSmall\nShall" | awk '/Call|Ball/'

On executing this code, you get the following result −

Output

Call
Ball

Zero or One Occurrence

It matches zero or one occurrence of the preceding character. For instance, the following example matches Colour as well as Color. We have made u as an optional character by using ?.

Example

[jerry]$ echo -e "Colour\nColor" | awk '/Colou?r/'

On executing this code, you get the following result −

Output

Colour
Color

Zero or More Occurrence

It matches zero or more occurrences of the preceding character. For instance, the following example matches ca, cat, catt, and so on.

Example

[jerry]$ echo -e "ca\ncat\ncatt" | awk '/cat*/'

On executing this code, you get the following result −

Output

ca
cat
catt

One or More Occurrence

It matches one or more occurrence of the preceding character. For instance below example matches one or more occurrences of the 2.

Example

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | awk '/2+/'

On executing the above code, you get the following result −

Output

22
123
234
222

Grouping

Parentheses () are used for grouping and the character | is used for alternatives. For instance, the following regular expression matches the lines containing either Apple Juice or Apple Cake.

Example

[jerry]$ echo -e "Apple Juice\nApple Pie\nApple Tart\nApple Cake" | awk 
   '/Apple (Juice|Cake)/'

On executing this code, you get the following result −

Output

Apple Juice
Apple Cake

AWK has associative arrays and one of the best thing about it is – the indexes need not to be continuous set of number; you can use either string or number as an array index. Also, there is no need to declare the size of an array in advance – arrays can expand/shrink at runtime.

Its syntax is as follows −

Syntax

array_name[index] = value

Where array_name is the name of array, index is the array index, and value is any value assigning to the element of the array.

Creating Array

To gain more insight on array, let us create and access the elements of an array.

Example

[jerry]$ awk 'BEGIN {
   fruits["mango"] = "yellow";
   fruits["orange"] = "orange"
   print fruits["orange"] "\n" fruits["mango"]
}'

On executing this code, you get the following result −

Output

orange
yellow

In the above example, we declare the array as fruits whose index is fruit name and the value is the color of the fruit. To access array elements, we use array_name[index] format.

Deleting Array Elements

For insertion, we used assignment operator. Similarly, we can use delete statement to remove an element from the array. The syntax of delete statement is as follows −

Syntax

delete array_name[index]

The following example deletes the element orange. Hence the command does not show any output.

Example

[jerry]$ awk 'BEGIN {
   fruits["mango"] = "yellow";
   fruits["orange"] = "orange";
   delete fruits["orange"];
   print fruits["orange"]
}'

Multi-Dimensional arrays

AWK only supports one-dimensional arrays. But you can easily simulate a multi-dimensional array using the one-dimensional array itself.

For instance, given below is a 3x3 two-dimensional array −

100   200   300
400   500   600
700   800   900

In the above example, array[0][0] stores 100, array[0][1] stores 200, and so on. To store 100 at array location [0][0], we can use the following syntax −

Syntax

array["0,0"] = 100

Though we gave 0,0 as index, these are not two indexes. In reality, it is just one index with the string 0,0.

The following example simulates a 2-D array −

Example

[jerry]$ awk 'BEGIN {
   array["0,0"] = 100;
   array["0,1"] = 200;
   array["0,2"] = 300;
   array["1,0"] = 400;
   array["1,1"] = 500;
   array["1,2"] = 600;

   # print array elements
   print "array[0,0] = " array["0,0"];
   print "array[0,1] = " array["0,1"];
   print "array[0,2] = " array["0,2"];
   print "array[1,0] = " array["1,0"];
   print "array[1,1] = " array["1,1"];
   print "array[1,2] = " array["1,2"];
}'

On executing this code, you get the following result −

Output

array[0,0] = 100
array[0,1] = 200
array[0,2] = 300
array[1,0] = 400
array[1,1] = 500
array[1,2] = 600

You can also perform a variety of operations on an array such as sorting its elements/indexes. For that purpose, you can use assort and asorti functions

Like other programming languages, AWK provides conditional statements to control the flow of a program. This chapter explains AWK's control statements with suitable examples.

If statement

It simply tests the condition and performs certain actions depending upon the condition. Given below is the syntax of if statement −

Syntax

if (condition)
   action

We can also use a pair of curly braces as given below to execute multiple actions −

Syntax

if (condition) {
   action-1
   action-1
   .
   .
   action-n
}

For instance, the following example checks whether a number is even or not −

Example

[jerry]$ awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d is even number.\n", num }'

On executing the above code, you get the following result −

Output

10 is even number.

If Else Statement

In if-else syntax, we can provide a list of actions to be performed when a condition becomes false.

The syntax of if-else statement is as follows −

Syntax

if (condition)
   action-1
else
   action-2

In the above syntax, action-1 is performed when the condition evaluates to true and action-2 is performed when the condition evaluates to false. For instance, the following example checks whether a number is even or not −

Example

[jerry]$ awk 'BEGIN {
   num = 11; if (num % 2 == 0) printf "%d is even number.\n", num; 
      else printf "%d is odd number.\n", num 
}'

On executing this code, you get the following result −

Output

11 is odd number.

If-Else-If Ladder

We can easily create an if-else-if ladder by using multiple if-else statements. The following example demonstrates this −

Example

[jerry]$ awk 'BEGIN {
   a = 30;
   
   if (a==10)
   print "a = 10";
   else if (a == 20)
   print "a = 20";
   else if (a == 30)
   print "a = 30";
}'

On executing this code, you get the following result −

Output

a = 30

This chapter explains AWK's loops with suitable example. Loops are used to execute a set of actions in a repeated manner. The loop execution continues as long as the loop condition is true.

For Loop

The syntax of for loop is −

Syntax

for (initialization; condition; increment/decrement)
   action

Initially, the for statement performs initialization action, then it checks the condition. If the condition is true, it executes actions, thereafter it performs increment or decrement operation. The loop execution continues as long as the condition is true. For instance, the following example prints 1 to 5 using for loop −

Example

[jerry]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

On executing this code, you get the following result −

Output

1
2
3
4
5

While Loop

The while loop keeps executing the action until a particular logical condition evaluates to true. Here is the syntax of while loop −

Syntax

while (condition)
   action

AWK first checks the condition; if the condition is true, it executes the action. This process repeats as long as the loop condition evaluates to true. For instance, the following example prints 1 to 5 using while loop −

Example

[jerry]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'

On executing this code, you get the following result −

Output

1
2
3
4
5

Do-While Loop

The do-while loop is similar to the while loop, except that the test condition is evaluated at the end of the loop. Here is the syntax of do-whileloop −

Syntax

do
   action
while (condition)

In a do-while loop, the action statement gets executed at least once even when the condition statement evaluates to false. For instance, the following example prints 1 to 5 numbers using do-while loop −

Example

[jerry]$ awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'

On executing this code, you get the following result −

Output

1
2
3
4
5

Break Statement

As its name suggests, it is used to end the loop execution. Here is an example which ends the loop when the sum becomes greater than 50.

Example

[jerry]$ awk 'BEGIN {
   sum = 0; for (i = 0; i < 20; ++i) { 
      sum += i; if (sum > 50) break; else print "Sum =", sum 
   } 
}'

On executing this code, you get the following result −

Output

Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45

Continue Statement

The continue statement is used inside a loop to skip to the next iteration of the loop. It is useful when you wish to skip the processing of some data inside the loop. For instance, the following example uses continue statement to print the even numbers between 1 to 20.

Example

[jerry]$ awk 'BEGIN {
   for (i = 1; i <= 20; ++i) {
      if (i % 2 == 0) print i ; else continue
   } 
}'

On executing this code, you get the following result −

Output

2
4
6
8
10
12
14
16
18
20

Exit Statement

It is used to stop the execution of the script. It accepts an integer as an argument which is the exit status code for AWK process. If no argument is supplied, exit returns status zero. Here is an example that stops the execution when the sum becomes greater than 50.

Example

[jerry]$ awk 'BEGIN {
   sum = 0; for (i = 0; i < 20; ++i) {
      sum += i; if (sum > 50) exit(10); else print "Sum =", sum 
   } 
}'

Output

On executing this code, you get the following result −

Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45

Let us check the return status of the script.

Example

[jerry]$ echo $?

On executing this code, you get the following result −

Output

10

AWK has a number of functions built into it that are always available to the programmer. This chapter describes Arithmetic, String, Time, Bit manipulation, and other miscellaneous functions with suitable examples.

S.No. Built in functions & Description
1 Arithmetic Functions

AWK has the following built-in arithmetic functions.

2 String Functions

AWK has the following built-in String functions.

3 Time Functions

AWK has the following built-in time functions.

4 Bit Manipulation Functions

AWK has the following built-in bit manipulation functions.

5 Miscellaneous Functions

AWK has the following miscellaneous functions.

Functions are basic building blocks of a program. AWK allows us to define our own functions. A large program can be divided into functions and each function can be written/tested independently. It provides re-usability of code.

Given below is the general format of a user-defined function −

Syntax

function function_name(argument1, argument2, ...) { 
   function body
}

In this syntax, the function_name is the name of the user-defined function. Function name should begin with a letter and the rest of the characters can be any combination of numbers, alphabetic characters, or underscore. AWK's reserve words cannot be used as function names.

Functions can accept multiple arguments separated by comma. Arguments are not mandatory. You can also create a user-defined function without any argument.

function body consists of one or more AWK statements.

Let us write two functions that calculate the minimum and the maximum number and call these functions from another function called main. The functions.awk file contains −

Example

# Returns minimum number
function find_min(num1, num2){
   if (num1 < num2)
   return num1
   return num2
}
# Returns maximum number
function find_max(num1, num2){
   if (num1 > num2)
   return num1
   return num2
}
# Main function
function main(num1, num2){
   # Find minimum number
   result = find_min(10, 20)
   print "Minimum =", result
  
   # Find maximum number
   result = find_max(10, 20)
   print "Maximum =", result
}
# Script execution starts here
BEGIN {
   main(10, 20)
}

On executing this code, you get the following result −

Output

Minimum = 10
Maximum = 20

So far, we displayed data on standard output stream. We can also redirect data to a file. A redirection appears after the print or printf statement. Redirections in AWK are written just like redirection in shell commands, except that they are written inside the AWK program. This chapter explains redirection with suitable examples.

Redirection Operator

The syntax of the redirection operator is −

Syntax

print DATA > output-file

It writes the data into the output-file. If the output-file does not exist, then it creates one. When this type of redirection is used, the output-file is erased before the first output is written to it. Subsequent write operations to the same output-file do not erase the output-file, but append to it. For instance, the following example writes Hello, World !!! to the file.

Let us create a file with some text data.

Example

[jerry]$ echo "Old data" > /tmp/message.txt [jerry]$ cat /tmp/message.txt

On executing this code, you get the following result −

Output

Old data

Now let us redirect some contents into it using AWK's redirection operator.

Example

[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }' [jerry]$ cat /tmp/message.txt

On executing this code, you get the following result −

Output

Hello, World !!!

Append Operator

The syntax of append operator is as follows −

Syntax

print DATA >> output-file

It appends the data into the output-file. If the output-file does not exist, then it creates one. When this type of redirection is used, new contents are appended at the end of file. For instance, the following example appends Hello, World !!! to the file.

Let us create a file with some text data.

Example

[jerry]$ echo "Old data" > /tmp/message.txt [jerry]$ cat /tmp/message.txt

On executing this code, you get the following result −

Output

Old data

Now let us append some contents to it using AWK's append operator.

Example

[jerry]$ awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }' [jerry]$ cat /tmp/message.txt

On executing this code, you get the following result −

Output

Old data
Hello, World !!!

Pipe

It is possible to send output to another program through a pipe instead of using a file. This redirection opens a pipe to command, and writes the values of items through this pipe to another process to execute the command. The redirection argument command is actually an AWK expression. Here is the syntax of pipe −

Syntax

print items | command

Let us use tr command to convert lowercase letters to uppercase.

Example

[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'

On executing this code, you get the following result −

Output

HELLO, WORLD !!!

Two way communication

AWK can communicate to an external process using |&, which is two-way communication. For instance, the following example uses tr command to convert lowercase letters to uppercase. Our command.awk file contains −

Example

BEGIN {
   cmd = "tr [a-z] [A-Z]"
   print "hello, world !!!" |& cmd
   close(cmd, "to")
   
   cmd |& getline out
   print out;
   close(cmd);
}

On executing this code, you get the following result −

Output

HELLO, WORLD !!!

Does the script look cryptic? Let us demystify it.

  • The first statement, cmd = "tr [a-z] [A-Z]", is the command to which we establish the two-way communication from AWK.

  • The next statement, i.e., the print command provides input to the tr command. Here &| indicates two-way communication.

  • The third statement, i.e., close(cmd, "to"), closes the to process after competing its execution.

  • The next statement cmd |& getline out stores the output into out variable with the aid of getline function.

  • The next print statement prints the output and finally the close function closes the command.

これまで、AWKを使用してきました print そして printf標準出力にデータを表示する機能。しかし、printfは、これまでに見たものよりもはるかに強力です。この関数はC言語から借用されており、フォーマットされた出力を生成するときに非常に役立ちます。以下はprintfステートメントの構文です-

構文

printf fmt, expr-list

上記の構文では fmt フォーマット仕様と定数の文字列です。 expr-list フォーマット指定子に対応する引数のリストです。

エスケープシーケンス

他の文字列と同様に、フォーマットには埋め込みエスケープシーケンスを含めることができます。以下で説明するのは、AWKでサポートされているエスケープシーケンスです。

改行

次の例は Hello そして World 改行文字を使用して別々の行に-

Example

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

このコードを実行すると、次の結果が得られます-

Output

Hello
World

水平タブ

次の例では、水平タブを使用してさまざまなフィールドを表示しています-

Example

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

上記のコードを実行すると、次の結果が得られます-

Output

Sr No   Name    Sub Marks

垂直タブ

次の例では、各ファイルの後に垂直タブを使用しています-

Example

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

このコードを実行すると、次の結果が得られます-

Output

Sr No
   Name
      Sub
         Marks

バックスペース

次の例では、最後のフィールドを除くすべてのフィールドの後にバックスペースを出力します。最初の3つのフィールドから最後の番号を消去します。例えば、Field 1 として表示されます Field、最後の文字がバックスペースで消去されるため。ただし、最後のフィールドField 4 なかったのでそのまま表示します \bField 4

Example

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

このコードを実行すると、次の結果が得られます-

Output

Field Field Field Field 4

キャリッジリターン

次の例では、すべてのフィールドを印刷した後、 Carriage Return 現在印刷されている値の上に次の値を印刷します。つまり、最終出力では、あなただけが見ることができますField 4、前のすべてのフィールドの上に印刷された最後のものだったので。

Example

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

このコードを実行すると、次の結果が得られます-

Output

Field 4

フォームフィード

次の例では、各フィールドを印刷した後にフォームフィードを使用します。

Example

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

このコードを実行すると、次の結果が得られます-

Output

Sr No
   Name
      Sub
         Marks

フォーマット指定子

C言語と同様に、AWKにもフォーマット指定子があります。printfステートメントのAWKバージョンは、次の変換仕様フォーマットを受け入れます-

%c

1文字を印刷します。引数が%cは数値であり、文字として扱われ、印刷されます。それ以外の場合、引数は文字列であると見なされ、その文字列の最初の文字のみが出力されます。

Example

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

Output

このコードを実行すると、次の結果が得られます-

ASCII value 65 = character A

%dおよび%i

10進数の整数部分のみを出力します。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

Output

Percentags = 80

%eおよび%E

[-] d.dddddde [+-] ddの形式の浮動小数点数を出力します。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

Output

Percentags = 8.066000e+01

ザ・ %E フォーマット使用 E eの代わりに。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

Output

Percentags = 8.066000E+01

%f

[-] ddd.dddddd形式の浮動小数点数を出力します。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

Output

Percentags = 80.660000

%gおよび%G

%eまたは%f変換のいずれか短い方を使用し、有効数字以外のゼロは抑制します。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

Output

このコードを実行すると、次の結果が得られます-

Percentags = 80.66

ザ・ %G フォーマット使用 %E %eの代わりに。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

Output

Percentags = 80.66

%o

符号なし8進数を出力します。

Example

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

このコードを実行すると、次の結果が得られます-

Output

Octal representation of decimal number 10 = 12

%u

符号なし10進数を出力します。

Example

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

このコードを実行すると、次の結果が得られます-

Output

Unsigned 10 = 10

%s

文字列を出力します。

Example

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

このコードを実行すると、次の結果が得られます-

Output

Name = Sherlock Holmes

%xおよび%X

符号なし16進数を出力します。ザ・%X formatは、小文字の代わりに大文字を使用します。

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'

このコードを実行すると、次の結果が得られます-

Output

Hexadecimal representation of decimal number 15 = f

ここで、%Xを使用して、結果を観察します-

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'

このコードを実行すると、次の結果が得られます-

Output

Hexadecimal representation of decimal number 15 = F

%%

シングルを印刷します % 文字であり、引数は変換されません。

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

Output

Percentags = 80%

%を含むオプションのパラメータ

% 以下のオプションパラメータを使用できます-

フィールドはにパディングされます width。デフォルトでは、フィールドにはスペースが埋め込まれますが、0フラグが使用されている場合は、ゼロが埋め込まれます。

Example

[jerry]$ awk 'BEGIN { 
   num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 
}'

このコードを実行すると、次の結果が得られます-

Output

Num1 =         10
Num2 =         20

先行ゼロ

先頭のゼロはフラグとして機能し、出力にスペースではなくゼロを埋め込む必要があることを示します。このフラグは、フィールドが印刷される値よりも広い場合にのみ効果があることに注意してください。次の例はこれを説明しています-

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 
}'

このコードを実行すると、次の結果が得られます-

Output

Num1 = -0010
Num2 = 00020

左揃え

式は、そのフィールド内で左寄せする必要があります。入力文字列が指定された文字数より少なく、左揃えにしたい場合、つまり右側にスペースを追加する場合は、%の直後で数値の前にマイナス記号(–)を使用します。

次の例では、AWKコマンドの出力がcatコマンドにパイプされて、END OF LINE($)文字が表示されます。

Example

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

このコードを実行すると、次の結果が得られます-

Output

Num = 10   $

プレフィックス記号

値が正の場合でも、常に数値の前に符号が付きます。

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2 
}'

このコードを実行すると、次の結果が得られます-

Output

Num1 = -10
Num2 = +20

ハッシュ

%oの場合、先行ゼロを提供します。%xおよび%Xの場合、結果がゼロ以外の場合にのみ、それぞれ先頭の0xまたは0Xを提供します。%e、%E、%f、および%Fの場合、結果には常に小数点が含まれます。%gおよび%Gの場合、後続のゼロは結果から削除されません。次の例はこれを説明しています-

Example

[jerry]$ awk 'BEGIN { 
   printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'

このコードを実行すると、次の結果が得られます-

Output

Octal representation = 012
Hexadecimal representation = 0XA