AWKは、Linuxで最も強力なコマンドの1つです。 awkコマンドを使用して、データを管理し、レポートを生成できます。また、論理演算、変数、印刷関数などを使用することもできます。 AWKは「Aho、Weinberger and Kernighan」の略で、主にパターンのスキャンと処理に使用されます。 1つ以上のファイルを検索して、指定されたパターンに一致する行が含まれているかどうかを確認してから、関連するアクションを実行します。ファイルまたはその標準入力から読み取り、標準出力に出力します。一致が対応するアクションを実行する場合、各行について、指定された順序で指定されたパターンと一致します。
機能
•テキストファイルをレコードおよびフィールドとして表示します
•変数、条件、ループがあります
•算術演算子と文字列演算子があります
•フォーマットされたレポートを生成できます
•文字列またはファイルからテキストを読み取って編集する
このチュートリアルでは、例を使用してAWK Linuxコマンドを調べ、何ができるかを確認します。
AWKのBasix構文
AWKコマンドの基本的な構文を以下に示します。
awk options program input-file
各オプションの簡単な説明を以下に示します:
•-ffs:ファイルセパレータを指定するために使用されます。
•-ffile:awkスクリプトを含むファイルを指定するために使用されます。
•-vvar=value:変数を宣言するために使用されます。
この記事のすべての例の入力ファイルとして、次のテキストファイルを使用します。
cat > contents.txt
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
それでは、AWKコマンドを使用して「contents.txt」という名前のファイルの内容を確認しましょう。
awk '{print}' contents.txt
これにより、ファイルの内容が次のように出力されます。
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
上記の例では、パターンが指定されていないため、ファイル全体が印刷されます。
次に、パターン「sales」に一致するすべての行を印刷します。
awk '/sales/ {print}' contents.txt
これにより、以下に示すように、「sales」という単語を含むすべての行が印刷されます。
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
AWKの変数
AWKには、テキストの行をフィールドと呼ばれる個々の単語または部分に分割するために使用されるいくつかの組み込み変数が付属しています。それらのいくつかを以下に示します:
•$0:行全体に使用されます。
•$1:最初のフィールドに使用されます。
•$2:2番目のフィールドに使用されます。
•$n:n番目のフィールドに使用されます。
•NR:現在のレコードの総数を指定するために使用されます。
•NF:レコード内のフィールドの総数を指定するために使用されます。
•FS:フィールド区切り文字が含まれ、入力行のフィールドを分割するために使用されます。
•RS:現在のレコード区切り文字を格納します。
•OFS:出力フィールドセパレーターを格納し、Awkがフィールドを印刷するときにフィールドを区切るために使用されます。
•ORS:出力レコード区切り文字を格納し、Awkが出力行を印刷するときに出力行を区切るために使用されます。
ここで、ファイルcontents.txtのフィールド番号1と3を、次の構文を使用して出力します。
awk '{print $1,$3}' contents.txt
ファイルcontents.txtの最初と3番目のフィールドのみが表示されます:
hitesh sales
jayesh account
vyom purchase
bhavesh sales
rajesh sales
niraj account
jay purchase
deep sales
AWKコマンドでNRを使用して、すべての行を行番号とともに印刷できます。
awk '{print NR,$0}' contents.txt
出力:
1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
6 niraj clerk account 20000
7 jay peon purchase 23000
8 deep clerk sales 20000
NFを使用して最後のフィールドを表示し、$1を使用して最初のフィールドを表示できます。
awk '{print $1,$NF}' contents.txt
これにより、ファイルcontents.txtの最初と最後のフィールドが出力されます:
hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000
2から5までの行番号を出力するには、以下に示すようにNR変数を使用します。
awk 'NR==2, NR==5 {print NR,$0}' contents.txt
出力:
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
NRを使用してファイルcontents.txtの行数をカウントするには:
awk 'END { print NR }' contents.txt
次の出力が表示されます。
8
BEGINおよびENDブロック
オプションのBEGINブロックとENDブロックもあり、それぞれファイル処理の前後に実行するコマンドを含めることができます。 BEGINブロックは、レコードが処理される前にアクションを実行するために使用され、ENDブロックは、レコードが処理された後にアクションを実行するために使用されます。
AWKコマンドでBEGINブロックとENDブロックを使用するための基本的な構文を以下に示します。
awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file
BEGINブロックとENDブロックを使用して、印刷しているフィールドに関する情報を印刷できます。
次の例では、ファイルcontents.txtの各レコードの2番目のフィールドを処理する前後にメッセージを出力します。
awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt
出力:
Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.
BEGINブロックとENDブロックを使用して、ファイルからデータを変換し、テーブルに変換することもできます。次の例では、ファイル/ etc/passwdをテーブルに変換します。
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; } {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;} END { print "---------\nFile Complete" }' /etc/passwd
出力:
User UID GID Home Shell
--------------
root 0 0 /root /bin/bash
daemon 1 1 /usr/sbin /usr/sbin/nologin
bin 2 2 /bin /usr/sbin/nologin
sys 3 3 /dev /usr/sbin/nologin
sync 4 65534 /bin /bin/sync
games 5 60 /usr/games /usr/sbin/nologin
man 6 12 /var/cache/man /usr/sbin/nologin
lp 7 7 /var/spool/lpd /usr/sbin/nologin
mail 8 8 /var/mail /usr/sbin/nologin
news 9 9 /var/spool/news /usr/sbin/nologin
uucp 10 10 /var/spool/uucp /usr/sbin/nologin
proxy 13 13 /bin /usr/sbin/nologin
www-data 33 33 /var/www /usr/sbin/nologin
---------
File Complete
条件付き検索
AWKコマンドは、if、whileループ、forループなど、いくつかの条件ステートメントもサポートしています。これは、特定の条件に一致する行をフェッチするのに役立ちます。
次の例では、「if」条件を使用して、3番目のフィールドに「sales」を含むすべての行を出力します。
awk '{ if ($3 ~ /sales/) print}' contents.txt
出力:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
次の例では、「for」ループを使用して、各レコードの最初の3つのフィールドを1行に1つずつ出力します。
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
出力:
hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales
次の例では、「while」ループを使用して、各レコードの最初の2つのフィールドを1行に1つずつ出力します。
awk '{ i = 1; while ( i <= 2 ) { print $i i++ } }' contents.txt
出力:
hitesh1
engineer2
jayesh1
director2
vyom1
manager2
bhavesh1
engineer2
rajesh1
directory2
niraj1
clerk2
jay1
peon2
deep1
clerk2
他のコマンドからの出力の処理
ファイル名を指定する代わりに、AWKコマンドを使用して他のコマンドからの出力を解析することもできます。 「ipa」コマンドは、以下に示すように、システムIP、Macアドレス、およびその他のネットワーク関連情報に関する情報を出力します。
ip a s wlan0
出力:
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:bb:58:9c:f5:55 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.3/28 brd 172.20.10.15 scope global wlan0
valid_lft forever preferred_lft forever
inet6 2401:4900:1d71:ef26:8846:95b2:4ca8:aa7d/64 scope global temporary dynamic
valid_lft 600574sec preferred_lft 81574sec
inet6 2401:4900:1d71:ef26:4ebb:58ff:fe9c:f555/64 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::4ebb:58ff:fe9c:f555/64 scope link
valid_lft forever preferred_lft forever
これで、AWKコマンドを使用して、以下に示すようにシステムのIPアドレスのみを出力できます。
ip a s wlan0 | awk -F '[\/ ]+' '/inet / {print $3}
次の出力が表示されます。
172.20.10.3
AWKコマンドアドバンスの例
例1: AWKコマンドを使用すると、指定した文字数で行を印刷できます。たとえば、27文字を超える行を印刷するには、次のコマンドを使用します。
awk 'length($0) > 27' contents.txt
出力:
jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000
例2: 与えられた数の立方体を確認してください
指定された数の立方体を5まで印刷するには、次のコマンドを実行します。
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
出力:
Cube of 1 is 1
Cube of 2 is 8
Cube of 3 is 27
Cube of 4 is 64
Cube of 5 is 125
例3: 指定されたファイルの行数を数えます
指定したファイルの行数を確認し、次のコマンドを使用して印刷できます。
awk 'END { print NR }' contents.txt
出力:
8
例4: 指定されたファイルで最長の行を見つけて、文字を印刷します
次のコマンドを使用して、指定されたファイルで最長の行を見つけ、その行の文字を印刷できます。
awk '{ if (length($0) > max) max = length($0) } END { print max }' contents.txt
出力
29
例5: 特定のファイルの最初の列を並べ替える
ファイルcontents.txtの最初の列を並べ替えて印刷するには、次のコマンドを実行します。
awk -F: '{ print $1 }' contents.txt | sort
出力:
bhavesh engineer sales 30000
deep clerk sales 20000
hitesh engineer sales 30000
jayesh director account 25000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
vyom manager purchase 20000
例6: 偶数行を印刷する
ファイルcontents.txtに偶数行のみを印刷するには、次のコマンドを実行します。
awk 'NR % 2 == 0' contents.txt
出力:
jayesh director account 25000
bhavesh engineer sales 30000
niraj clerk account 20000
deep clerk sales 20000
例7: フィールドセパレータを変更する
フィールドセパレータをスペースから|に変更できます。次のコマンドで印刷します:
awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt
出力:
hitesh|engineer|sales|30000
jayesh|director|account|25000
vyom|manager|purchase|20000
bhavesh|engineer|sales|30000
rajesh|directory|sales|40000
niraj|clerk|account|20000
jay|peon|purchase|23000
deep|clerk|sales|20000
結論
このチュートリアルでは、AWKコマンドを使用して指定されたパターンに一致させ、関連するアクションを実行する方法を学習しました。 AWKコマンドを使用してテキストファイルを操作、フォーマット、および選択的に印刷する方法を明確に理解していただければ幸いです。