2 つのコマンドを一度に出力するための 3 つのトリック 一列。通常、2 つのコマンドの出力は、Linux ターミナルではキャリッジ リターン で常に区切られます。
スクリプト作成における大きなハードルの 1 つは、要件に応じて出力を適切にフォーマットすることです。 Linux/Unix では、各コマンドはその出力を常に新しい行に stdout します。これは、コーダーが 2 つの出力、2 つの項、1 つの行に 2 つの変数 (たとえば CSV 形式) を必要とする多くの状況でハードルになります。この投稿では、2 つ以上のコマンドの出力を 1 行に表示する方法について説明します。
また読む :スクリプティング関連の投稿
通常、複数のコマンドを実行すると、出力が異なる行に表示されます:
# date ; hostname Sat Dec 24 01:35:50 EDT 2016 testsrv2 # echo text1; echo text2; echo text3 text1 text2 text3
上記の例では、コマンドは行ごとに出力を持っています。以下のトリックを使用して、すべての出力を 1 行で達成します。
トリック 1:
翻訳機能の使用。 前述したように、各コマンド出力にはキャリッジ リターンが伴います。キャリッジ リターンをタブ文字で変換するため、2 つ以上のコマンドが 1 行に出力されます。
# (date; hostname) |tr '\n' '\t' Sat Dec 24 01:36:22 EDT 2016 testsrv2 # (echo text1; echo text2; echo text3) |tr '\n' '\t' text1 text2 text3
出力を変換機能にバイパスすることで、単一行の出力を実現しました。ここでは tr
に指示しました すべてのキャリッジ リターンを変換する関数 (\n
) からタブ (\t
).
CSV 形式 (カンマ区切り値) で出力する場合は、タブをカンマに置き換えると取得できます。
# (date; hostname) |tr '\n' ',' Sat Dec 24 01:43:09 EDT 2016,testsrv2, # (echo text1; echo text2; echo text3) |tr '\n' ',' text1,text2,text3,
すべてのコマンド出力が \n で終わることを示す 1 つの末尾のコンマを確認できます。したがって、,
に置き換えられます。
トリック 2:
各コマンド出力を変数として定義する。 ここでは、各コマンドの出力を 1 つの変数に格納し、それらの変数を 1 行でエコーします。
# mydate=`date` # myname=`hostname` # echo $myname $mydate testsrv2 Sat Dec 24 01:46:04 EDT 2016
ここでは、日付とホスト名コマンドの出力を mydate
に保存しました および myname
変数。最後のコマンドでは、間にスペースを入れて両方の変数をエコーしました。コマンド出力は、バッククォートを使用してコマンドを実行することで変数に格納できることに注意してください (インライン実行)!
トリック 3:
インライン実行出力をエコーする。 インライン実行、つまり、バックティックを使用して別のコマンド内でコマンドを実行します。このトリックを使用して、出力を 1 行でエコーします。
# echo "`date` `hostname`" Sat Dec 24 01:50:36 EDT 2016 testsrv2
上記の例では、まず、コマンドを実行して出力を取得しました。しかし、これらの出力は echo コマンドに送られます。したがって、echo コマンドを stdout で 1 行にまとめます。
# echo "`echo text1` `echo text2` `echo text3`" text1 text2 text3
各コマンドを個別の逆引用符で実行したことに注意してください。