Awkコマンド/ツールは、ファイル内のテキストの行や列を操作するために使用されます。 Awkには文字列関数と連想配列が組み込まれています。 Awkは、C言語で利用可能なほとんどの演算子、条件ブロックをサポートしています。 Awkスクリプト
awkスクリプト
良い点の1つは、必要な出力を得るために、他のコマンドと一緒にawkコマンドを使用できることです。
awkの基本的な構文。 ‘BEGIN {start_action} {action}. END {stop_action}’ ファイル名
アクションは以下のとおりです
- Beginブロックはファイルの前に実行されます
- Endブロックはファイルの処理後に実行されます
- 残りのアクションはファイルの処理中に実行されます
例。 testという名前のファイルを作成し、以下のデータを格納する
# cat test
上記のデータから、ファイルにはスペースで区切られた行と列があり、行は改行されていることがわかります。
Command Syntax: awk ‘{print $3}’ test
ここで$3は、テストファイルの全列のうち、3番目の列を表示するという意味です。 複数の列を表示したい場合は、列名をカンマで区切って指定してください。$1,$2,$3….. 以下は、すべての行の3番目の列として出力されます。
# awk '{ print $3 }' testroot# awk '{ print $1,$3,$6 }' test-rw-r--r--. root Apr
ファイルの4番目と6番目の列を表示するには、awk ‘{print $4,$6}’ test
ここでは、awkではbeginとendのブロックは使用されません。 そのため、printコマンドは、ファイルから読み込んだ各行ごとに実行されます。 次の例では、beginとendのブロックを使う方法を見てみましょう。
列値の合計を印刷する
コマンド構文:awk ‘BEGIN {sum=0}. {sum=sum+$7}を表示します。 END {print sum}’ test
上の例では、7列目の値の合計を表示します。 最初のブロックでは、変数sumに値0が代入されています。 次のブロックでは、7列目の値が変数sumに追加されます。 このsum変数への7列目の値の追加は、処理される行ごとに繰り返されます。 すべての行が処理されると、sum変数には7番目の列の値の合計が格納されます。 この値は、以下のように End ブロックに表示されます:
# awk 'BEGIN {sum=0} {sum=sum+$7} END {print sum}' test300
awk スクリプトを使用した列値の合計
2 番目の例では、7 番目の列の値を合計する方法を見ましたが、同じように 1 行のステートメントではなく、スクリプトとして記述します。 sumofcolumnファイルを作成し、そのファイルに以下のスクリプトを貼り付けます
#!/usr/bin/awk -fBEGIN {sum=0} {sum=sum+$7} END {print sum}
さて、以下のようにawkコマンドを使用してスクリプトを実行します
# awk -f sumofcolumn test300
これでsumofcolumnファイルのスクリプトが実行され、テストで7番目の列の合計が表示されます。
文字列を検索し、一致した行を表示する
Command Syntax: awk ‘{if($9 == “arkit”) print $0;}’ test
上記の例では、3 列目にある文字列「arkit」を検索し、一致した場合は行全体を表示します。 この awk コマンドの出力は以下の通りです
# awk '{ if($3 == "arkit") print $0;}' test
記載された値を +1 ずつ増加させていくフォーループ
コマンドの構文。 awk ‘BEGIN { for(i=1;i<=10;i++) print “Multiplied value of”, i, “is”,i*i; }’
上記のコマンドは、1から10までの最初の数字の乗算を表示します。 i++はその数字に+1を加え、10まで増え続けるようにします。 コマンドの出力は以下のとおりです
# awk 'BEGIN { for(i=1;i<=10;i++) print "Multiplied value of", i, "is",i*i; }'Multiplied value of 1 is 1
6. 入力フィールドのセパレーター
すでに、行全体、1列目、2列目をそれぞれ表示する$0、$1、$2…を見てきました。
テストファイルの例では、スペースで区切られた列がありますが、スペースの代わりに .のような他の記号があれば、それを利用して区切って表示することができます。
例として、セパレータに : (コロン)を使った場合、以下のようになります
awk ‘BEGIN {FS=”:”} {print $2}’ testp {print $2}’ test
OR
awk -F: ‘{print $2}’ test
これで以下のように出力されます
# awk -F: '{print $2}' test41 file12
OFS – Output field separator variable
デフォルトでは、print文を使ってフィールドを印刷する際には、スペースを区切り文字として表示されます。 例えば
コマンド構文: awk ‘{print $4,5}’ test
# awk '{print $4,$5}' testroot 0
OFS 変数を使用して、このデフォルトの動作を次のように変更できます
コマンド構文: awk ‘BEGIN {OFS=”:”}。 {print $4,5}’ test
# awk 'BEGIN {OFS=":"} {print $4,$5}' testroot:0
注意: print $4,5 と print $4$5 は同じようには動作しません。 最初のものは、スペースをデリミタとして出力を表示します。 2番目のものは、デリミタを使わずに出力を表示します。
NF – フィールドの数
NFは各行のフィールドの数を知るために使用できます。 – レコード数
NRは、ファイルの行数を知るために使用できます
# awk '{print NR}' test12345678910
上記の例では、行数が表示されます。 テストファイルには10行あります。
特定のファイルのレコード数を表示する
上の第9セクションの例ではすべての行番号が表示されていますが、要件としてはレコード数のみを表示したい場合です。
# awk 'END {print NR}' test10
これはテストファイルの合計行数を表示します。
Awkの文字列関数:
Awkの文字列関数には次のようなものがあります。
- index(string,search)
- length(string)
- split(string,array,separator)
- substr(string,position)
- substr(string,position,max)
- tolower(string)
- toupper(string)
より進んだ例。
Awkのsplit関数を使った行のフィルタリング
Awkのsplit関数は、文字列をデリミタを使って配列に分割します。
split関数の構文は
split(string, array, delimiter)
ここでは、split関数を使用して行をフィルタリングする方法を例を挙げて説明します。
入力の「advanced.txt」には、次の形式のデータが含まれています
# cat advanced.txt1 U,N,ARKIT,0002 A,B,TEST,1113 I,M,ARKIT,2224 C,D,TECH,3335 T,I,RAVI,444
必要な出力です。 ここでは、第2フィールドが第3フィールドとして文字列「ARKIT」を持つ行のみを印刷する必要があります。
The output is:1 U,N,ARKIT,0003 I,M,ARKIT,222
出力を得るための awk コマンドは以下のとおりです
Command: awk '{ split($2,arr,","); if(arr == "0") print $0 } ' advanced.txt
# awk '{ split($2,arr,","); if(arr == "ARKIT") print $0} ' advanced.txt1 U,N,ARKIT,0003 I,M,ARKIT,222
いくつかの awk コマンド/ツールの例は、次回の記事で紹介します。
キーワードです。 linuxでのawkスクリプト,linuxでawkスクリプトを実行する方法,linuxでawkスクリプトを書く方法,linuxでのbashでのawk,linuxでのawkコマンド,linuxでのawkスクリプト例,linuxでのawk例,linuxでのawkの意味,linuxでのawkのpdf,linuxでのawkのプログラミング。awk in linux ppt,awk in linux shell script,awk command in linux shell scripting,awk in linux tutorial,awk in linux terminal,awk in linux with examples, awk scripting, awk scripting, awk scripting, awk scripting
お読みいただきありがとうございます。