ウェブサイト検索

20 個の awk の例


20 の awk の例

Linux オペレーティング システムには、テキスト データやファイルからレポートを検索して生成するためのユーティリティ ツールが多数存在します。ユーザーは、awk、grep、および sed コマンドを使用して、さまざまな種類の検索、置換、レポート生成タスクを簡単に実行できます。 awk は単なるコマンドではありません。ターミナルとawkファイルの両方から使用できるスクリプト言語です。他のスクリプト言語と同様に、変数、条件文、配列、ループなどをサポートします。任意のファイルの内容を 1 行ずつ読み取り、特定の区切り文字に基づいてフィールドまたは列を区切ることができます。また、テキスト コンテンツまたはファイル内の特定の文字列を検索するための正規表現もサポートしており、一致する文字列が見つかった場合はアクションを実行します。このチュートリアルでは、20 の役立つ例を使用して、awk コマンドとスクリプトの使用方法を示します。

内容:

  1. printf を使用した awk

  2. awk 空白で分割する

  3. awk 区切り文字を変更する

  4. タブ区切りデータを持つ awk

  5. CSV データを含む awk

  6. awk 正規表現

  7. awk 大文字と小文字を区別しない正規表現

  8. nf (フィールド数) 変数を使用した awk

  9. awk gensub() 関数

  10. awk と rand() 関数

  11. awk ユーザー定義関数

  12. ああ、もし

  13. awk 変数

  14. awk 配列

  15. awk ループ

  16. awk で最初の列を出力します

  17. awk で最後の列を出力します

  18. grep を使用した awk

  19. awk と bash スクリプト ファイル

  20. sed を使用した awk

printf で awk を使用する

printf() 関数は、ほとんどのプログラミング言語で出力をフォーマットするために使用されます。この関数をawk コマンドと一緒に使用すると、さまざまな種類のフォーマットされた出力を生成できます。 awk コマンドは主にテキスト ファイルに使用されます。以下に示す内容を含む employee.txt という名前のテキスト ファイルを作成します。フィールドはタブ (「 」) で区切られています。

従業員.txt

1001 John sena 40000
1002 Jafar Iqbal   60000
1003 Meher Nigar   30000
1004 Jonny Liver   70000

次の awk コマンドは、employee.txt ファイルからデータを 1 行ずつ読み取り、フォーマット後に最初のファイルを出力します。ここでは、「%10s」 」は、出力の長さが 10 文字であることを意味します。出力の値が 10 文字未満の場合は、値の前にスペースが追加されます。

$ awk '{ printf  "%10s\n", $1 }' employee.txt

出力:

コンテンツに移動

空白で分割するのが難しい

テキストを分割するためのデフォルトの単語またはフィールド区切り文字は空白です。 awk コマンドは、さまざまな方法でテキスト値を入力として受け取ることができます。次の例では、入力テキストが echo コマンドから渡されます。 「プログラミングが好き」というテキストはデフォルトの区切り文字であるスペースで分割され、3番目の単語が出力として印刷されます。

$ echo 'I like programming' | awk '{ print $3 }'

出力:

コンテンツに移動

区切り文字を変更する必要があります

awk コマンドを使用すると、任意のファイル内容の区切り文字を変更できます。次の内容を含む phone.txt という名前のテキスト ファイルがあるとします。ファイル コンテンツのフィールド区切り文字として「:」が使用されているとします。

phone.txt

+123:334:889:778
+880:1855:456:907
+9:7777:38644:808

次の awk コマンドを実行して、区切り文字 「:」「-」 でファイルの内容 phone.txt に変更します。

$ cat phone.txt
$ awk '$1=$1' FS=":" OFS="-" phone.txt

出力:

コンテンツに移動

タブ区切りデータを含む awk

awk コマンドには、さまざまな方法でテキストを読み取るために使用される多くの組み込み変数があります。そのうちの 2 つはFSOFSです。 FS は入力フィールド区切り文字、OFS は出力フィールド区切り変数です。これらの変数の使用法をこのセクションで示します。次の内容を含む input.txt という名前のタブ 区切りファイルを作成し、FS 変数と OFS 変数の使用をテストします。 。

Input.txt

Client-side   scripting language
Server-side   scripting language
Database  Server
Web  Server

タブで FS 変数を使用する

次のコマンドは、input.txt ファイルの各行をタブ (「 」) に基づいて分割し、各行の最初のフィールドを出力します。

$ awk '{ print $1 }' FS='\t' input.txt

出力:

タブで OFS 変数を使用する

