gawk Ⅰ

3918 ワード

awk vs gawk
VIのようなインタラクティブなテキストエディタ(interactive text editor)のほか、Linuxには2つのコマンドラインテキストエディタ(command line editor)があります.sedとgawkです.gawkについて説明します.

gawk


gawkはUnixのawkのGNUバージョンで、gawkはプログラミング言語で、以下のことができます.
  • 定義変数格納データ
  • 数学および文字列演算子を使用してデータ
  • を操作する
  • if-thenやloop
  • などの論理制御を追加
  • データファイルからデータを抽出し、フォーマットの良いレポート
  • を生成する.
    gawk構文:
    gawk options program file
    

    optionsパラメータは次のとおりです.
    Option
    Description
    -F fs
    インターバルの指定、データ行の分割
    -f file
    指定したファイルのプログラムコマンドを使用してデータを処理
    -v var=value
    変数およびデフォルトの定義
    -mf N
    Specifies the maximum number of fields to process in the data file
    -mr N
    Specifies the maximum record size in the data file
    -W keyword
    Specifies the compatibility mode or warning level for gawk

    Reading the program script from the command line


    gawk program scriptは{}カッコで包む必要があります.gawkはプログラムスクリプトが文字列であると考えているので、単一引用符で囲む必要があります.
    gawk '{print "Hello World!"}'
    

    この行のスクリプトを実行すると、何も出力されず、入力を待っています.これはgawkにfileが指定されていないため、gawkはデフォルトでstdINからコンテンツを取得します.printコマンドは、印刷内容をstdOUTに送信します.gawkはsedのように、データストリームの内容を1行1行処理します.上記のgawkコマンドを終了するには、Ctrl+Dシミュレータファイル終了子EOFを使用します.

    Using data field variables


    gawkは、各行のデータを処理する際に、以下の変数を使用することができる.
  • $0は、行全体のデータ
  • を表します.
  • $1は、データ行が分割する1番目のフィールド
  • を表す.
  • $2は、データ行が分割する2番目のフィールド
  • を表す.
  • $nは、データ行が分割するN番目のフィールド
  • を表す.
    gawkのデフォルトのフィールド分割子は、tabやスペースなどの任意の空白文字です.デフォルトの分割子を使用するには、次の手順に従います.
    $ cat data2.txt
    One line of test text.
    Two lines of test text.
    Three lines of test text.
    
    $ gawk '{print $1}' data2.txt
    One
    Two
    Three
    

    分割子の指定:
    $ gawk -F: '{print $1}' /etc/passwd
    root
    bin
    daemon
    adm
    lp
    sync
    

    Using multiple commands in the program script


    sedのように、コマンドラインで複数のプログラムスクリプトを使用する場合は、コマンドをセミコロンで区切る必要があります.
    $ echo "My name is Rich" | gawk '{$4="Christine"; print $0}'
    My name is Christine
    

    同様にsecondary promptも使用できます.
    $ echo "My name is Colin" | gawk '{
    > $4="f"
    > print $0}'
    My name is f
    

    Reading the program from a file


    gawkは、ファイルからプログラムスクリプトを読み込むこともできます.
    $ cat script2.gawk
    {
    text = "'s home directory is "
    print $1 text $6
    }
    
    $ gawk -F : -f script2.gawk /etc/passwd
    root's home directory is /root
    bin's home directory is /bin
    daemon's home directory is /sbin
    adm's home directory is /var/adm
    lp's home directory is /var/spool/lpd
    

    注意:gawkプログラムスクリプトでは変数を定義することもできます.また、変数を参照するときに$記号は必要ありません.

    Running scripts before processing data


    BEGINでは、gawkがデータ行を処理する前に実行するプログラムスクリプトを指定できます.
    $ cat data3.txt
    Line 1
    Line 2
    Line 3
    
    $ gawk 'BEGIN {print "The data3 file contents:"} {print $0}' data3.txt 
    The data3 file contents:
    Line 1
    Line 2
    Line 3
    

    Running scripts after processing data


    ENDでは、gawkがすべてのデータ行を処理した後に実行するプログラムスクリプトを指定できます.
    $ gawk '
    > BEGIN {print "The data3 file contents:"}
    > {print $0}
    > END {print "End of File"}' data3.txt
    The data3 file contents:
    Line 1
    Line 2
    Line 3
    End of File
    

    gawkスクリプトの作成


    script4.gawk内容:
    BEGIN {
      print "The latest list of users and shells"
      print " UserID \t Shell"
      print "-------- \t -------"
      FS=":"
    }
    
    {
      print $1 " \t " $7
    }
    
    END {
      print "This concludes the listing"
    }
    

    注:FSを使用して、データ行フィールド区切り記号(field separation character)を定義できます.
    このスクリプトを使用してレポートを生成するには、次の手順に従います.
    gawk -f script4.gawk /etc/passwd
    

    参考:Linux Command Line and Shell Scripting Bible 3 rd Edition第19章