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

Awk 入門チュートリアル – 7 つの Awk 印刷例

これは、新しい awk チュートリアル シリーズの最初の記事です。今後数週間で、awk のすべての機能を実用的な例とともにカバーする awk に関するいくつかの記事を投稿する予定です。

この記事では、基本的な awk の作業方法論と、7 つの実用的な awk print の例を確認します。

注: 以前の Sed チュートリアル シリーズを必ずお読みください。

Awk の紹介と印刷操作

Awk は、構造化されたデータを簡単に操作し、書式設定されたレポートを生成できるプログラミング言語です。 awk は、その作成者の名前「A」の略です ほら、W アインバーガー、K アーニハン」

Awk は主にパターンのスキャンと処理に使用されます。 1 つ以上のファイルを検索して、指定されたパターンに一致する行が含まれているかどうかを確認し、関連するアクションを実行します。

Awk の主な機能は次のとおりです。

  • Awk はテキスト ファイルをレコードとフィールドとして表示します。
  • 一般的なプログラミング言語と同様に、Awk には変数、条件、およびループがあります
  • Awk には算術演算子と文字列演算子があります
  • Awk は書式設定されたレポートを生成できます

awk は、ファイルまたは標準入力から読み取り、標準出力に出力します。 awk は、テキスト以外のファイルには対応していません。

Syntax:

awk '/search pattern1/ {Actions}
     /search pattern2/ {Actions}' file

上記の awk 構文では:

  • 検索パターンは正規表現です。
  • アクション – 実行するステートメント
  • Awk ではいくつかのパターンとアクションが可能です。
  • file – 入力ファイル。
  • プログラムを一重引用符で囲むのは、シェルが特殊文字を解釈しないようにするためです。

Awk 作業方法論

