awkコマンド
awkもデータ処理ツールです!行全体を処理することが多い sed と比較して、awk は行を複数のフィールドに分割して処理することを好みます。
. awk 言語の最も基本的な機能は、指定されたルールに基づいてファイルまたは文字列内の情報を分解して抽出することであり、指定されたルールに基づいてデータを出力することもできます。
awkを呼び出すには3つの方法があります
1.コマンドラインモード
awk [-F field-separator] 'commands' input-files
このうち、[-F field separator] は、awk がデフォルトのフィールド区切り文字としてスペースまたはタブキーを使用するため、オプションです。フィールド間にスペースがあるテキストを参照する場合は、このオプションを指定する必要はありません。 passwd など、フィールドがコロンで区切られているファイルを参照する場合は、awk -F のように -F オプションを指定する必要があります。 : 'コマンド' 入力ファイル。
注: Linux システムでは区切り記号を格納するために環境変数 IFS が使用されますが、IFS の値は実際のアプリケーションに応じて変更することもできます。
例:
スクリプトの実行結果は次のとおりです。
コマンドは実際の awk コマンドで、input-file は処理されるファイルです。
iput_files は複数のファイルのファイルリストにすることができ、awk はリスト内の各ファイルを順番に処理します。
awk では、ファイルの各行で、フィールド区切り文字で区切られた各項目をフィールドと呼びます。通常、-F フィールド区切り文字を指定しないと、デフォルトのフィールド区切り文字はスペースまたはタブになります。
2.シェル スクリプト メソッド
は、すべての awk コマンドをファイルに挿入して awk プログラムを実行可能にし、スクリプト名を入力して呼び出されるスクリプトの最初の行として awk コマンド インタープリターを使用します。
シェル スクリプトの最初の行に相当: #!/bin/sh は #!/bin/awk に置き換えることができます
3。すべての awk コマンドを別のファイルに挿入して、次を呼び出します:
Awk -f awk‐script-file awk-script-file input-files
このうち、 -f オプションは awk-script-file に awk スクリプトをロードします。 、input-files は上記と同じです。
awk のパターンとアクション
awk ステートメントはパターンとアクション (awk_pattern {actions }) で構成されます。
awk スクリプトには多くのステートメントが含まれる場合があります。
モード部分は、アクションステートメントがいつトリガーされ、イベントをトリガーするかを決定します。処理とは、データに対して実行される操作です。モード部分を省略した場合、アクションは常に実行されたままになります。つまり、省略した場合、入力レコードの照合や比較を行わずに、対応するアクションが実行されます。
パターンは、任意の条件文や正規表現などにすることができます。 awk_pattern には次のタイプがあります:
1) 正規表現は awk_pattern:/regexp/
として使用されます。例: awk '/^[a-z]/' input_file
2) ブール式は awk_pattern として使用されます, 式が true の場合、対応するアクションの実行がトリガーされます。
① 変数 (フィールド変数 $1、$2 など) と /regexp/
② ブール式の演算子:
関係演算子: 一致演算子: value ~ /regexp/ value が /regexp/ と一致する場合、true を返します
value!~ /regexp/ value が /regexp/ と一致しない場合、true を返します
例: awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/ {print "ok"}' input_file
③ && (and) と || (or) は 2 つの /regexp/ またはブール式を混合形式で接続できます表現。 !(not) は、ブール式内または /regexp/ の前で使用できます。
例: awk '($1 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print "ok"} ' input_file
パターンには、2 つの特別なフィールド BEGIN と END が含まれています。 BEGIN ステートメントを使用して、カウントとプリントヘッドを設定します。 BEGIN ステートメントはテキスト参照アクションの前に使用され、その後、入力テキストに基づいてテキスト参照アクションの実行が開始されます。 END ステートメントは、awk がテキストの参照アクションを完了した後に、テキストの総数と終了ステータス フラグを出力するために使用されます。
実際のアクションは中括弧 { } 内に指定されます。アクションは主に出力に使用されますが、if ステートメントやループ ステートメント、ループ終了構造などの長いコードもあります。アクションが指定されていない場合、awk は参照したすべてのレコードを出力します。
awk が実行されると、その参照ドメインは $1、$2...$n としてマークされます。この方法はドメイン識別と呼ばれます。これらのドメイン識別子を使用すると、ドメインのさらなる処理が容易になります。
1 番目と 3 番目のフィールドを参照するには、$1 と $3 を使用します。フィールドを区切るためにカンマが使用されることに注意してください。 5 つのフィールド
を持つレコードのすべてのフィールドを印刷したい場合は、$1、$2、$3、$4、$5 を指定する必要はなく、すべてのフィールドを意味する $0 を使用できます。
フィールドまたはすべてのフィールドを印刷するには、print コマンドを使用します。これは awk アクションです
awk 実行プロセス:
①BEGIN ブロックが存在する場合、awk はそれに指定されたアクションを実行します。
② awk は入力ファイルから 1 行を読み取ります。これは入力レコードと呼ばれます。 (入力ファイルを省略した場合は標準入力から読み込まれます)
③ awkは読み取ったレコードをフィールドに分割し、最初のフィールドを変数$1に、2番目のフィールドを$2というように配置します。 $0 はレコード全体を表します。
④ 現在の入力レコードと各 awk_cmd の awk_pattern を比較し、一致する場合は、対応するアクションを実行します。一致するものがない場合、すべての awk_cmd が比較されるまで、対応するアクションはスキップされます。
⑤ 入力レコードがすべての awk_cmd を比較すると、awk は入力の次の行を読み取り、ステップ③と④を繰り返します。このプロセスは、awk がファイルの終わりを読み取るまで続きます。
⑥awkがすべての入力行を読み込んだ後、ENDが存在する場合、対応するアクションが実行されます。
入門例:
例 1: /etc/passwd ファイル内のユーザー名とログインシェルを表示する
/etc/passwd のアカウントと、それに対応するシェルのみを表示する場合アカウントとアカウントとシェルはタブキーで区切ります
/etc/passwd ファイルにユーザー名とログインシェルのみを表示し、アカウントとシェルをカンマで区切る場合
注: awk は常に標準出力に出力します。awk をファイルに出力したい場合は、リダイレクトを使用できます。
例 2: /etc/passwd ファイル内で 500 を超える UID を持つすべてのユーザーのユーザー名とログイン シェルを表示します
例 3: /etc/passwd ファイル内で 500 を超える UID を持つユーザーのみを表示する/passwdファイルに名前とログインシェルが表示されます。アカウントとシェルをカンマで区切って、すべての行にカラム名name、shellを追加し、最終行に「blue,/bin/nosh」を追加します。
注:
1.awk の後には 2 つの一重引用符と中括弧 {} が続き、データに対して実行する処理アクションを設定します
2.awk ワークフローは次のとおりです: 最初に BEGING を実行し、次に BEGING を実行します。ファイルを読み取り、n 個の改行で区切られたレコードを読み取り、指定されたフィールド区切り文字に従ってレコードをフィールドに分割し、フィールドに入力します。$0 はすべてのフィールドを意味し、$1 は最初のフィールドを意味し、$n は n 番目のドメインを意味します。パターンに応じたアクションの実行を開始します。次に、すべてのレコードが読み取られるまで 2 番目のレコードの読み取りを開始し、最後に END 操作を実行します。
質問: すべてのレコードを印刷する方法 (/etc/passwd の内容を例として取り上げます)
例 4: /etc/passwd 内のルートキーワードを含むすべての行を検索します
これはパターン (パターン) の使用例。パターン (ここではルート) に一致する行のみがアクションを実行します (アクションは指定されておらず、デフォルトで各行の内容が出力されます)。
検索は、正規表現をサポートしています。たとえば、root で始まる正規表現を検索します。
root キーワードを含むすべての行を /etc/passwd で検索し、対応するシェルを表示します
ここで指定するアクションは次のとおりです。 {print $7 }
例 5: 最近システムにログインした 5 人のユーザーの情報を表示します。ユーザー名と IP アドレスのみが表示されます
最近ログインしたユーザーの情報を表示するには、最後のコマンドを使用します。ユーザー。以下の図に示すように:
awk コマンドを使用して、ユーザー名と IP 領域のデータを抽出します
または
awk 組み込み変数
awk には、環境情報を設定するための多くの組み込み変数があります。最も一般的に使用される変数のいくつかを以下に示します。
FILENAME awk によって参照されるファイル名
FS コマンドラインの -F オプションに相当する、入力フィールドの区切り文字を設定します
NF 閲覧レコード内のフィールドの数 (各行のフィールドの合計数 ($0))
NR Read レコード数 (データのどの行が awk によって処理されるか)
例 6: Statistics/etc/passwd: ファイル名、各行の行番号、各行の列数、対応する完全な行の内容:
すべてのアカウントのレコードをレコード番号とともに表示し、END セクションに入力ファイル名を出力します
awk の組み込み変数に加えて、awk は変数をカスタマイズすることもできます
例 7: /etc/passwd 内のアカウント数をカウントする
count はカスタム変数です。前の action{} には print が 1 つだけありました。実際、print は単なるステートメントであり、action{} には ; で区切って複数のステートメントを含めることができます。
ここではカウントの初期化はありませんが、デフォルトは 0 ですが、0 に初期化するのが適切です:
例 8: フォルダー内のファイルが占めるバイト数をカウントします
場合M を使用します。 単位で表示されます:
注: 上記の統計には、サブディレクトリ内のファイルは含まれません。
すべてのファイルの長さとその合計をすぐに確認したいが、サブディレクトリは除外したい場合、その方法は次のとおりです: