awk をコマンドまたはプログラミング言語として解釈するのはいつですか?

awk をコマンドまたはプログラミング言語として解釈するのはいつですか?

それがスクリプト プログラミング言語であることはわかっていますawkが、コマンドとして解釈するのか、プログラムとして解釈するのか混乱することがあります。

例1-ここでは命令として解釈する:

awk '{print $2}' file.txt

例2-ここではawkプログラムとして解釈します:

awk 'BEGIN      {skip = 0} \
        skip == 0  {if (NF == 0) 
                     {skip = 1}  \
                    else 
                     {print};  \
                    next} \
        skip == 1  {print; \
                    skip = 0; \
                    next}'

出典ここ

質問は次のとおりです:

  1. awk をコマンドとして解釈する必要があるのはいつですか?
  2. awk はいつプログラムになるのでしょうか?
  3. 最初の例をコマンドとして呼び出すと問題がありますかawk?

何かのようなもの:

awk '{print $2}' file.txt | awk '{FS=" "} {print 4}'

awkプログラムはパイプを使用して通信できることを意味しますか?

答え1

awkには 2 つの呼び出しモードがあります。1 つはコマンド ライン上のプログラム テキストを使用するモード、もう 1 つはファイルからのプログラムを使用するモードです。これは awk のマニュアル ページの概要に記載されています (これは Ubuntu 12.04 の mawk からのものです)。

   mawk  [-W  option] [-F value] [-v var=value] [--] 'program text' [file
   ...]
   mawk [-W option] [-F value]  [-v  var=value]  [-f  program-file]  [--]
   [file ...]

最初の形式をプログラムと呼ぶかどうかは、使用するプログラムの定義によって異なります。どちらの形式もプログラムを含み、最初の形式ではプログラムはコマンドライン引数として指定されます。どちらの例もオプションを含まないため、最初の形式になります-f。2 番目の例に複数行のコマンドライン引数があることは、この点では無関係です。

これは に固有のものではありませんawk。たとえば、 では、デフォルトで python はコマンドライン引数をプログラム名として解釈しますが、-cオプションを使用するとコマンドラインでプログラムを指定できます (つまり、デフォルトでは とは逆になりますawk)。

それとは別に、パイプを使用した通信があります。これはシェル構文と OS によって処理され、スクリプトで実行する必要があるのは、stdout への書き込み、繰り返し、stdin からの読み取りだけです。つまり、awkプログラムはパイプを介して通信できます。

答え2

厳密に言えば、電話をかけるときにはawk、あなたは言語ではなく通訳者について言及しています。言語はAWK

awk(またはmawk、 ) は、プログラミング言語nawkで記述されたプログラムを実行する唯一のユーティリティです。AWK

POSIXの定義によれば、awk プログラムは:

プログラム

-f オプションが指定されていない場合、awk の最初のオペランドは awk プログラムのテキストになります。アプリケーションは、プログラム オペランドを awk への単一の引数として提供する必要があります。テキストが で終わっていない場合、awk はテキストを で終わっているものとして解釈します。

したがって、オプションを使用しない場合は-f、2 つの例を awk プログラムとして考えることができます。

関連情報