<オール>
  • Awk は入力ファイルを一度に 1 行ずつ読み取ります。
  • 一致が対応するアクションを実行する場合、各行について、指定された順序で指定されたパターンと一致します。
  • 一致するパターンがない場合、アクションは実行されません。
  • 上記の構文では、検索パターンまたはアクションのいずれかがオプションですが、両方ではありません。
  • 検索パターンが指定されていない場合、Awk は入力の各行に対して指定されたアクションを実行します。
  • アクションが指定されていない場合、デフォルトのアクションである指定されたパターンに一致するすべての行を出力します。
  • アクションのない空のブレースは何もしません。デフォルトの印刷操作は実行されません。
  • アクション内の各ステートメントはセミコロンで区切る必要があります。
  • 次の内容の employee.txt ファイルを作成してみましょう。これは、
    後述の例で使用されます。

    $cat employee.txt
    100  Thomas  Manager    Sales       $5,000
    200  Jason   Developer  Technology  $5,500
    300  Sanjay  Sysadmin   Technology  $7,000
    400  Nisha   Manager    Marketing   $9,500
    500  Randy   DBA        Technology  $6,000

    Awk の例 1. Awk のデフォルトの動作

    デフォルトでは、Awk はファイルのすべての行を出力します。

    $ awk '{print;}' employee.txt
    100  Thomas  Manager    Sales       $5,000
    200  Jason   Developer  Technology  $5,500
    300  Sanjay  Sysadmin   Technology  $7,000
    400  Nisha   Manager    Marketing   $9,500
    500  Randy   DBA        Technology  $6,000

    上記の例では、パターンは指定されていません。したがって、アクションはすべての行に適用できます。
    引数を指定しないアクション print は、デフォルトで行全体を出力します。したがって、
    ファイルのすべての行が失敗せずに出力されます。アクションは中括弧で囲む必要があります。

    Awk の例 2. パターンに一致する行を出力します。

    $ awk '/Thomas/
    > /Nisha/' employee.txt
    100  Thomas  Manager    Sales       $5,000
    400  Nisha   Manager    Marketing   $9,500

    上記の例では、「Thomas」または「Nisha」に一致するすべての行が出力されます。それには2つのパターンがあります。 Awk は任意の数のパターンを受け入れますが、各セット (パターンとそれに対応するアクション) は改行で区切る必要があります。

    Awk の例 3. 特定のフィールドのみを出力

    Awk には多数の組み込み変数があります。各レコード、つまり行ごとに、デフォルトで空白文字で区切られたレコードを分割し、$n 変数に格納します。行に 4 つの単語がある場合、$1、$2、$3、および $4 に格納されます。 $0 は行全体を表します。 NF は、レコード内のフィールドの総数を表す組み込み変数です。

    $ awk '{print $2,$5;}' employee.txt
    Thomas $5,000
    Jason $5,500
    Sanjay $7,000
    Nisha $9,500
    Randy $6,000
    
    $ awk '{print $2,$NF;}' employee.txt
    Thomas $5,000
    Jason $5,500
    Sanjay $7,000
    Nisha $9,500
    Randy $6,000

    上記の例では、$2 と $5 はそれぞれ Name と Salary を表します。 $NF を使用して給与を取得することもできます。ここで、$NF は最後のフィールドを表します。 print ステートメントの「,」は連結子です。

    Awk の例 4. 初期化と最終アクション

    Awk には、BEGIN と END というキーワードで指定される 2 つの重要なパターンがあります。

    Syntax: 
    
    BEGIN { Actions}
    {ACTION} # Action for everyline in a file
    END { Actions }
    
    # is for comments in Awk

    BEGIN セクションで指定されたアクションは、入力からの行の読み取りを開始する前に実行されます。
    END アクションは、入力からの行の読み取りと処理が完了した後に実行されます。

    $ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
    > {print $2,"\t",$3,"\t",$4,"\t",$NF;}
    > END{print "Report Generated\n--------------";
    > }' employee.txt
    Name	Designation	Department	Salary
    Thomas 	 Manager 	 Sales 	         $5,000
    Jason 	 Developer 	 Technology 	 $5,500
    Sanjay 	 Sysadmin 	 Technology 	 $7,000
    Nisha 	 Manager 	 Marketing 	 $9,500
    Randy 	 DBA 	 	 Technology 	 $6,000
    Report Generated
    --------------

    上記の例では、レポートの見出しと最後のファイルを出力します。

    Awk の例 5. 従業員 ID が 200 より大きい従業員を検索する

    $ awk '$1 >200' employee.txt
    300  Sanjay  Sysadmin   Technology  $7,000
    400  Nisha   Manager    Marketing   $9,500
    500  Randy   DBA        Technology  $6,000

    上記の例では、最初のフィールド ($1) は従業員 ID です。したがって、$1 が 200 より大きい場合は、デフォルトの印刷アクションを実行して行全体を印刷します。

    Awk の例 6. 技術部門の従業員のリストを出力する

    部門名が 4 番目のフィールドとして利用できるようになったので、$4 が文字列「Technology」と一致するかどうかを確認する必要があります。一致する場合は、その行を出力してください。

    $ awk '$4 ~/Technology/' employee.txt
    200  Jason   Developer  Technology  $5,500
    300  Sanjay  Sysadmin   Technology  $7,000
    500  Randy   DBA        Technology  $6,000

    演算子 ~ は正規表現と比較するためのものです。デフォルトのアクションと一致する場合、つまり行全体の印刷が実行されます。

    Awk の例 7. 技術部門の従業員数を表示

    以下の例では、部門がテクノロジーであるかどうかを確認し、そうである場合はアクションで、BEGIN セクションでゼロで初期化されたカウント変数をインクリメントします。

    $ awk 'BEGIN { count=0;}
    $4 ~ /Technology/ { count++; }
    END { print "Number of employees in Technology Dept =",count;}' employee.txt
    Number of employees in Tehcnology Dept = 3

    次に、プロセスの最後に、技術部門の従業員数を示す count の値を出力します。

    推奨読書

    <強い> Ramesh Natarajan による Sed と Awk の 101 ハック .テキスト ファイル (データ、構成、およびログ ファイル) を扱う UNIX/Linux 環境で、1 日に数時間を費やしています。私はすべてのテキスト操作作業に Sed と Awk を使用しています。私の Sed と Awk の経験に基づいて、Sed と Awk のさまざまな高度な機能に関する 101 の実用的な例を含む Sed and Awk 101 Hacks eBook を書きました。これにより、UNIX/Linux の生活が向上します。 Sed と Awk を数年間使用しており、この本を読んでいない場合でも、ぜひこの本を読んでください。 Sed および Awk ユーティリティの機能に驚かれることでしょう。

    追加の awk 記事

    • 3 つの実用例を含む Awk ユーザー定義変数
    • 8 つの強力な Awk 組み込み変数 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
    • 7 つの強力な Awk 演算子の例 (単項、二項、算術、文字列、代入、条件付き、正規表現の Awk 演算子)
    • 4 つの Awk If ステートメントの例 (if、if else、if else if、:?)
    • ループに巻き込まれましたか? Awk While、Do While、For Loop、Break、Continue、Exit の例

    Linux
    1. 4 Awk If ステートメントの例 ( if, if else, if else if, :? )

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

    3. awk:コマンドが見つかりません

    1. 初心者向けのLinuxcdコマンドチュートリアル(8例)

    2. Awk チュートリアル:3 つの実践例で Awk 変数を理解する

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

    1. 例を使用したBashヒアドキュメントチュートリアル

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

    3. Linux /UNIXAwkコマンドチュートリアルと例