Linuxオペレーティングシステムには、テキストデータまたはファイルからレポートを検索および生成するための多くのユーティリティツールが存在します。ユーザーは、awk、grep、およびsedコマンドを使用して、さまざまなタイプの検索、置換、およびレポート生成タスクを簡単に実行できます。 awkは単なるコマンドではありません。これは、ターミナルとawkファイルの両方から使用できるスクリプト言語です。他のスクリプト言語と同様に、変数、条件文、配列、ループなどをサポートします。ファイルの内容を1行ずつ読み取り、特定の区切り文字に基づいてフィールドまたは列を区切ることができます。また、テキストコンテンツまたはファイル内の特定の文字列を検索するための正規表現をサポートし、一致するものが見つかった場合にアクションを実行します。このチュートリアルでは、awkコマンドとスクリプトの使用方法を20の便利な例を使用して示します。
コンテンツ:
- printfでawk
- 空白で分割するawk
- 区切り文字を変更するawk
- タブ区切りのデータを使用したawk
- csvデータを使用したawk
- awk正規表現
- awkの大文字と小文字を区別しない正規表現
- nf(フィールド数)変数を使用したawk
- awk gensub() function
- rand()関数を使用したawk
- awkユーザー定義関数
- awk if
- awk変数
- awk配列
- awkループ
- awkで最初の列を印刷します
- awkで最後の列を印刷します
- grepでawk
- bashスクリプトファイルでawk
- sedでawk
printfでawkを使用する
printf() 関数は、ほとんどのプログラミング言語で出力をフォーマットするために使用されます。この機能は、 awk さまざまなタイプのフォーマットされた出力を生成するコマンド。 awkコマンドは、主に任意のテキストファイルに使用されます。名前の付いたテキストファイルを作成します employee.txt 以下の内容で、フィールドはタブ( ‘ t’)で区切られています。
employee.txt
1001ジョン・シナ40000
1002ジャファーイクバル60000
1003 Meher Nigar 30000
1004ジョニー肝臓70000
次のawkコマンドはからデータを読み取ります employee.txt 1行ずつファイルし、フォーマット後に最初にファイルしたファイルを印刷します。ここ、 %10秒 n 出力が10文字の長さになることを意味します。出力の値が10文字未満の場合、値の前にスペースが追加されます。
$ awk'{printf'%10sNS'、$ 1}'社員。txt
出力:
空白で分割するawk
テキストを分割するためのデフォルトの単語またはフィールド区切り文字は空白です。 awkコマンドは、さまざまな方法でテキスト値を入力として受け取ることができます。入力テキストはから渡されます 捨てた 次の例のコマンド。テキスト、 ‘ 私はプログラミングが好きです ’はデフォルトで区切り文字に分割されます。 スペース 、および3番目の単語が出力として出力されます。
$捨てた 「私はプログラミングが好きです」 | awk '{print $ 3}'出力:
区切り文字を変更するawk
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つは FS と OFS 。 FS 入力フィールドセパレータであり、 OFS 出力フィールドセパレータ変数です。このセクションでは、これらの変数の使用法を示します。を作成します タブ 名前の分離されたファイル input.txt の使用をテストするために次のコンテンツで FS と OFS 変数。
Input.txt
クライアント側のスクリプト言語サーバーサイドスクリプト言語
データベースサーバー
Webサーバー
タブでFS変数を使用する
次のコマンドは、の各行を分割します input.txt タブ(「 t」)に基づいてファイルし、各行の最初のフィールドを印刷します。
$awk '{print $ 1}' FS='NS'input.txt出力:
タブでOFS変数を使用する
次のawkコマンドは、 9NS と 5NS のフィールド 「ls-l」 列タイトルを印刷した後のタブ区切り文字付きのコマンド出力 名前 と サイズ 。ここ、 OFS 変数は、タブによる出力のフォーマットに使用されます。
$ls -NS$ls -NS | awk -v OFS='NS' 'BEGIN {printf'%s t%s n '、' Name '、' Size '} {print $ 9、$ 5}'
出力:
CSVデータを使用したawk
CSVファイルの内容は、awkコマンドを使用して複数の方法で解析できます。 ‘という名前のCSVファイルを作成します customer.csv ’に次の内容を追加して、awkコマンドを適用します。
customer.txt
ID、名前、メールアドレス、電話番号1、ソフィア、[メール保護]、(862)478-7263
2、アメリア、[メール保護]、(530)764-8000
3、Emma、[メール保護]、(542)986-2390
CSVファイルの単一フィールドの読み取り
'-NS' オプションをawkコマンドとともに使用して、ファイルの各行を分割するための区切り文字を設定します。次のawkコマンドは、 名前 の分野 customer.csv ファイル。
$猫customer.csv$awk -NS '、' '{print $ 2}'customer.csv
出力:
他のテキストと組み合わせて複数のフィールドを読む
次のコマンドは、次の3つのフィールドを出力します。 customer.csv タイトルテキストを組み合わせることにより、 名前、メールアドレス、電話番号 。の最初の行 customer.csv ファイルには、各フィールドのタイトルが含まれています。 番号 変数には、awkコマンドがファイルを解析するときのファイルの行番号が含まれます。この例では、 NR 変数は、ファイルの最初の行を省略するために使用されます。出力には2が表示されますNS、3rdおよび4NS最初の行を除くすべての行のフィールド。
$awk -NS '、' 'NR> 1 {print'名前: '$ 2'、電子メール: '$ 3'、電話: '$ 4}'customer.csv出力:
awkスクリプトを使用してCSVファイルを読み取る
awkスクリプトは、awkファイルを実行することで実行できます。この例では、awkファイルを作成して実行する方法を示しています。名前の付いたファイルを作成します awkcsv.awk 次のコードで。 始める キーワードは、スクリプトを実行するようにawkコマンドに通知するためのスクリプトで使用されます。 始める 他のタスクを実行する前に、最初にパートします。ここでは、フィールド区切り文字( FS )は分割区切り文字と2を定義するために使用されますNSおよび1NSフィールドは、printf()関数で使用される形式に従って出力されます。
awkcsv。awk始める{{FS= '、'} {{ printf '%5s(%s)NS'、$2、$1}
走る awkcsv.awk の内容を含むファイル customer.csv 次のコマンドでファイルします。
$awk -NSawkcsv.awk customer.csv出力:
awk正規表現
正規表現は、テキスト内の任意の文字列を検索するために使用されるパターンです。正規表現を使用すると、さまざまな種類の複雑な検索および置換タスクを非常に簡単に実行できます。このセクションでは、awkコマンドを使用した正規表現の簡単な使用法をいくつか示します。
一致する文字設定次のコマンドは単語と一致します ばかまたはブール また いいね 入力文字列を使用して、単語が見つかった場合に出力します。ここ、 人形 一致せず、印刷されません。
$printf 'バカNSいいねNS人形NSbool ' | awk '/ [FbC] ool /'出力:
行頭の文字列を検索
‘^’ 記号は、行の先頭にある任意のパターンを検索するために正規表現で使用されます。 ‘ Linux ’ 次の例では、テキストの各行の先頭で単語が検索されます。ここでは、2行がテキストで始まります。 「Linux ’とそれらの2行が出力に表示されます。
$捨てた -と 'Linuxは無料で使用できますNSオープンソースソフトウェアですNSLinuxHintは人気のブログサイト」 | awk '/ ^ Linux /'
出力:
行末の検索文字列
‘$’ 記号は、テキストの各行の終わりにある任意のパターンを検索するために正規表現で使用されます。 ‘ 脚本 次の例では、 ’単語が検索されます。ここでは、2行に次の単語が含まれています。 脚本 行の終わりに。
$捨てた -と 'PHPスクリプトNSJavaScriptNSビジュアルプログラミング」 | awk '/ Script $ /'出力:
特定の文字セットを省略して検索する
‘^’ 記号は、文字列パターンの前で使用された場合のテキストの開始を示します ( ‘/ ^…/’) またはによって宣言された文字セットの前 ^ […] 。の場合 ‘^’ 記号は3番目の括弧内で使用され、[^…]の場合、括弧内で定義された文字セットは検索時に省略されます。次のコマンドは、で始まらない単語を検索します 'NS' しかし、「 ool '。 いいね と ブール パターンとテキストデータに従って印刷されます。
$ printf 'バカNSいいねNS人形NSbool ' |awk'/ [^ F] ool /'出力:
awkの大文字と小文字を区別しない正規表現
デフォルトでは、正規表現は文字列内のパターンを検索するときに大文字と小文字を区別して検索します。大文字と小文字を区別しない検索は、正規表現を使用したawkコマンドで実行できます。次の例では、 tolower() 関数は、大文字と小文字を区別しない検索を行うために使用されます。ここでは、入力テキストの各行の最初の単語は、を使用して小文字に変換されます tolower() 機能し、正規表現パターンと一致します。 toupper() 関数はこの目的にも使用できます。この場合、パターンはすべて大文字で定義する必要があります。次の例で定義されているテキストには、検索語が含まれています。 'ウェブ ’を2行で出力し、出力として出力します。
$捨てた -と 'ウェブデザインNSウェブ開発NSフレームワーク' | awk 'tolower($ 0)〜/ ^ web /;'出力:
NF(フィールド数)変数を使用したawk
NF 入力テキストの各行のフィールドの総数をカウントするために使用されるawkコマンドの組み込み変数です。複数の行と複数の単語を含むテキストファイルを作成します。 input.txt ここでは、前の例で作成したファイルを使用しています。
コマンドラインからNFを使用する
ここで、最初のコマンドはの内容を表示するために使用されます input.txt file and secondコマンドは、を使用してファイルの各行のフィールドの総数を表示するために使用されます。 NF 変数。
$ cat input.txt$ awk '{print NF}' input.txt
出力:
awkファイルでNFを使用する
名前の付いたawkファイルを作成します count.awk 以下のスクリプトを使用します。このスクリプトが任意のテキストデータで実行されると、合計フィールドを含む各行の内容が出力として出力されます。
count.awk
{{$を印刷0}{{印刷'[合計フィールド:'NF']'}
次のコマンドでスクリプトを実行します。
$awk -NScount.awk input.txt出力:
awk gensub() function
getsub() 特定の区切り文字または正規表現パターンに基づいて文字列を検索するために使用される置換関数です。この関数はで定義されています 「gawk」 デフォルトでインストールされていないパッケージ。この関数の構文を以下に示します。最初のパラメーターには正規表現パターンまたは検索区切り文字が含まれ、2番目のパラメーターには置換テキストが含まれ、3番目のパラメーターには検索の実行方法が示され、最後のパラメーターにはこの関数が適用されるテキストが含まれます。
構文:
gensub((正規表現、交換、方法[、 目標])。次のコマンドを実行してインストールします gawk 使用するためのパッケージ getsub() awkコマンドで機能します。
$ sudo apt-get install gawk‘という名前のテキストファイルを作成します salesinfo.txt この例を実践するために、次の内容で ’を使用します。ここでは、フィールドはタブで区切られています。
salesinfo.txt
私の700000あなたの800000
水750000
200000を集める
金430000
土820000
次のコマンドを実行して、の数値フィールドを読み取ります。 salesinfo.txt すべての販売額の合計をファイルして印刷します。ここで、3番目のパラメータ「G」はグローバル検索を示します。つまり、パターンはファイルの全内容で検索されます。
$awk '{x = gensub(' t '、' '、' G '、$ 2); printf x '+'} END {print 0} 'salesinfo.txt| 紀元前 -NS出力:
rand()関数を使用したawk
行() 関数は、0より大きく1より小さい任意の乱数を生成するために使用されます。したがって、常に1未満の小数を生成します。次のコマンドは、小数の乱数を生成し、値に10を掛けて、より大きい数を取得します。 1. printf()関数を適用するために、小数点以下2桁の小数が出力されます。次のコマンドを複数回実行すると、毎回異なる出力が得られます。
$awk 'BEGIN {printf'数値は=%。2f n '、rand()* 10}'出力:
awkユーザー定義関数
前の例で使用されているすべての関数は組み込み関数です。ただし、awkスクリプトでユーザー定義関数を宣言して、特定のタスクを実行することができます。長方形の面積を計算するカスタム関数を作成するとします。このタスクを実行するには、 ‘という名前のファイルを作成します area.awk ’を次のスクリプトで使用します。この例では、 範囲() 入力パラメータに基づいて面積を計算し、面積値を返すスクリプトで宣言されています。 getline ここでは、コマンドを使用してユーザーからの入力を取得します。
area.awk
#面積を計算する関数範囲((身長、幅)。{{
戻る身長*幅
}
#実行を開始します
始める{{
印刷'高さの値を入力してください:'
getline h< '-'
印刷'幅の値を入力してください:'
getline w< '-'
印刷'面積='範囲((NS、の)。
}
スクリプトを実行します。
$awk -NSarea.awk出力:
例ならawk
awkは、他の標準プログラミング言語と同様に条件文をサポートしています。このセクションでは、3つの例を使用して3種類のifステートメントを示します。名前の付いたテキストファイルを作成します items.txt 以下の内容で。
items.txt
HDDサムスン$ 100マウスA4Tech
プリンターHP $ 200
例なら簡単 :
次のコマンドは、の内容を読み取ります items.txt ファイルを作成して確認します 3rd 各行のフィールド値。値が空の場合、行番号を含むエラーメッセージが出力されます。
$awk '{if($ 3 ==' ')print'価格フィールドが行 'NR}'にありませんitems.txt出力:
if-elseの例:
次のコマンドは、3の場合、アイテムの価格を出力しますrdフィールドが行に存在します。存在しない場合、エラーメッセージが出力されます。
$ awk'{if($ 3 ==' ')print'価格フィールドがありません 'それ以外の場合、印刷 'アイテムの価格は' $ 3} 'アイテム。txt
出力:
if-else-ifの例:
次のコマンドが端末から実行されると、ユーザーからの入力を受け取ります。入力値は、条件が真になるまで、各if条件と比較されます。いずれかの条件が真になると、対応するグレードが出力されます。入力値がどの条件とも一致しない場合、印刷は失敗します。
$awk 'BEGIN {print'マークを入力してください: 'getlineマーク<'-'
if(mark> = 90)print'A + '
else if(mark> = 80)print'A '
else if(mark> = 70)print'B + '
それ以外の場合は「失敗」を出力します} '
出力:
awk変数
awk変数の宣言は、シェル変数の宣言に似ています。変数の値の読み取りには違いがあります。 「$」記号は、値を読み取るためのシェル変数の変数名とともに使用されます。ただし、値を読み取るためにawk変数で「$」を使用する必要はありません。
単純な変数の使用:
次のコマンドは、という名前の変数を宣言します 'サイト' 文字列値がその変数に割り当てられます。変数の値は次のステートメントに出力されます。
$awk 'BEGIN {site =' LinuxHint.com ';印刷サイト} '出力:
変数を使用してファイルからデータを取得する
次のコマンドは単語を検索します 「プリンタ」 ファイル内 items.txt 。ファイルのいずれかの行がで始まる場合 「プリンタ ’次に、の値を格納します 1NS 、 2NS と 3rd フィールドを3つの変数に変換します。 名前 と 価格 変数が出力されます。
$ awk'/ Printer / {name = $ 1; brand = $ 2; price = $ 3; print' item name = 'name;印刷 'アイテム価格='価格} 'アイテム。txt
出力:
awk配列
数値配列と連想配列の両方をawkで使用できます。 awkでの配列変数宣言は、他のプログラミング言語と同じです。このセクションでは、配列のいくつかの使用法を示します。
連想配列:
配列のインデックスは、連想配列の任意の文字列になります。この例では、3つの要素の連想配列が宣言されて出力されます。
$awk '始める {books ['Web Design'] = 'HTML5の学習';
books ['Web Programming'] = 'PHPと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'始める {数値[0] = 80;
数値[1] = 55;
数値[2] = 76;
#配列要素を出力
printf '配列値:%dNS%NSNS%NSNS'、number [0]、number [1]、number [2]; } '
出力:
awkループ
awkでは3種類のループがサポートされています。これらのループの使用法は、3つの例を使用してここに示されています。
Whileループ:
次のコマンドで使用されるwhileループは、5回繰り返され、breakステートメントのループを終了します。
$ awk 'BEGIN {n = 1; while(n 5)break; 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 {カウンター= 10; do {if(counter%2 == 0)print counter;カウンター - }while(counter> 5)} '
出力:
awkで最初の列を印刷します
ファイルの最初の列は、awkで$ 1変数を使用して印刷できます。ただし、最初の列の値に複数の単語が含まれている場合は、最初の列の最初の単語のみが出力されます。特定の区切り文字を使用することにより、最初の列を正しく印刷できます。名前の付いたテキストファイルを作成します student.txt 以下の内容で。ここで、最初の列には2つの単語のテキストが含まれています。
Student.txt
カニスファテマ30NSバッチアビルホセイン35NSバッチ
ジョン・エイブラハム40NSバッチ
区切り文字なしでawkコマンドを実行します。最初の列の最初の部分が印刷されます。
$awk '{print $ 1}'student.txt次の区切り文字を使用してawkコマンドを実行します。最初の列の全体が印刷されます。
$awk -NS '\ NS' '{print $ 1}'student.txt出力:
awkで最後の列を印刷します
$(NF) 変数は、任意のファイルの最後の列を出力するために使用できます。次のawkコマンドは、の最後の列の最後の部分と完全な部分を出力します 学生.txt ファイル。
$awk '{print $(NF)}'student.txt$awk -NS '\ NS' '{print $(NF)}'student.txt
出力:
grepでawk
grepは、正規表現に基づいてファイル内のコンテンツを検索するためのLinuxのもう1つの便利なコマンドです。次の例に、awkコマンドとgrepコマンドの両方を一緒に使用する方法を示します。 グリップ コマンドは、従業員IDの情報を検索するために使用されます。 1002 ' から employee.txt ファイル。 grepコマンドの出力は、入力データとしてawkに送信されます。 5%のボーナスは、従業員IDの給与に基づいてカウントされ、印刷されます。 1002 ' awkコマンドによる。
$猫employee.txt$グリップ 「1002」employee.txt| awk -NS 'NS' '{print $ 2'は$ '($ 3 * 5)/ 100'ボーナス '}'を取得します
出力:
BASHファイルでawk
他のLinuxコマンドと同様に、awkコマンドもBASHスクリプトで使用できます。名前の付いたテキストファイルを作成します Customers.txt 以下の内容で。このファイルの各行には、4つのフィールドに関する情報が含まれています。これらは、お客様のID、名前、住所、携帯電話番号で区切られています。 ‘/ '。
Customers.txt
AL4934 / Charles M Brunner / 4838 Beeghley Street、Huntsville、Alabama / 256-671-7942CA5455 / Virginia S Mota / 930 Bassel Street、VALLECITO、California / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road、Chicago、Illinois / 773-550-5107
名前の付いたbashファイルを作成します item_search.bash 次のスクリプトを使用します。このスクリプトによると、状態値はユーザーから取得され、で検索されます Customers.txt によるファイル グリップ コマンドを入力し、入力としてawkコマンドに渡します。 Awkコマンドは読み取ります 2NS と 4NS 各行のフィールド。入力値がのいずれかの状態値と一致する場合 Customers.txt ファイルを作成すると、顧客の 名前 と 携帯電話番号 それ以外の場合は、メッセージを出力します 顧客が見つかりません 。
item_search.bash
#!/ bin / bash捨てた 「州名を入力してください:」
読んだ州
顧客=「グリップ '$ state'Customers.txt| awk -NS '/' '{print'顧客名: '$ 2、'、
携帯番号: '$ 4}'「
もしも [ '$ customers' !='' ];それから
捨てた $ customers
そうしないと
捨てた 「顧客が見つかりません」
なれ
次のコマンドを実行して、出力を表示します。
$猫Customers.txt$bashitem_search.bash
出力:
sedでawk
Linuxのもう1つの便利な検索ツールは sed 。このコマンドは、任意のファイルのテキストの検索と置換の両方に使用できます。次の例は、awkコマンドを次のように使用する方法を示しています。 sed 指図。ここで、sedコマンドは ‘で始まるすべての従業員名を検索します NS ’を入力し、awkコマンドに入力として渡します。 awkは従業員を印刷します 名前 と ID フォーマット後。
$猫employee.txt$sed -NS '/ J / p'employee.txt| awk -NS 'NS' '{printf'%s(%s) n '、$ 2、$ 1}'
出力:
結論:
データを適切にフィルタリングした後、awkコマンドを使用して、表形式または区切り文字のデータに基づいてさまざまなタイプのレポートを作成できます。このチュートリアルに示されている例を実践した後、awkコマンドがどのように機能するかを学ぶことができることを願っています。