awk とは何ですか?
UNIX についてはよく知っているかもしれませんが、awk については馴染みがないかもしれません。確かに、awk はその優れた機能に比べて、それにふさわしい人気とは程遠いものです。 awkとは何ですか?他のほとんどの UNIX コマンドとは異なり、awk の機能をその名前から知ることは不可能です。これは、独立した意味を持つ英語の単語でも、いくつかの関連する単語の略語でもありません。実際、awk は 3 人の名前の略語です: Aho、(Peter) Weinberg、(Brain) Kernighan。この 3 人が、優れたスタイルのスキャンおよび処理ツールである awk を作成しました。
AWKの機能は何ですか? sed や grep と同様に、awk はパターンのスキャンおよび処理ツールです。ただし、その機能は sed や grep よりもはるかに強力です。 Awk は非常に強力な機能を提供します。grep と sed が実行できるほぼすべての作業を実行できると同時に、スタイルの読み込み、フロー制御、数学演算子、プロセス制御ステートメント、さらには組み込みの変数や関数も実行できます。 。完全な言語に必要な美しい機能がほぼすべて備わっています。実際、awk には独自の言語があります。それは awk プログラミング言語です。awk の 3 人の作成者は、これをスタイル スキャンおよび処理言語として正式に定義しました。
なぜ awk を使うのですか?
それでも、なぜ awk を使用する必要があるのかと疑問に思うかもしれません
awk を使用する最初の理由は、テキストベースのスタイルのスキャンと処理がよく行われるためです。データベースに似ていますが、データベースとは異なり、テキスト ファイルを扱います。これらのファイルは特別な保存形式を持たず、一般の人が編集、読み取り、理解、処理できます。データベース ファイルは多くの場合、特殊な保存形式を持っているため、データベース処理プログラムを使用して処理する必要があります。この種のデータベースのような処理作業は頻繁に発生するため、UNIX には sed、grep、sort、find などのこの分野のツールが多数あり、その中には awk があります。非常に優れたものです。
awk を使用する 2 番目の理由は、awk がその強力な機能に比べて単純なツールであるということです。確かに、UNIX には優れたツールが数多くあります。たとえば、UNIX の自然な開発ツールである C 言語とその後継である C++ は非常に優れています。しかし、それらと比較すると、awk は同じ機能を実行するのにはるかに便利で簡単です。これはまず、awk がさまざまなニーズを満たすソリューションを提供しているためです。単純な問題を解決するための awk コマンドラインから、複雑で精巧な awk プログラミング言語まで、解決するために複雑なメソッドを使用する必要がないという利点があります。それ以外の場合は非常に複雑な問題があります。たとえば、単純な問題を解決するにはコマンド ラインを使用できますが、C 言語では、単純なプログラムであっても、作成とコンパイルのプロセス全体を実行する必要があります。次に、awk 自体が解釈されて実行されるため、awk プログラムはコンパイル プロセスを経る必要がなく、同時にシェル スクリプト プログラムにもよく適合します。最後に、awk 自体は C 言語よりも単純ですが、awk は C 言語の多くの優れた要素を吸収しているため、C 言語に精通していることは awk を学習する上で非常に役立ちますが、awk 自体は C 言語を使用する必要はありません。強力だが必要な開発ツールであり、使いこなすには長い時間がかかります。
awk を使用する 3 番目の理由は、awk が簡単に利用できるツールであるということです。 C 言語や C++ 言語とは異なり、awk には 1 つのファイル (/bin/awk) しかなく、UNIX のほぼすべてのバージョンに独自のバージョンの awk が提供されています。awk の入手方法について心配する必要はありません。ただし、C 言語の場合はそうではありません。C 言語は UNIX 用の自然な開発ツールですが、この開発ツールは別個にリリースされます。つまり、UNIX バージョンの C 言語開発ツールに対して別途料金を支払う必要があります。 D バージョンを使用する人はもちろん))、それを入手してインストールしてから使用してください。
上記の理由と、awk の強力な機能を組み合わせると、テキスト スタイルのスキャンに関連する作業に対処したい場合は、awk が第一の選択肢となるべきであると言えます。ここで従うべき一般原則があります。通常のシェル ツールやシェル スクリプトを使用するのが難しい場合は、awk を試してください。awk で問題が解決できない場合は、C 言語を使用してください。C 言語がまだ解決しない場合は、C++ に移行してください。
awk を呼び出す方法
前述したように、awk はさまざまなニーズを満たすためのさまざまなソリューションを提供します。
1. awk コマンド ラインは、通常の UNIX コマンドと同様に使用できます。 awk プログラミング言語 awk は複数行の入力をサポートしていますが、長いコマンドラインを入力してそれが正しいかどうかを確認するのは面倒なため、この方法は通常、単純な問題を解決するためにのみ使用されます。もちろん、awk コマンド ラインや、シェル スクリプト プログラム内の awk プログラム スクリプトを参照することもできます。
2. -f オプションを使用して awk プログラムを呼び出します。 Awk を使用すると、awk プログラムをテキスト ファイルに書き込み、awk コマンド ラインで -f オプションを使用してこのプログラムを呼び出して実行できます。具体的な方法については、awk 構文で後述します。
3. コマンド インタープリターを使用して awk プログラムを呼び出す: UNIX でサポートされているコマンド インタープリター機能を使用して、awk プログラムをテキスト ファイルに書き込み、その最初の行に
を追加します。#!/bin/awk -f
そしてこのテキストファイルに実行許可を与えます。これを実行した後、次のような方法でコマンド ラインからこの awk プログラムを呼び出して実行できます。
$awk 処理されるファイルのスクリプト テキスト名
awk 構文:
他の UNIX コマンドと同様、awk には独自の構文があります:
awk [ -F re] [parameter...] ['prog'] [ - f progfile][in_file...]
パラメータの説明:
-F re: awk がフィールド区切り文字を変更できるようにします。
パラメータ: このパラメータは、さまざまな変数に値を割り当てるのに役立ちます。
'prog': awk プログラム ステートメント セグメント。このステートメントセグメントは、シェルによって解釈されないように、単一の拡張記号 ' および ' で囲む必要があります。このプログラム ステートメント セグメントの標準形式は次のとおりです:
'pattern {action}'
pattern パラメータには、egrep 正規表現のいずれかを指定できます。これは、構文 /re/ といくつかのスタイル マッチング手法を使用して形成できます。 sed と同様に、「,」を使用して 2 つのスタイルを区切って範囲を選択することもできます。マッチングの詳細については、付録を参照してください。それでも理解できない場合は、UNIX の本を探して grep と sed を学習してください (私は ed を勉強していたときにマッチング技術を習得しました)。 action パラメータは常に中括弧で囲まれ、「;」で区切られたシステム awk ステートメントで構成されます。 awk はそれらを解釈し、pattern で指定されたパターンに一致するレコードに対して操作を実行します。シェルと同様に、コメント文字として「#」を使用することもできます。これにより、「#」から行末までがコメントとなり、解釈時および実行時に無視されます。パターンまたはアクションのいずれかを省略できますが、両方を同時に省略することはできません。パターンが省略された場合、パターンの一致は行われません。つまり、アクションが省略された場合、デフォルトの操作は次のとおりです。実行されました - 標準出力に表示されます。
-f progfile: awk が progfile で指定されたプログラム ファイルを呼び出して実行できるようにします。 progfile はテキスト ファイルであるため、awk の構文に準拠する必要があります。
in_file: awk 入力ファイル。awk では複数の入力ファイルを処理できます。 awk は入力ファイルを変更しないことに注意してください。入力ファイルが指定されていない場合、awk は標準入力を受け入れ、結果を標準出力に表示します。 awk は入力および出力のリダイレクトをサポートします。
awk のレコード、フィールド、および組み込み変数:
前に述べたように、awk の処理作業はデータベースの処理方法に似ています。類似点の 1 つは、awk がレコードとフィールドの処理をサポートしていることです。フィールドの処理 この処理は grep と sed では実現できません。これが、awk が 2 つよりも優れている理由の 1 つです。 awk では、デフォルトで、テキスト ファイル内の行は常にレコードとみなされ、行の特定の部分がレコード内のフィールドとして扱われます。これらの異なるフィールドを操作するために、awk はシェルのメソッドを借用し、$1、$2、$3... を使用して行 (レコード) 内の異なるフィールドを順番に表します。具体的には、awk は $0 を使用して行 (レコード) 全体を表します。異なるフィールドは区切り文字と呼ばれる文字で区切られます。システムのデフォルトの区切り文字はスペースです。 Awk では、コマンドラインで -F 形式を使用してこの区切り文字を変更できます。実際、awk はこの区切り文字を記憶するために組み込み変数 FS を使用します。 awk には、レコード区切り変数 RS、現在動作しているレコード数 NR など、このような組み込み変数がいくつかあります。この記事の最後にある付録には、すべての組み込み変数がリストされています。これらの組み込み変数は、awk プログラムで参照または変更できます。たとえば、NR 変数を使用してパターン マッチングの作業範囲を指定したり、改行の代わりに特殊文字を使用するようにレコード区切り文字 RS を変更したりできます。レコード区切り文字としての文字。
例: テキストファイル myfile の 7 行目から 15 行目までの、1 番目のフィールド、3 番目のフィールド、7 番目のフィールドを % で区切って表示します:
awk -F % 'NR==7,NR==15 { printf $1 $3 $7}'
awk の組み込み関数
awk が優れたプログラミング言語になった理由の 1 つは、いくつかの優れたプログラミング言語 (C など) の多くの利点を吸収していることです。これらの利点の 1 つは、awk が一連の組み込み関数を定義およびサポートしていることです。これらの関数を使用することで、awk が提供する関数はより完全かつ強力になります。一連の組み込みの文字列処理関数。関数 (これらの関数は C 言語の文字列処理関数に似ており、使用方法も C 言語の関数に似ています)。関数では、文字列を処理する awk の機能がより強力です。この記事の最後にある付録には、一般的な awk が提供する組み込み関数がリストされています。これらの組み込み関数は、使用している awk のバージョンとは多少異なる場合があります。そのため、これらの関数を使用する前に、オンライン ヘルプを参照することをお勧めします。あなたのシステム。
組み込み関数の例として、awk の出力を C 言語と一致させる、awk の printf 関数を紹介します。実際、awk の多くの参照形式は C 言語から借用しています。 C 言語に詳しい方は、printf 関数が提供する強力なフォーマット出力機能を覚えているかもしれません。幸いなことに、私たちは awk で再び遭遇しました。 awk の printf は C 言語とほぼ同じです。C 言語に慣れている場合は、C 言語のパターンに従って awk で printf を使用できます。したがって、ここでは例のみを示します。詳しくない場合は、C 言語の入門書を探して読んでください。
例: ファイル myfile の行番号とフィールド 3 を表示します:
$awk '{printf"%03d%s",NR,$1}' myfile
コマンドラインで awk を使用します
順番に、 awk プログラミングの内容を説明しますが、説明する前に、いくつかの例を使用して以前の知識を復習します。これらの例はすべてコマンド ラインで使用されており、コマンド ラインでの awk の使い方を知ることができます。 。その理由は、一方では、次のコンテンツへの道を開くためであり、他方では、単純な問題を解決するためのいくつかの方法を紹介するためです。単純な問題を解決するために複雑な方法を使用する必要はありません。 awk は比較的単純なメソッドを提供するためです。
例: 文字列「sun」に一致する (含む) テキスト ファイル mydoc のすべての行を表示します。
$awk '/sun/{print}' mydoc
レコード全体(全行)を表示するのはawkのデフォルトアクションなので、アクション項目は省略可能です。
$awk '/sun/' mydoc
例: 以下はより複雑なマッチングの例です:
$awk '/[Ss]un/,/[Mm]oon/ {print}' myfile
Sun または sun に一致する最初の行と Moon または Moon に一致する最初の行の間の行を標準出力に表示します。
例: 次の例は、組み込み変数と組み込み関数 length() の使用を示しています:
$awk 'length($0)>80 {print NR}' myfile
このコマンドラインはmyfile 内の 80 行の文字数を超えるすべてのテキストを表示します。ここで、$0 はレコード全体 (行) を表すために使用されます。同時に、組み込み変数 NR は識別子 '$' を使用しません。 。
例: より実践的な例として、/etc の下にある passwd ファイルを検査し、passwd フィールド (2 番目のフィールド) が「*」であるかどうかを確認することで、UNIX のユーザーに対してセキュリティ チェックを実行するとします。 「*」は、ユーザーがパスワードを設定していないことを意味し、これらのユーザー名 (最初のフィールド) が表示されます。次のステートメントを使用してこれを実現できます:
#awk -F: '$2=="" {printf("%s nopassword!",$1' /etc/passwd
この例では、 passwd ファイルは ":" であるため、デフォルトのフィールド区切り文字を変更するには、-F: を使用する必要があります。この例には、組み込み関数 printf の使用も含まれます。
他のプログラミング言語と同様に、awk では、実際、言語内で変数を設定することは、変数の機能を提供することがプログラミング言語の必須要件です。
awk は 2 種類の変数を提供します。 1 つは awk の組み込み変数です。これについてはすでに説明しましたが、後で説明する他の変数とは異なり、組み込み変数を参照するときに識別子「$」を使用する必要がないことを指摘することが重要です。 awk プログラム内で (前述の NR の使用を思い出してください)、awk によって提供される別のタイプの変数は、awk プログラム ステートメント内でユーザーが独自の変数を定義して呼び出すことができるようにするものです。組み込み変数およびその他の awk 予約語として使用され、awk で参照できます。C 言語とは異なり、変数は awk でその特定のデータ型を決定する必要はありません。 awk で最初に出現したときの形式とコンテキストに基づいて、変数の型が定義されていない場合、awk はデフォルトで文字列型を使用します。これには、使用している変数の明示的な型を awk プログラムに認識させたい場合があります。以下の例では、この手法を使用します。
操作と判断:
プログラミング言語の特性の 1 つとして、awk は同様のさまざまな操作をサポートします。 +、-、*、/、% など、C 言語で提供されるものと基本的に同じです。同時に、awk は ++、--、+=、-=、=+ などの関数もサポートします。 、=- に馴染みのある C 言語では、C 言語のユーザーが awk プログラムを作成するのに非常に便利です。また、awk は、計算関数の拡張として、一連の組み込み計算関数 (log、sqr、など) を提供します。 cos、sin など) および文字列を操作する関数 (length、substr など) を参照すると、awk の操作機能が大幅に向上します。条件付き転送命令の一部である関係判定は、どのプログラミング言語にも備わっている機能であり、awk も例外ではありません。 awk では、一般的に使用される == (等しい) などのさまざまなテストが許可されています。 = (等しくない)、> (より小さい)、>= (以上)、>= (以下) など。スタイルマッチングとして、~(にマッチ)も用意されています! ~(一致しない)判定。
テストの拡張機能として、awk は論理演算子 (! (not)、&& (and)、|| (or)、および括弧 ()) を使用した複数の判断もサポートしており、awk の機能が大幅に強化されています。この記事の付録には、awk で許可される操作、判断、演算子の優先順位がリストされています。
Awk のフロー制御
フロー制御ステートメントは、あらゆるプログラミング言語に不可欠な部分です。優れた言語には、フロー制御を実行するステートメントがいくつか含まれています。 awk が提供する完全なフロー制御ステートメントは C 言語に似ており、プログラミングに大きな利便性をもたらします。
1. BEGIN と END:
awk には BEGIN と END という 2 つの特別な式があり、どちらもパターンで使用できます (前の awk 構文を参照)。BEGIN と END を指定する機能は、プログラムの初期状態を設定し、プログラム終了後に仕上げ作業を実行します。 BEGIN の後にリストされている操作 ({} 内) は、awk が入力のスキャンを開始する前に実行されますが、END の後にリストされている操作は、すべての入力がスキャンされた後に実行されます。したがって、通常、BEGIN は変数およびプリセット (初期化) 変数を表示するために使用され、END は最終結果を出力するために使用されます。
例: 売上ファイルの累計売上金額 }
>{print $3;total=total+$3;}
>END {printf "Total sales amount: %.2f",total}' sx
(注: >シェルによって提供される 2 番目のプロンプトです。シェル プログラムの awk ステートメントと awk 言語で改行するには、行の最後にバックスラッシュを追加する必要があります)
ここで、BEGIN は内部変数 FS (フィールドseparator) とカスタム変数 total を入力し、出力行ヘッダーを表示します。そして、END はスキャンの完了後に合計を出力します。
2. プロセス制御ステートメント
awk は完全なプロセス制御ステートメントを提供し、その使用法は C 言語の場合と似ています。以下で 1 つずつ説明しましょう:
2.1, if...else ステートメント:
形式:
if (式)
ステートメント 1
else
ステートメント 2
形式では、「ステートメント 1」には複数のステートメントを指定できます。 awk の判断やユーザー自身の読み取りを容易にしたい場合は、複数のステートメントを {} で囲んだ方がよいでしょう。 awk ブランチ構造ではネストが可能で、その形式は次のとおりです:
if (式 1)
{if (式 2)
ステートメント 1
else
ステートメント 2
}
ステートメント 3
else {if (式 3)
ステートメント 4
else
ステートメント 5
}
ステートメント 6
もちろん、実際の操作中にこのような複雑な分岐構造を使用することはできません。これは単にスタイルを与えるためです。
2.2. while 文
の形式:
while (式)
2.3. do-while 文
の形式:
do
{
文
}while (条件判定文) )
2.4. for ステートメント
形式は次のとおりです:
for (初期式; 終了条件; ステップ式)
{ステートメント}
while、do-while および for ステートメントでは、break ステートメントと continue ステートメントが使用できます。 awk のプロセスのフローを制御し、exit などのステートメントを使用して終了できるようにします。 Break は、現在実行中のループを中断し、ループの外にジャンプして次のステートメントを実行します。 continue は、現在位置からループの先頭にジャンプして実行します。 exit の実行には 2 つの状況があります。 exit ステートメントが END でない場合、どの操作の exit コマンドもファイルの終わりに到達したかのように動作し、すべてのモードまたは操作の実行が停止し、END の操作が行われます。モードが実行されます。 END に終了が表示されると、プログラムが終了します。
例:
awk のカスタム関数の場合
ユーザー独自の関数を定義して呼び出すことは、ほとんどすべての高級言語に備わっている関数であり、awk も例外ではありませんが、元の awk は関数関数を提供せず、関数は、nawk またはそれ以降の awk バージョンでのみ追加できます。
関数の使用には、関数定義と関数呼び出しの 2 つの部分が含まれます。関数定義には、実行されるコード (関数自体) と、メイン プログラム コードから関数に渡される一時的な呼び出しが含まれます。
awk関数は以下のように定義されています:
function 関数名(パラメータリスト) {
関数本体
}
gawk では関数を省略することができますが、awk の他のバージョンでは省略できません。関数名は有効な識別子である必要があります。パラメータ リストにパラメータを指定することはできません (ただし、関数を呼び出す際には関数名の後の括弧のペアは必須です)。または 1 つ以上のパラメータを指定することもできます。 C 言語と同様に、awk パラメータも値によって渡されます。
awk で関数を呼び出す方法は C 言語に似ていますが、awk は C 言語よりも柔軟です。パラメーターの有効性チェックは実行されません。言い換えれば、関数を呼び出すときに、関数が予期する (関数定義で指定された) より多くのまたは少ないパラメーターをリストすることができます。余分なパラメーターは awk によって無視され、不十分なパラメーターは awk によってデフォルトとして設定されます。パラメーターの使用方法に応じて、値 0 または空の文字列。
awk 関数には、暗黙的な戻りと明示的な戻りという 2 つの戻りメソッドがあります。 awk が関数の最後まで実行されると、呼び出し元プログラムに自動的に戻ります。そのため、関数は暗黙的に戻ります。関数が終了する前に関数を終了する必要がある場合は、明示的に return ステートメントを使用して早期に終了できます。関数内でreturn戻り値の形式のステートメントを使用する方法です。
例: 次の例は、関数の使用法を示しています。この例では、print_header という名前の関数が定義されており、FileName と PageNum という 2 つのパラメーターが呼び出されます。FileName パラメーターは、関数で現在使用されているファイル名に渡され、PageNum パラメーターは現在のページのページ番号です。この関数の機能は、現在のファイルのファイル名と現在のページのページ番号を印刷 (表示) することです。この関数が完了すると、この関数は次のページのページ番号を返します。
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file, pageno); #関数 print_header を呼び出す
>printf("現在のページ番号は: %d",pageno) ;
>}
>#関数 print_header を定義します
>function print_header(FileName,PageNum){
>printf("%s %d",FileName,PageNum) >PageNum++;return PageNUm; ;}
>}' myfile
このプログラムを実行すると、次の内容が表示されます:
myfile 1
現在のページ番号は: 2
awk 高度な入出力
1. 次のレコードを読み取ります:
awk next ステートメントにより、awk は次のレコードを読み取り、パターン マッチングを完了し、対応する操作を直ちに実行します。通常、一致するパターンを使用して操作内のコードを実行します。次に、このレコードの追加の一致パターンが無視されます。
2. 単純にレコードを読み取る
awk の getline ステートメントは、単純にレコードを読み取るために使用されます。 Getline は、ユーザーが 2 つの物理レコードに似たデータ レコードを持っている場合に特に便利です。これで一般的なフィールドの分離が完了しました (フィールド変数 $0 FNR NF NR を設定)。成功した場合は 1 を返し、失敗した場合 (ファイルの終わりに達した場合) は 0 を返します。単純にファイルを読み取る必要がある場合は、次のコードを記述できます:
例: getline の使用例
{while(getline==1)
{
#入力されたフィールドを処理する
}
}
は次のことができます。 getline は、getline 変数を使用して一般的なフィールドを処理する代わりに、入力データをフィールドに保存することもできます。この方法を使用する場合、NF は 0 に設定され、FNR と NR はインクリメントされます。
ユーザーは、コマンドラインにリストされているコンテンツからデータを入力する代わりに、getline<"filename" を使用して、特定のファイルからデータを入力することもできます。この時点で、getline は一般的なフィールド分離 (フィールド変数 $0 と NF の設定) を完了します。ファイルが存在しない場合は、成功の場合は -1、失敗の場合は 1、失敗の場合は 0 を返します。ユーザーは、指定されたファイルからデータを変数に読み取ることも、ファイル名を stdin (標準入力デバイス) またはファイル名を含む変数に置き換えることもできます。この方法を使用する場合、FNR と NR は変更されないことに注意してください。
getline ステートメントを使用する別の方法は、次の例のように、UNIX コマンドからの入力を受け入れることです:
例: UNIX コマンドからの入力を受け入れる例
{while("who -u"|getline)
{
#who コマンドの各行を処理します
}
}
もちろん、次の形式を使用することもできます:
"command" | getline variable
3. ファイルを閉じます。プログラム内の入力ファイルまたは出力ファイル。その方法は、awk の close ステートメントを使用します。
close("filename")
filename は、getline によって開かれたファイルにすることができます (stdin、ファイル名を含む変数、または getline によって使用される正確なコマンドを指定することもできます)。または、出力ファイル (標準出力、ファイル名を含む変数、またはパイプを使用した正確なコマンドの可能性があります)。
4. ファイルへの出力:
awk を使用すると、次の方法で結果をファイルに出力できます:
printf("hello word!")>"datafile"
または
printf("hello word! ") >>"datafile"
5. コマンドへの出力
awk では、次のメソッドで結果をコマンドに出力できます:
printf("hello word!")|"sort-t','"
awk とシェルスクリプトの混合プログラミング
awk は、シェル コマンド を使用できるため、awk はシェル バッチ プログラムと適切に統合でき、awk とシェル プログラムの混合プログラミングを実装できます。ハイブリッド プログラミングを実現する鍵となるのは、awk とシェル スクリプト間の対話、つまり awk とシェル スクリプト間の情報交換です。awk は必要な情報 (通常は変数の値) をシェル スクリプトから取得して実行します。 in awk シェルコマンドラインとシェルスクリプトはコマンドの実行結果をawkに送って処理し、シェルスクリプトはawkの実行結果などを読み込みます。
1.awk はシェルスクリプトプログラム変数を読み取ります
awk では、「'$変数名'」を通じて sell scrpit プログラム内の変数を読み取ることができます。
例: 次の例では、sell scrpit プログラムで変数 Name を読み取り、この変数にはテキスト myfile の作成者が格納され、awk はその名前を出力します。
$cat writename
:
# @(#)
#
.
Name="Zhang San" nawk 'BEGIN {name="'Name'"; ,FILENAME,name");}
{...}END{...}' myfile
.
.
.
2. シェルコマンドの実行結果を awk に送信し、
の一種として処理します情報送信方法では、シェル コマンドの結果をパイプライン (|) 経由で処理するために awk に渡すことができます。
例: awk がシェル コマンドの実行結果を処理する例
$who -u | "%s は %s を実行しています",$2,$1)}'
このコマンドは、登録された端末によって実行されているプログラムの名前を出力します
3 シェル スクリプト プログラムは、awk の実行結果を読み取ります
。シェル スクリプト プログラムが awk の実行結果を読み取ることを実現するには、いくつかの特別な方法を使用できます。たとえば、変数名 = `awk ステートメント` を使用して、awk の実行結果をシェル スクリプト変数に格納できます。パイプラインメソッドを使用して、awk の実行結果をプログラム処理に渡すこともできます。
例: メッセージを送信するためのメカニズムの 1 つとして、UNIX はすべてのユーザーにメッセージを送信するためのコマンド ウォールを提供します。このコマンドを使用すると、すべての作業ユーザー (ターミナル) にメッセージを送信できます。これを行うには、シェル バッチ プログラム Wall.shell を使用してこのプログラムをシミュレートします (実際、古いバージョンでは、wall はシェルです)。バッチプログラム:
$cat Wall.shell
:
# @(#) Wall.shell: 登録されている各端末にメッセージを送信します
#
cat >/tmp/$$
#ユーザー入力メッセージテキスト who -u | awk '{print $2}' | while read tty
do
cat /tmp/$$>$tty
done
このプログラムでは、awk は who -u コマンドの実行結果を受け取ります。登録されているすべての端末の名前、2 番目のフィールドは端末のデバイス名を登録するため、awk コマンドを使用してデバイス名を抽出し、while read tty ステートメントを使用してこれらのファイル名を変数 (シェル スクリプト変数) にループアウトします。 ) 情報送信用の端末アドレスとして tty
4. awk で、シェルコマンドラインを実行します。埋め込み関数 system()
system() は、文字型または数値型には適さない埋め込み関数です。この関数の機能は、パラメータとして渡された文字列を処理することです。システムはこのパラメータをコマンドとして処理します。つまり、コマンド ラインとして実行します。これにより、ユーザーは独自の awk プログラムで必要なときにコマンドやスクリプトを実行できる柔軟性が得られます。
例: 次のプログラムは、システムの組み込み関数を使用して、ユーザーが作成したレポート ファイルを印刷します。このファイルは、myreport.txt という名前のファイルに保存されます。簡単にするために、その END 部分のみをリストします:
.
END {close("myreport.txt");system("lp myreport.txt");}
この例では、最初にclose ステートメントを使用して myreport.txt ファイルを作成し、システム組み込み関数を使用して myreport.txt を印刷のためにプリンターに送信します。
正直に言うと、これらの内容はまだ awk についての予備知識であり、awk も例外ではありません。これからの長い旅は小さなスタートで、残りの道は自分で歩まなければなりません。正直に言って、この記事が本当にあなたの今後の人生に少しでも便利になれば、私は満足です!
この記事についてご質問がある場合は、Chizlong@yeah.net に電子メールを送信するか、ホームページ http://chizling.yeah.net にメッセージを残してください。
付録:
1.awk の正規表現メタ文字
エスケープ シーケンス
^ 文字列の先頭から一致
$ 文字列の末尾から一致
任意の 1 つの文字列と一致
[ABC ] 任意の文字と一致[]内
[A-Ca-c] は、範囲 A-C および a-c (アルファベット順) の文字に一致します
[^ABC] は、[] 内のすべての文字を除く任意の文字に一致します
Desk|Chair は、机と椅子に一致します 一致するものすべてに一致します
[ABC][DEF ] 協会。 A、B、C の任意の文字と一致し、その後に D、E、F の任意の文字が続く必要があります。
* 0 回以上出現する任意の文字 A、B または C と一致します
+ 1 回以上出現する任意の文字 A、B または C と一致します
? 空の文字列、または A、B、または C の任意の文字と一致します
(Blue|Black)berry Blueberry または Blackberry と一致するように正規表現を結合します
2.awk 算術演算子
演算子の使用法
-- -------- --------
x^y x の y 乗
x**y 同上
x%y x/y の余りを計算 (モジュロ)
x+y x プラス y
x-y x マイナス y
x*y yの値の後に1を加える(サフィックスの加算)
--y yから1を引いて使用する(プレフィックスの減算)
y-- 使用後にyから1を減算する(サフィックスの減算)
x=y 値を代入するy の値を x に代入する
x+= y x+y の値を x に代入する
x-=y x-y の値を x に代入する
x*=y x*y の値を x に代入する
x/=y x/y の値を x x %=y x%y の値を x に代入
x^=y x^y の値を x に代入
x**=y x**y の値を x に代入
3.awk で許可されるテスト:
演算子
x==y x は y に等しい
x!=y x は y に等しくない
x>y x は y より大きい
x>=y x は以上y
x
x!~re x は正規表現 re に一致しません (優先順位の昇順)
= 、 +=、 - =、 *= 、/= 、 %=
&&
> < <= == != ~ !~
xy (文字列連結、'x'y' は"xy" )
+ -
* / %
++ --
5.awk 組み込み変数 (定義済み変数)
注: 表内の v 項目は、変数をサポートする最初のツールを表します (以下同様) ): A=awk, N=nawk,P=POSIX awk,G=gawk
V デフォルト値を意味する変数
------------------------ -------- -----------------------------
N ARGC コマンドラインパラメータの数
G ARGIND現在処理されているファイルの ARGV 識別子
N ARGV コマンド ラインパラメータ配列
G CONVFMT 数値変換形式 %.6g
P ENVIRON UNIX 環境変数
N ERRNO UNIX システムエラーメッセージ
G FIELDWIDTHS 入力フィールド幅の空白で区切られた文字列
A FILENAME 現在の入力ファイルの名前
P FNR 現在のレコード数
A FS 入力フィールドの区切り文字スペース
G IGNORECASE 制御の大文字と小文字の区別 0 (大文字と小文字を区別)
A NF 現在のレコード内のフィールドの数
A NR レコードの数読み込まれたもの
A OFMT デジタル出力形式 %.6g
A OFS 出力フィールド区切り文字スペース
A ORS 出力レコード区切り文字改行
A RS 入力レコード区切り文字改行
N RSTART マッチング関数によって一致した最初の文字列
N RLENGTHマッチング関数でマッチングした文字列の長さ
N SUBSEP 添え字区切り文字「34」
6.awk の組み込み関数
V 関数の目的または戻り値
-------------- ------------ -----------------------
N gsub(reg,string,target) target の文字列を置き換えます正規表現 reg が一致するたびに
N index(search ,string) string 内の検索文字列の位置を返します
A length(string) string 内の文字数を検索します
N match(string,reg) 文字列内の位置を返します正規表現 reg
N によって一致する文字列 printf(format,variable ) フォーマットされた出力、format によって提供されるフォーマットに従って出力変数。
N split(string,store,delim) デリミタ delim に従って文字列をストアの配列要素に分解します
N sprintf(format,variable) フォーマットに基づいてフォーマットされたデータを返します 変数は文字列に配置されるデータです
G strftime (format, timestamp) は、format に基づいて日付または時刻の文字列を返します。 timestmp は、systime() 関数によって返された時刻です。
N sub(reg, string, target) 正規表現 reg が初めて一致した場合、それを次のように置き換えます。ターゲット文字列 String
A substr(string,position,len) 位置 len 文字で始まる部分文字列を返します
P totower(string) 文字列内の対応する小文字を返します
P toupper(string) 文字列内の対応する大文字を返します
A atan(x,y) x の余接 (ラジアン)
N cos(x) x の余弦 (ラジアン)
A exp(x) x e のべき乗
A int(x) x の整数部分
A log (x) x の自然対数
N rand() 0 ~ 1 の乱数
N sin(x) x の正弦 (ラジアン)
A sqrt(x) x の平方根
A srand(x) 初期化乱数生成器。 x が省略された場合は、system() を使用します
G system() は、1970 年 1 月 1 日からの経過時間 (秒単位) を返します
AWK コマンドの詳細な説明と関連記事については、PHP 中国語 Web サイトに注目してください。