linux + ssh + 1つのSSHで2つのことを行い、CSVで印刷する

linux + ssh + 1つのSSHで2つのことを行い、CSVで印刷する

次のコマンドは、1 つの SSH 終了時に 2 つの値を出力します。

ssh test01 "hostname && cat  /etc/sysconfig/rhn/rhnsd "


test01
INTERVAL=240

しかし、次の形式を印刷するように構文をどのように変更できますか? (CSV)

 test01,INTERVAL=240

試してみましたが(予想していたものとは異なりました)

ssh test01 "hostname && cat  /etc/sysconfig/rhn/rhnsd " | awk '{print $1","$2}'


test01,
INTERVAL=240,

答え1

あなたがする必要があるのは、コマンドの出力を解析して最初の改行文字(\n)をコンマに置き換えることだけです。これは働きます:

ssh test01 "hostname && cat  /etc/sysconfig/rhn/rhnsd " | 
    perl -00pe 's/\n/,/'

ここではperl、()を使用してファイル全体をメモリに入れ、-0最初のファイルをコンマで置き換えます。\n与えられたスクリプトを実行した後、入力の各「行」(1行はファイル全体)を印刷するように指示します-pperl-e


awkあなたがうまくいかないのは、各行awkに提供したスクリプトを実行するためです。コマンドは2行を印刷しますが、どちらもフィールドが1つしかないため定義されてい$1ませ$2ん。したがって、最初と2番目の行print $1","$2に展開すると、結果は次のようになります。print "test01"","print "INTERVAL=240"","

test01,
INTERVAL=240,

考えられる解決策は次awkのとおりです。

ssh test01 "hostname && cat  /etc/sysconfig/rhn/rhnsd " | 
    awk '{printf "%s,", $1}' | sed 's/,$//'

これにより、各行の最初のフィールドが印刷され、その後にカンマが表示されます。このsedコマンドは、印刷された最後の行の後のコンマを削除します。

1 つのフィールドの代わりに行全体を印刷するには、次のようにします。

ssh test01 "hostname && cat  /etc/sysconfig/rhn/rhnsd " | 
    awk '{printf "%s,", $0}' | sed 's/,$//'

答え2

次のようなテデンsed私の提案は主に完全性のために含まれていますが、awk '{printf "%s,", $1}'集計と同時に省略される代替案を追加することです。新しいチームsed我々は積極的に交換しています。改行文字したがって、他の文字を交換したい場合にも適しています。これは低効率しかし。

問題の命令はssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;s/\n/, /;ba'

この不思議なsed命令は、分解して:a;N;s/\n/, /;baみると実際には非常に簡単です。

sed一度に入力を変換します(IEとは反対ですが、通常はデフォルトでeded含まれていません)。変更されていないsshコマンドは、以下を返します。

[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D"
05
Debian-76-wheezy-64-minimal
a
s
d
f
d
05/04/16

追加すると、次のようなN;s/\n//結果が得られます。

[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed 'N;s/\n//'
05Debian-76-wheezy-64-minimal
as
df
d05/04/16

これNNextパターンスペースに対応する行を入力し、次のようにs/\n//削除します。新しいチームパターン空間で。だから我々は削除されたペアを得ました。改行文字ここで。

これで、完全な入力をパターン空間に送信するには、次のものが必要です。リングタグの助けを借りて。

[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;s/\n//;ba'
05Debian-76-wheezy-64-minimalasdfd05/04/16

:aラベルを設定すると、ba無条件ラベルにジャンプしますa

したがって、sed ':a;N;s/\n//;ba' 実行される作業は次のとおりです。

  • ラベルの定義a
  • パターン空間に次の行を追加する(N
  • パターンスペースを送るs/\n//
  • 次へa

追加する新しい行がない場合は、Nスクリプトの最後で終了します。

CSを入手するには、代替項目を変更するだけです。

[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;s/\n/, /;ba'
05, Debian-76-wheezy-64-minimal, a, s, d, f, d, 05/04/16

これは、パターン空間が各ラインに対する置換コマンドを介してラインを追加および送信するので、特にライン数が多い場合、それほど効率的ではない。集計前に交換する方が効率的ですが、sedそうすることはできません。

N次の行を追加した後にパターンスペースを印刷すると、pこれは非常に明確になります(その場所に1つだけ配置すると、現在のパターンスペースが印刷されます)。以下の出力では、2行ごとに現在のパターンスペースを表します(*newlineがまだ含まれているため)。改行文字を次に変更する直前ですs/\n//

[me@hostname] ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;p;s/\n/, /;ba'
05
Debian-76-wheezy-64-minimal
05, Debian-76-wheezy-64-minimal
a
05, Debian-76-wheezy-64-minimal, a
s
05, Debian-76-wheezy-64-minimal, a, s
d
05, Debian-76-wheezy-64-minimal, a, s, d
f
05, Debian-76-wheezy-64-minimal, a, s, d, f
d
05, Debian-76-wheezy-64-minimal, a, s, d, f, d
05/04/16
05, Debian-76-wheezy-64-minimal, a, s, d, f, d, 05/04/16

答え3

コマンドに対して予想される出力が生成されます。

counter=0
ssh test01 "hostname && cat  /etc/sysconfig/rhn/rhnsd " \
  | while read line ; do 
  ((counter++)) 
  if [[ counter -eq 1 ]]; then 
    echo -ne "${line},"
  else
    echo "$line"
  fi
  done

関連情報