Awk-output-redirection
AWK-出力のリダイレクト
これまで、標準出力ストリームにデータを表示しました。 データをファイルにリダイレクトすることもできます。 print または printf ステートメントの後にリダイレクトが表示されます。 AWKのリダイレクトは、シェルコマンドのリダイレクトと同様に記述されますが、AWKプログラム内で記述される点が異なります。 この章では、適切な例を使用してリダイレクトについて説明します。
リダイレクト演算子
リダイレクト演算子の構文は次のとおりです-
構文
print DATA > output-file
データを output-file に書き込みます。 出力ファイルが存在しない場合は、作成します。 このタイプのリダイレクトを使用すると、最初の出力が書き込まれる前に出力ファイルが消去されます。 同じ出力ファイルへの後続の書き込み操作では、出力ファイルは消去されませんが、追加されます。 たとえば、次の例では、 Hello、World !!! をファイルに書き込みます。
いくつかのテキストデータを含むファイルを作成しましょう。
例
[jerry]$ echo "Old data" >/tmp/message.txt
[jerry]$ cat/tmp/message.txt
このコードを実行すると、次の結果が得られます-
出力
Old data
ここで、AWKのリダイレクト演算子を使用して、コンテンツをそこにリダイレクトします。
例
[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
[jerry]$ cat/tmp/message.txt
このコードを実行すると、次の結果が得られます-
出力
Hello, World !!!
演算子を追加
追加演算子の構文は次のとおりです-
構文
print DATA >> output-file
データを output-file に追加します。 出力ファイルが存在しない場合は、作成します。 このタイプのリダイレクトを使用すると、新しいコンテンツがファイルの最後に追加されます。 たとえば、次の例では、 Hello、World !!! をファイルに追加します。
いくつかのテキストデータを含むファイルを作成しましょう。
例
[jerry]$ echo "Old data" >/tmp/message.txt
[jerry]$ cat/tmp/message.txt
このコードを実行すると、次の結果が得られます-
出力
Old data
次に、AWKの追加演算子を使用して、コンテンツを追加します。
例
[jerry]$ awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }'
[jerry]$ cat/tmp/message.txt
このコードを実行すると、次の結果が得られます-
出力
Old data
Hello, World !!!
Pipe
ファイルを使用する代わりに、パイプを介して別のプログラムに出力を送信することができます。 このリダイレクトにより、コマンドへのパイプが開かれ、このパイプを介してアイテムの値が別のプロセスに書き込まれてコマンドが実行されます。 リダイレクト引数コマンドは、実際にはAWK式です。 パイプの構文は次のとおりです-
構文
print items | command
*tr* コマンドを使用して、小文字を大文字に変換します。
例
[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
このコードを実行すると、次の結果が得られます-
出力
HELLO, WORLD !!!
双方向通信
AWKは、双方向通信である* |&を使用して外部プロセスと通信できます。 たとえば、次の例では *tr コマンドを使用して小文字を大文字に変換します。 私たちの command.awk ファイルには以下が含まれています-
例
BEGIN {
cmd = "tr [a-z] [A-Z]"
print "hello, world !!!" |& cmd
close(cmd, "to")
cmd |& getline out
print out;
close(cmd);
}
このコードを実行すると、次の結果が得られます-
出力
HELLO, WORLD !!!
スクリプトは不可解に見えますか? それを分かりやすく説明しましょう。
- 最初のステートメント cmd = "tr [a-z] [A-Z]" は、AWKからの双方向通信を確立するコマンドです。
- 次のステートメント、つまりprintコマンドは、 tr コマンドへの入力を提供します。 ここで、*&| *は双方向通信を示します。
- 3番目のステートメント、つまり* close(cmd、 "to")は、実行の競合後に *to プロセスを閉じます。
- 次のステートメント cmd |&getline out は、getline関数を使用して output をout変数に格納します。
- 次のprintステートメントは出力を印刷し、最後に close 関数がコマンドを閉じます。