如何在远程计算机上运行复杂的 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您获得的语法错误。

相关内容