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

LinuxのAwkコマンド

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コマンドを使用してテキストファイルを操作、フォーマット、および選択的に印刷する方法を明確に理解していただければ幸いです。


Linux
  1. Linuxmvコマンド

  2. Linuxduコマンド

  3. Linux での awk コマンドの例

  1. LinuxでのAWKコマンドと例

  2. Linuxipコマンド

  3. Linuxcdコマンド

  1. Linuxifconfigコマンド

  2. Linuxタイムコマンド

  3. LinuxでのPingコマンド