リモートコンピュータで複雑なawkスクリプトを実行するには?

リモートコンピュータで複雑なawkスクリプトを実行するには?

(リモートシステムから)重複行を削除するには、リモートシステムで次のawk構文を実行する必要があります。

「!」前に「\」も追加しましたが、うまくいきませんでした。

 ssh root@$remote_machine "    awk '/^#/ || !a[$0]++' /tmp/file > /tmp/file.new"
-bash: !a[$0]++': event not found
 ssh root@$remote_machine "    awk '/^#/ || \!a[$0]++' /tmp/file > /tmp/file.new"

 awk: cmd. line:1: /^#/ || \!a[-bash]++
 awk: cmd. line:1:         ^ backslash not last character on line
 awk: cmd. line:1: /^#/ || \!a[-bash]++
 awk: cmd. line:1:         ^ syntax error

この問題を解決する方法についてのアイデアはありますか?

私のファイルの例:

# ssh root@$remote_machine "   cat  /tmp/file "
fref
ref
erv
rtgrvf
t
ttt
ttt
ttt
f
f
dd
dd
efcref
vgt
vrt
brye
nhrtuym

また、以下を試しました。

# ssh root@$remote_machine "    awk '/^#/ || "'!'"a[$0]++' /tmp/file "
fref

ベストアンサー1

履歴の拡張とエスケープを!避けるには、単一引用符で囲む必要があります。bash\$

ssh root@$remote_machine "    awk '/^#/ || "'!'"a[\$0]++' /tmp/file > /tmp/file.new"

man bash!以下を使用して脱出を試みる理由を説明しました\

文字を二重引用符で囲むと、履歴拡張が有効になっている場合は、$、`、\、!を除く引用符内のすべての文字のリテラル値が保持されます。 $と `文字は二重引用符の中で特別な意味を持ちます。バックスラッシュは、後ろに$、 `、 "、\、または文字のいずれかが続く場合にのみ特別な意味を保持します。二重引用符は、二重引用符内にバックスラッシュを入れて引用符で囲むことができます。有効にすると、バックスラッシュを使用しない限り、拡張が実行されます。二重引用符内に!が表示されます。 !前のバックスラッシュは削除されません。

エスケープ後も文字\は削除されません!。これは、awk発生する構文エラーを説明します。

おすすめ記事