如何转义 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'
我正在尝试使用带有 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'