awk入力による2つのSSH出力

awk入力による2つのSSH出力

試している2つのリモートサーバーsshといくつかのファイルがあります。 sshの出力をコマンドcatに供給したいと思います。awk

これは私が持っているものです。


ssh username@host1 “cat /tmp/test/*” ssh username@host2 “cat /tmp/test/*” | awk ‘ command ‘

しかし、これはうまくいきません。host2ディレクトリが空の場合、出力はhost12回繰り返されます。

私がここで何を間違っているのか?

ベストアンサー1

これらに注意してくださいカール引用符および)一部のWindowsテキストエディタでは、真の引用符('または")を使用します。変数の拡張など、sを'使用する理由がない限り、sを使用する必要があります。"https://mywiki.wooledge.org/Quotes

awkパイプが必要な場合は、次のことを行う必要があります。

{ ssh username@host1 'cat /tmp/test/*'; ssh username@host2 'cat /tmp/test/*'; } | awk ' command '

ただし、後でこれらの区別が必要な場合に備えて、awkが入力がどのコマンドから来たのかを区別できるようにすることを検討してください。

awk ' command ' <(ssh username@host1 'cat /tmp/test/*') <(ssh username@host2 'cat /tmp/test/*')

違いは次のとおりです。

$ seq 3 > file1
$ seq 2 > file2

無効な出力(FILENAME常に含まれてい-ARGV[1..2]空であるため):

$ { cat file1; cat file2; } | awk '
    FILENAME == ARGV[1] { host="host1" }
    FILENAME == ARGV[2] { host="host2" }
    { print host, $0 }
'
 1
 2
 3
 1
 2

無効な出力(同じ一時ファイル記述子が含まれているがFILENAME空であるため):ARGV[1]ARGV[2]

$ awk '
    FILENAME == ARGV[1] { host="host1" }
    FILENAME == ARGV[2] { host="host2" }
    { print host, $0 }
' <(cat file1; cat file2)
host1 1
host1 2
host1 3
host1 1
host1 2

正しい出力:

$ awk '
    FILENAME == ARGV[1] { host="host1" }
    FILENAME == ARGV[2] { host="host2" }
    { print host, $0 }
' <(cat file1) <(cat file2)
host1 1
host1 2
host1 3
host2 1
host2 2

この入力を提供する方法から正しい出力を取得する他の可能な方法は次のとおりです。

$ awk '{print host, $0}' host='host1' <(cat file1) host='host2' <(cat file2)
host1 1
host1 2
host1 3
host2 1
host2 2

おすすめ記事