Linuxコマンド.NETLinuxコマンド.NETLinuxコマンドを中心にIT技術関係の情報を発信します。Linuxコマンドについてはできるだけ実行例と実行結果を紹介したいと思います。Linuxコマンドawkはパターンマッチやテキスト処理が得意なプログラミング言語です。awkはプログラムのコンパイルが必要ないインタプリタ言語になります。awkコマンドは、テキストデータである入力ファイルを行ごと処理することができ、一行で記述できる程度のプログラム量でも様々な処理を行うことができます。awkはインタプリタ言語であるため、PerlやRuby、Pythonのようにシバン(#!)を用いれば、自己完結型のスクリプトを作成することができます。参考awkプログラムについてawkプログラムは基本的にパターン(pattern)とアクション(action)で成り立つルールを記述していきます。awkが入力ファイルから行を読み込んだときに当てはまるルールの処理を行います。ルールは基本的に以下のように記述できます。}また、awkプログラムはルールのほかに関数を定義する場合もあります。関数の構文は以下のように記述できます。}また、awkプログラムの文は改行もしくはセミコロン(;)で区切ることができます。x}また、上のプログラムは入力ファイルの行を出力した後、次の行に3を出力します。入力ファイルの全ての行の後に3という数字が挿入される結果が得られます。}'data13data23また、awkのコメント行は'#'を利用します。'#'を利用した場合は行末までコメントになります。パターンがないルールパターンがないルールは、awkが行を読み込むときに常に処理されます。testdata.txt13579$0,$1,$2,...は特別な変数になります。$0の場合は行の全体を表します。$1,$2,...の変数は行がスペースやタブで区切られたデータ列とみて、1列目、2列目、...を表します。この区切り文字は組み込み変数FSで変更できます。}'のようにすることで同様な結果を得ることができます。アクションがないルールアクションがないルールにはデフォルトのアクションが設定されています。9また、BEGINやENDのような特別なパターンにはデフォルトのアクションはありません。基本的な特別なパターンawkプログラムのパターンにはBEGINとENDの特別なパターンがあります。BEGINはawkが処理し始める最初の処理を記述できます。変数の初期化などを行うことができます。以下は行番号を出力するコマンド例になります。melon行番号を表示する場合は、もっと簡単に記述できます。組み込み変数NRはawkが処理した行数が設定されています。melonのように同様の結果を得ることができます。同様に、ENDはawkの処理が終了するときの最後の処理を記述できます。以下は行を逆順にする例になります。fruits.txtmelonbananaappleまた、他の特別なパターンにBEGINFILEとENDFILEがあります。これはファイルの読み込み開始と読み込み終了の処理を記述できます。FILE--awkコマンドの引数の入力ファイル'-'は、標準入力になります。...のように利用できます。inputfileがない場合は標準入力から読み込まれます。awkコマンドでinputfileがないときにパイプやリダイレクトを用いていない場合、端末から入力を読み込むために入力待ちの状態になります。これはCtrl+dで入力を終了できます。BEGINパターンの文の場合は、端末からの入力を行わずに終了します。awkのプログラムをファイルから実行させたい場合は、-fオプションを用います。inputfile...また、自己完結型のスクリプトを作成する場合も-fオプションを用います。script"}スクリプトを実行するために、chmodコマンドで実行権限を付与すると、スクリプトを実行できるようになります。scriptファイルの最初の行にある#!(シバン,shebang)の後に、インタプリタ言語のプログラムを指定することで、その後の行はそのインタプリタでのプログラムとして解釈し、実行できます。#!のプログラムの指定は絶対パスで指定し、#!のあるスクリプトを実行させた場合、シェルは、#!の行、スクリプトファイル名、実行するときのスクリプトファイルにある引数となるように実行されます。./script.awkのように解釈されて実行されます。awkの変数と定数awkの変数の初期値は空の文字列になります。変数を数値として扱う場合、その初期値は0になります。variableコマンドラインでも変数を代入することができます。一つは-vオプションを用いて変数を代入する方法があります。一つはコマンドライン引数に変数の代入を行う方法になります。testdata.txtdata1data2data3data4data513579組み込み変数awkで利用する組み込み変数の一部紹介します。変数$nはほしい列を抜き出すのに便利な変数になります。変数NRは、行ごとの処理内容を配列に保持したり、終了時の処理時にその配列から値をすべて取り出すような場合に便利な変数です。組み込み変数を覚えておくとawkをより活用できるようになります。$0は行全体を表します。$1,$2,$3,...は空白文字を区切り文字とした列を表します。数値は以下のようなものになります。1.234e+51212341.234e+5文字列は以下のようなものになり、ダブルクォーテーションで文字列を囲みます。World"正規表現は/.../で文字列を囲んだものになります。この正規表現の定数は'~'や'!~'の右辺として利用します。/.../'のような意味になります。同じ文字列と数値の変換awkは文字列と数値を文脈によって、変換します。}'の結果は15115のように表示されます。これはまず、数値1と数値2が文字列として変換・結合されます。その後、前の結果の文字列12は数値12に変換され、数値の3が加算されます。結果として、15と表示されます。これは変数でも同様です。}'15文字列から数値の変換について、文字列から数値の変換は文字列の最初の数字が数値として変換されます。}'は12112のようになります。数値として変換できないような文字列は0として扱われます。}'0awkの文print文/printf文print文やprintf文は、文字や数値を出力できます。item2,...になります。引数全体やアイテムの項目は、'()'のような括弧でくくることができます。括弧の有無によって、'>'の演算子をリダイレクトとして扱わずに、関係の演算子で扱うようにすることができます。アイテムの引数は組み込み変数OFSで設定された区切り文字で、区切られて出力されます。組み込み変数OFSのデフォルトはスペースになります。item2,...であり、これはC言語のprintf関数のように、引数はフォーマット文字列とフォーマット指定子に入る値になります。cccリダイレクション(redirection)print文やprintf文はシェルのように出力をリダイレクト(redirect)したり、パイプ(pipe)に送ることができます。cccのようにファイルにリダイレクトすることができます。パイプを用いる場合は以下のように利用できます。file.txt97531リダイレクトやパイプを利用すると、ファイルやパイプはオープンされた状態になります。これはawkが終了するまで、クローズされません。多くのファイルをオープンするとエラーが発生するため、多くのファイルをオープンする場合などは、必要な処理が終了した後にできるだけすぐにclose関数を呼び出し、ファイルやパイプをクローズします。close関数で閉じるファイルやパイプの指定は、リダイレクトやパイプを使用した文字列を引数にします。変数などにファイル名やコマンドを代入するとよいでしょう。else-body]のような構文になります。odd"のように'{}'で囲む必要はありません。そのまま一文で記述するならば、上のスクリプトは以下のように記述し実行できます。value/regexp:case-bodydefault:default-body}のような構文になります。switch文はC言語のswitch文のように利用できます。{body}のような構文になります。{body}のような構文もあります。これは配列の全要素に対して、アクセスするのに便利な構文になります。{body}のような構文になります。(condition)のような構文になります。}'01234continue文はループ処理の残りの部分を飛ばし、即座に次のループに移行できます。break文は、ループ処理の抜け出しやswitch文の抜け出しに利用できます。next文/nextfile文next文は呼び出した時点で、現在行の処理を飛ばして、次の行の処理に移行します。9nextfile文も同様に、現在のファイルの処理を飛ばして、次のファイルの処理に移行します。1exit文exit文はawkの処理を終了し、ENDパターンの処理を行い、終了ステータスを返します。ENDパターン内でのexit文はそのままawkの処理が終了します。1exitgetline文getline文は次の行を読み込みます。next文と異なり、処理は継続して行われます。getline文は引数に変数を取ることができます。変数が存在する場合はその変数に行の値が代入されます。引数が存在しない場合は$0の変数が変更されます。NR等の変数も書き換わります。9getline文はリダイレクトを用いて、ファイルの行を読み込むことができます。9他にも、パイプから行を読み込むこともできます。1ファイルのオープンやパイプからの読み込みも一度使用したら、awkが終了するまでオープンされた状態になります。これはprint文のリダイレクトのようにclose関数でファイルやパイプをクローズできます。このパターンに当てはまる式は大まかに3つあります。それは正規表現と式と範囲があります。expression)正規表現は文字列を/.../のように囲んだものになります。パターンがこの正規表現にマッチしている行のときにアクションが実行されます。7式(expression)パターンの式の値が数値の0ではない、または、空文字列ではない場合にアクションが実行されます。7範囲(range)パターンをカンマで区切ることで始まりのパターンから終わりのパターンまでの範囲に対して、アクションを実行することができます。7その他のパターンその他のパターンとして以下の特別のパターンがあります。関数は以下のように定義することができます。string}awkで関数での変数のローカル宣言を行いたい場合は、関数の引数にその変数を追加することで、ローカル宣言のように扱うことができます。関数の引数かまたは関数のローカル変数かを区別するために、ローカル変数に余分な空白を追加するようなコーディング規則があります。1234関数はreturn文を利用することで値を返すこともできます。Functionsで確認できます。コメントをキャンセルメールアドレスが公開されることはありません。*次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。Linuxコマンド.NET.。