次の awk コマンドは、'ls -l' の 9th フィールドと 5th フィールドを出力します。列タイトル「名前 」と「サイズ 」を出力した後、タブ区切りを含む コマンド出力。ここでは、OFS 変数を使用して出力をタブでフォーマットします。

$ ls -l
$ ls -l | awk -v OFS='\t' 'BEGIN { printf "%s\t%s\n", "Name", "Size"} {print $9,$5}'

出力:

コンテンツに移動

CSV データを含む awk

CSV ファイルの内容は、awk コマンドを使用して複数の方法で解析できます。 awk コマンドを適用するには、次の内容を含む「customer.csv」という名前の CSV ファイルを作成します。

customer.txt

Id, Name, email, phone
1, Sophia, sophia@yahoo.com, (862) 478-7263
2, Amelia, amelia@gmail.com, (530) 764-8000
3, Emma, emma@hotmail.com, (542) 986-2390

CSV ファイルの単一フィールドの読み取り

「-F」 オプションは、ファイルの各行を分割するための区切り文字を設定するために awk コマンドで使用されます。次の awk コマンドは、customer.csv ファイルのname フィールドを出力します。

$ cat customer.csv
$ awk -F "," '{print $2}' customer.csv

他のテキストと組み合わせて複数のフィールドを読み取る

次のコマンドは、タイトル テキスト、名前、電子メール、 電話を組み合わせて、customer.csv の 3 つのフィールドを出力します。 customer.csv ファイルの最初の行には、各フィールドのタイトルが含まれています。 NR 変数には、awk コマンドがファイルを解析するときのファイルの行番号が含まれます。この例では、NR 変数を使用してファイルの最初の行を省略します。出力には、最初の行を除くすべての行の 2nd、3rd、および 4th フィールドが表示されます。

$ awk  -F "," 'NR>1 {print "Name:" $2 ", Email:" $3 ", Phone:" $4}' customer.csv

出力:

awk スクリプトを使用した CSV ファイルの読み取り

awk ファイルを実行することで awk スクリプトを実行できます。この例では、awk ファイルを作成してファイルを実行する方法を示します。次のコードを使用して、awkcsv.awk という名前のファイルを作成します。 BEGIN キーワードは、他のタスクを実行する前に最初に BEGIN 部分のスクリプトを実行するように awk コマンドに通知するためにスクリプト内で使用されます。ここでは、フィールド区切り文字 (FS) を使用して分割区切り文字を定義し、2nd フィールドと 1st フィールドは、で使用される形式に従って印刷されます。 printf()関数。

awkcsv.awk
BEGIN {FS = ","} {printf "%5s(%s)\n", $2,$1}

次のコマンドで、customer.csv ファイルの内容を含む awkcsv.awk ファイルを実行します。

$ awk -f awkcsv.awk customer.csv

出力:

コンテンツに移動

awk 正規表現

正規表現は、テキスト内の文字列を検索するために使用されるパターンです。正規表現を使用すると、さまざまな種類の複雑な検索および置換タスクを非常に簡単に実行できます。このセクションでは、awk コマンドを使用した正規表現の簡単な使用法をいくつか示します。

Matching character set

次のコマンドは、単語 Fool または bool または Cool を入力文字列と照合し、単語が見つかった場合は出力します。ここでは人形が一致せず、印刷されません。

$ printf "Fool\nCool\nDoll\nbool" | awk '/[FbC]ool/'

出力:

行頭の文字列を検索

「^」 記号は、行頭の任意のパターンを検索するために正規表現で使用されます。次の例では、テキストの各行の先頭で「Linux」 という単語が検索されます。ここでは、2 行がテキスト ‘Linux’ で始まり、これらの 2 行が出力に表示されます。

$ echo -e "Linux is free to use\n It is an open-source software\nLinuxHint is
 a popular blog site"
| awk '/^Linux/'

出力:

行末の文字列を検索する

「$」 記号は正規表現で使用され、テキストの各行の末尾にあるパターンを検索します。次の例では、「Script」という単語が検索されます。ここでは、2 行の行末に「Script 」という単語が含まれています。

$ echo -e "PHP Script\nJavaScript\nVisual Programming" | awk '/Script$/'

出力:

特定の文字セットを省略して検索

'^' 記号は、文字列パターン ('/^…/') の前、または < で宣言された文字セットの前で使用される場合、テキストの始まりを示します。strong>^[…]。 「^」 記号が 3 番目の括弧 [^…] 内で使用されている場合、括弧内に定義されている文字セットは検索時に省略されます。次のコマンドは、「F」 で始まり「ool」で終わる単語を検索します。パターンと文字データに応じてクールブールが印刷されます。

