我需要在远程计算机上运行以下 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
您获得的语法错误。