ウェブサイト検索

awk を使用して外部プログラムを呼び出す方法


導入

Awk は、データ操作、フィルタリング、レポートなどのさまざまなタスクを自動化するために使用できる強力なテキスト処理ツールです。 awk の興味深い機能の 1 つは、スクリプト内から外部プログラムを呼び出す機能です。この記事では、awk を使用して外部プログラムを呼び出す方法を説明します。

System() 関数を理解する

system() 関数は、awk 内から外部コマンドを実行するために使用されます。 system() 関数の構文は次のとおりです-

system(command)

command 引数は、実行する外部コマンドです。 system() 関数が実行されると、awk は実行のためにコマンド引数をシェルに渡します。その後、shell はコマンドを実行し、終了ステータスを awk に返します。

外部プログラムの呼び出し

awkを使って外部プログラムを呼び出すには、system()関数の引数として実行したいコマンドを指定する必要があります。たとえば、awk スクリプト内から date コマンドを実行したいとします。これは次のように行うことができます-

{ 
   system("date") 
}

この例では、system() 関数を使用して date コマンドを呼び出しています。スクリプトを実行するとdateコマンドが実行され、画面上に現在の日時が表示されます。

入力を外部プログラムに渡す

system() 関数を使用して外部プログラムに入力を渡すことができます。たとえば、sort コマンドを使用して数値のリストを並べ替えたいとします。これは次のように行うことができます-

{ 
   print "3
1
2" | "sort" 
}

この例では、print ステートメントを使用して数値のリスト (3、1、2) を生成します。次に、パイプ記号 (|) を使用して、この数値リストを入力として sort コマンドに渡します。次に、sort コマンドは数値をソートし、結果を awk に返します。

外部プログラムの出力の保存

getline() 関数を使用して、外部プログラムの出力を変数に保存できます。 getline() 関数は、ファイルまたはコマンドから入力行を読み取るために使用されます。 getline() 関数を使用して、外部プログラムの出力をキャプチャできます。たとえば、ls コマンドの出力を変数にキャプチャしたいとします。これは次のように行うことができます-

{ 
   "ls" | getline output 
   print output 
}

この例では、system() 関数を使用して ls コマンドを実行しています。次に、getline() 関数を使用して、ls コマンドの出力を出力変数にキャプチャします。最後に、print ステートメントを使用して ls コマンドの出力を表示しています。

外部プログラムに引数を渡す

system() 関数を使用して外部プログラムに引数を渡すことができます。たとえば、tr コマンドを使用して文字列を大文字に変換するとします。これは次のように行うことができます-

{ 
   str = "hello world" 
   cmd = "echo " str " | tr '[:lower:]' '[:upper:]'" 
   cmd | getline output 
   print output 
}

この例では、echo コマンドを使用して、文字列「hello world」を入力として tr コマンドに渡します。次に、tr コマンドを使用して文字列を大文字に変換します。最後に、getline() 関数を使用して、tr コマンドの出力を出力変数にキャプチャします。

エラーの処理

awk を使用して外部プログラムを呼び出す場合、実行中に発生する可能性のあるエラーを処理することが重要です。 system() 関数を使用して外部プログラムの終了ステータスを確認できます。終了ステータスは、コマンドの成功または失敗を示す数値です。値 0 は成功を示し、値 0 以外は失敗を示します。

たとえば、test コマンドを使用してファイルが存在するかどうかを確認したいとします。これは次のように行うことができます-

{ 
   file = "myfile.txt" 
   cmd = "test -e " file 
   if (system(cmd) != 0) { 
      print "File does not exist" 
   } else { 
      print "File exists" 
   } 
}

この例では、test コマンドを使用してファイル「myfile.txt」が存在するかどうかを確認しています。次に、system() 関数を使用してテスト コマンドを実行します。テストコマンドの終了ステータスがゼロ以外の場合、「ファイルが存在しません」と出力されます。それ以外の場合は、「ファイルが存在します」と表示されます。

高度な例

  • 外部プログラムの出力のフィルタリング awk を使用して、外部プログラムの出力をフィルタリングできます。たとえば、ps コマンドの出力の最初の行だけを表示したいとします。これは次のように行うことができます-

{ 
   cmd = "ps" 
   cmd | getline output 
   close(cmd) 
   split(output, lines, "
") 
   print lines[1] 
}

この例では、getline() 関数を使用して ps コマンドの出力を出力変数にキャプチャしています。次に、split() 関数を使用して出力を行の配列に分割します。最後に、print ステートメントを使用して出力の最初の行を表示します。

  • 外部コマンドでの awk 変数の使用 外部コマンドで awk 変数を使用できます。たとえば、touch コマンドを使用して変数に基づいた名前のファイルを作成するとします。これは次のように行うことができます-

{ 
   filename = "myfile.txt" 
   cmd = "touch " filename 
   system(cmd) 
}

この例では、touch コマンドで filename 変数を使用して、「myfile.txt」という名前のファイルを作成しています。

  • awk を使用して外部プログラムの出力をフォーマットする awk を使用して、外部プログラムの出力をフォーマットできます。たとえば、df コマンドの出力をより読みやすい形式で表示したいとします。これは次のように行うことができます-

{ 
   cmd = "df -h" 
   cmd | getline output 
   close(cmd) 
   printf "%-20s%-10s%-10s%-10s%-10s%s
", "Filesystem", "Size", "Used", "Avail", "Use%", 
   "Mounted on" 
   split(output, lines, "
") 
   for (i=2; i<=length(lines); i++) { 
      printf "%-20s%-10s%-10s%-10s%-10s%s
", $1, $2, $3, $4, $5, $6 
   } 
}

この例では、printf ステートメントを使用して df コマンドの出力をフォーマットしています。列見出しを含むヘッダー行を出力し、その後に各列を固定幅に揃えて df コマンドの出力を出力しています。

結論

この記事では、awk を使用して外部プログラムを呼び出す方法を検討しました。入力を外部プログラムに渡し、外部プログラムの出力をキャプチャし、実行中に発生する可能性のあるエラーを処理する方法を説明しました。外部プログラムを呼び出す awk の機能を使用すると、さまざまなタスクを自動化し、スクリプトをより強力かつ柔軟にすることができます。