$ printf "Fool\nCool\nDoll\nbool" | awk '/[^F]ool/'

出力:

コンテンツに移動

awk 大文字と小文字を区別しない正規表現

デフォルトでは、正規表現は文字列内のパターンを検索するときに大文字と小文字を区別して検索します。大文字と小文字を区別しない検索は、awk コマンドで正規表現を使用して実行できます。次の例では、to lower() 関数を使用して大文字と小文字を区別しない検索が行われます。ここでは、入力テキストの各行の最初の単語が to lower() 関数を使用して小文字に変換され、正規表現パターンと照合されます。 toupper() 関数もこの目的に使用できます。この場合、パターンはすべて大文字で定義する必要があります。次の例で定義されているテキストには、出力として印刷される検索語 「web」 が 2 行に含まれています。

$ echo -e "Web Design\nweb development\nFramework" | awk 'tolower($0) ~ /^web/;'

出力:

コンテンツに移動

NF (フィールド数) 変数を使用した awk

NF は、入力テキストの各行のフィールドの総数をカウントするために使用される awk コマンドの組み込み変数です。複数の行と複数の単語を含むテキスト ファイルを作成します。ここでは、前の例で作成したinput.txt ファイルを使用します。

コマンドラインから NF を使用する

ここで、最初のコマンドは input.txt ファイルの内容を表示するために使用され、2 番目のコマンドは NF を使用してファイルの各行のフィールドの合計数を表示するために使用されます。変数。

$ cat input.txt
$ awk '{print NF}' input.txt

出力:

awk ファイルでの NF の使用

以下に示すスクリプトを使用して、count.awk という名前の awk ファイルを作成します。このスクリプトがテキスト データで実行されると、合計フィールドを含む各行の内容が出力として印刷されます。

カウント.awk

{print $0}
{print "[Total fields:" NF "]"}

以下のコマンドでスクリプトを実行します。

$ awk -f count.awk input.txt

出力:

コンテンツに移動

awk gensub() 関数

gestb() は、特定の区切り文字または正規表現パターンに基づいて文字列を検索するために使用される置換関数です。この関数は、「gawk」 パッケージで定義されており、デフォルトではインストールされません。この関数の構文を以下に示します。最初のパラメータには正規表現パターンまたは検索区切り文字が含まれ、2 番目のパラメータには置換テキストが含まれ、3 番目のパラメータには検索の実行方法が示され、最後のパラメータにはこの関数が適用されるテキストが含まれます。

構文:

gensub(regexp, replacement, how [, target])

次のコマンドを実行して、awk コマンドで gestb() 関数を使用するための gawk パッケージをインストールします。

$ sudo apt-get install gawk

この例を実践するには、次の内容を含む「salesinfo.txt」という名前のテキスト ファイルを作成します。ここでは、フィールドはタブで区切られています。

販売情報.txt

Mon  700000
Tue       800000
Wed  750000
Thu       200000
Fri  430000
Sat  820000

次のコマンドを実行して、salesinfo.txt ファイルの数値フィールドを読み取り、すべての売上金額の合計を出力します。ここで、3 番目のパラメータ「G」はグローバル検索を示します。つまり、パターンはファイルの完全な内容で検索されます。

$ awk '{ x=gensub("\t","","G",$2); printf x "+" } END{ print 0 }' salesinfo.txt | bc -l

出力:

コンテンツに移動

rand() 関数を使用した awk

rand() 関数は、0 より大きく 1 未満の乱数を生成するために使用されます。したがって、常に 1 未満の小数を生成します。次のコマンドは小数乱数を生成し、乗算します。 1 より大きい数値を取得するには、値に 10 を加えます。 printf() 関数を適用すると、小数点以下 2 桁の小数が出力されます。次のコマンドを複数回実行すると、毎回異なる出力が得られます。

$ awk 'BEGIN {printf "Number is =%.2f\n" , rand()*10}'

出力:

コンテンツに移動

awk ユーザー定義関数

前の例で使用されている関数はすべて組み込み関数です。ただし、awk スクリプトでユーザー定義関数を宣言して、特定のタスクを実行することができます。長方形の面積を計算するカスタム関数を作成するとします。このタスクを実行するには、次のスクリプトを使用して「area.awk」という名前のファイルを作成します。この例では、入力パラメータに基づいて面積を計算し、面積値を返す area() という名前のユーザー定義関数がスクリプト内で宣言されています。ここでは、ユーザーからの入力を取得するために getline コマンドが使用されています。

エリア.awk

# Calculate area
function area(height,width){
return height*width
}

