如何转义 ssh 命令和 awk 中的引号

how to escape qutoes in ssh command and gawk

我正在尝试使用带有 gawk 命令的 ssh 读取远程文件,但由于引号问题而失败。

ssh <HOST> 'gawk -v RS='"' 'NR % 2 == 0 { gsub(/\n/, "") } { printf("%s%s", [=10=], RT) }' "<File name>" | wc -l'

如果有人帮助解决这个问题,我将不胜感激。

'gawk -v RS='"' '... 不是包含 RS='"' 的字符串。相当于

gawk -v RS="'  '...

shell 不知道你想要第一个和最后一个 ' 之间的整个字符串应该按字面意思处理;它从第一个 ' 读取到 下一个 ',然后继续解析。

此外,无法在 '...' 中引用单引号,因为反斜杠本身是字面意思。 '\''不是单个';是 '\

如果您使用 bash 或具有类似扩展名的 shell,您可以使用 ANSI 样式的引号。您必须确保转义所有文字 ''\

# Should be correct, not not tested
ssh <HOST> $'gawk -v RS=\'"\' \'NR % 2 == 0 { gsub(/\n/, "") } { printf("%s%s", [=11=], RT) }\' "<File name>" | wc -l'

或者您可以使用 "..." 作为外引号,并确保所有文字 $" 都被转义(以及任何 \被视为转义字符)。

# Should be correct, not not tested
ssh <HOST> "gawk -v RS='\"' 'NR % 2 == 0 { gsub(/\n/, \"\") } { printf(\"%s%s\", $0, RT) }" "<File name>" | wc -l'

我的偏好是通过将您的代码放在脚本中来避免此问题

#!/bin/sh
gawk -v RS='"' 'NR % 2 == 0 { gsub(/\n/, "") } { printf("%s%s", [=13=], RT) }' "<File name>" | wc -l

复制到远程主机

scp <HOST>:\~/myscript

并执行它

ssh <HOST> 'sh myscript'