リモートシステムのgrep

リモートシステムのgrep

コンテンツを含むテンプレートファイルがあります。

数量:2

ssh ubuntu@ip << EOF
 cat template|grep count|awk -F":" '{print $2}' > log
EOF

希望の出力は2です。

しかし印刷中count : 2

答え1

ここにあるドキュメントは、変数拡張と同様の参照コンテキストを<< EOF生成します。そこにローカルシェルによって拡張されている"..."$2(アポストロフィは大きな引用符付き文字列内にあるため、何も引用しないため、特殊文字ではありません。入れ子にして「引用レベルを上げる」ことは'...'できません"..."。)

ローカルシェルには引数がない可能性があるため、空の$2文字列に展開されますが、リモートシェルはstdinから受け取ります。

cat template|grep count|awk -F":" '{print }' > log

awkはprintフルラインです。

次のように、終了文字列にアポストロフィスタイルの引用符を追加して、変数を拡張しないようにheredoc演算子に要求できます。

ssh ... << 'EOF'
...
EOF

この例では、この操作を実行すると、ファイルは$2heredoc処理後も保持され、sshを介してリモートシェルに渡されます。

ボーナスのヒント:すべてができるので、cat | grep | awkこれは二重の無駄です。awkリモートコマンドは次のとおりです。

awk -F":" '/count/ {print $2}' template > log

関連情報