# Starts execution
BEGIN {
print "Enter the value of height:"
getline h < "-"
print "Enter the value of width:"
getline w < "-"
print "Area = " area(h,w)
}

スクリプトを実行します。

$ awk -f area.awk

出力:

コンテンツに移動

awk if 例

awk は、他の標準プログラミング言語と同様に条件付きステートメントをサポートします。このセクションでは、3 つの例を使用して 3 種類の if ステートメントを示します。次の内容を含む items.txt という名前のテキスト ファイルを作成します。

アイテム.txt

HDD  Samsung   $100
Mouse  A4Tech
Printer   HP   $200

簡単な例:

次のコマンドは、items.txt ファイルの内容を読み取り、各行の 3rd フィールドの値を確認します。値が空の場合は、行番号を含むエラー メッセージが出力されます。

$ awk '{ if ($3 == "") print "Price field is missing in line " NR }'  items.txt

出力:

if-else の例:

次のコマンドは、行に 3rd フィールドが存在する場合は商品価格を出力し、それ以外の場合はエラー メッセージを出力します。

$ awk '{ if ($3 == "") print "Price field is missing"
else print "item price is " $3 }'
  items.txt

出力:

if-else-if の例:

次のコマンドが端末から実行されると、ユーザーからの入力を受け取ります。入力値は、条件が true になるまで各 if 条件と比較されます。いずれかの条件が true になると、対応するグレードが出力されます。入力値がどの条件とも一致しない場合、印刷は失敗します。

$ awk 'BEGIN { print "Enter the mark:"
getline mark <  "-"
if (mark >= 90) print "A+"
else if( mark >= 80) print "A"
else if( mark >= 70) print "B+"
else print "Fail" }'

出力:

コンテンツに移動

awk 変数

awk 変数の宣言は、シェル変数の宣言と似ています。変数の値の読み取りには違いがあります。 「$」記号は、値を読み取るシェル変数の変数名とともに使用されます。ただし、値を読み取るために awk 変数で「$」を使用する必要はありません。

単純な変数を使用する:

次のコマンドは、「site」 という名前の変数を宣言し、文字列値がその変数に割り当てられます。変数の値は次のステートメントで出力されます。

$ awk 'BEGIN{ site="LinuxHint.com"; print site}'

出力:

変数を使用してファイルからデータを取得する

次のコマンドは、ファイル items.txt 内で単語 「Printer」 を検索します。ファイルの行が 'Printer' で始まる場合、1st2nd の値が保存されます。 3rd フィールドを 3 つの変数に変換します。 名前 価格 変数が出力されます。

$ awk '/Printer/ { name=$1;brand=$2;price=$3;print "item name=" name;
 print "item price=" price }'
items.txt

出力:

コンテンツに移動

awk 配列

awk では、数値配列と関連する配列の両方を使用できます。 awk での配列変数の宣言は他のプログラミング言語と同じです。このセクションでは、配列の使用例をいくつか示します。

連想配列:

配列のインデックスは、連想配列の任意の文字列になります。この例では、3 つの要素の連想配列が宣言され、出力されます。

$ awk 'BEGIN {
books["Web Design"] = "Learning HTML 5";
books["Web Programming"] = "PHP and MySQL"
books["PHP Framework"]="Learning Laravel 5"
printf "%s\n%s\n%s\n", books["Web Design"],books["Web Programming"],
books["PHP Framework"] }'

出力:

数値配列:

3 つの要素の数値配列が宣言され、タブで区切って出力されます。

$ awk 'BEGIN {
number[0] = 80;
number[1] = 55;
number[2] = 76;
&nbsp
# print array elements
printf  "Array values: %d\t%d\t%d\n", number[0],number[1],number[2]; }'

出力:

コンテンツに移動

awk ループ

awk では 3 種類のループがサポートされています。ここでは、これらのループの使用法を 3 つの例を使用して示します。

While ループ:

次のコマンドで使用されている while ループは 5 回繰り返し、break ステートメントのループを終了します。

$  awk 'BEGIN { n = 1; while (n <= 10) { if(n > 5) break; print n; n++ } }'

出力:

for ループ:

次の awk コマンドで使用される for ループは、1 から 10 までの合計を計算し、値を出力します。

$ awk 'BEGIN { sum=0; for (n = 1; n <= 10; n++) sum=sum+n; print sum }'

出力:

Do-while ループ:

次のコマンドの do-while ループは、10 から 5 までのすべての偶数を出力します。

$ awk 'BEGIN {counter = 10; do { if (counter%2 ==0) print counter; counter-- }
while (counter > 5) }'

出力:

コンテンツに移動

awk で最初の列を出力します

awk で $1 変数を使用すると、任意のファイルの最初の列を出力できます。ただし、最初の列の値に複数の単語が含まれている場合は、最初の列の最初の単語のみが印刷されます。特定の区切り文字を使用すると、最初の列を適切に印刷できます。次の内容を含む students.txt という名前のテキスト ファイルを作成します。ここで、最初の列には 2 つの単語のテキストが含まれています。

学生.txt

Kaniz Fatema       30<sup>th</sup> batch
Abir Hossain       35<sup>th</sup> batch
John Abraham       40<sup>th</sup> batch

区切り文字を付けずに awk コマンドを実行します。最初の列の最初の部分が印刷されます。

$ awk '{print $1}' students.txt

次の区切り文字を使用して awk コマンドを実行します。最初の列の全体が印刷されます。

$ awk -F '\\s\\s' '{print $1}' students.txt

出力:

コンテンツに移動

awk で最後の列を出力します

$ (NF) 変数を使用すると、任意のファイルの最後の列を出力できます。次の awk コマンドは、students.txt ファイルの最後の列の最後の部分と完全な部分を出力します。

$ awk '{print $(NF)}' students.txt
$ awk -F '\\s\\s' '{print $(NF)}' students.txt

出力:

コンテンツに移動

grep を使用した awk

grep は、正規表現に基づいてファイル内のコンテンツを検索する Linux のもう 1 つの便利なコマンドです。 awk コマンドと grep コマンドの両方をどのように併用できるかを次の例に示します。 grep コマンドは、employee.txt ファイルから従業員 ID「1002」の情報を検索するために使用されます。 grep コマンドの出力は、入力データとして awk に送信されます。 5% のボーナスは、awk コマンドによって従業員 ID「1002」の給与に基づいてカウントされ、出力されます。

$ cat employee.txt
$ grep '1002' employee.txt | awk -F '\t' '{ print $2 " will get $" ($3*5)/100 " bonus"}'

出力:

コンテンツに移動

BASH ファイルを含む awk

他の Linux コマンドと同様に、awk コマンドも BASH スクリプトで使用できます。次の内容を含む customers.txt という名前のテキスト ファイルを作成します。このファイルの各行には 4 つのフィールドに関する情報が含まれています。これらは、顧客の ID、名前、住所、携帯電話番号を 「/」で区切って表示されます。

customers.txt

AL4934 / Charles M Brunner / 4838  Beeghley Street, Huntsville,Alabama / 256-671-7942
CA5455 / Virginia S Mota / 930  Bassel Street,VALLECITO,California / 415-679-5908
IL4855 / Ann A Neale / 1932  Patterson Fork Road,Chicago,Illinois / 773-550-5107

次のスクリプトを使用して、item_search.bash という名前の bash ファイルを作成します。このスクリプトによると、状態値はユーザーから取得され、grep コマンドによってcustomers.txt ファイル内で検索され、入力として awk コマンドに渡されます。 awk コマンドは、各行の 2nd フィールドと 4th フィールドを読み取ります。入力値が customers.txt ファイルのいずれかの状態値と一致する場合は、顧客の名前携帯電話番号が出力されます。そうでない場合は、 「顧客が見つかりません」というメッセージを出力します。

アイテム検索.bash

#!/bin/bash
echo "Enter the state name:"
read state
customers=`grep "$state" customers.txt | awk -F "/" '{print "Customer Name:" $2, ",
Mobile No:" $4}'
`
if [ "$customers" != "" ]; then
echo $customers
else
echo "No customer found"
fi

次のコマンドを実行して出力を表示します。

$ cat customers.txt
$ bash item_search.bash

出力:

コンテンツに移動

sed を使用した awk

Linux のもう 1 つの便利な検索ツールはsed です。このコマンドは、任意のファイルのテキストの検索と置換の両方に使用できます。次の例は、awk コマンドと sed コマンドの使用を示しています。ここで、sed コマンドは「J」で始まるすべての従業員名を検索し、入力として awk コマンドに渡します。 awk は、書式設定後に従業員の名前IDを出力します。

$ cat employee.txt
$ sed -n '/J/p' employee.txt | awk -F '\t' '{ printf "%s(%s)\n", $2, $1 }'

出力:

コンテンツに移動

結論:

awk コマンドを使用すると、データを適切にフィルタリングした後、表形式または区切りデータに基づいてさまざまなタイプのレポートを作成できます。このチュートリアルで示されている例を練習した後、awk コマンドがどのように機能するかを学習できることを願っています。