我的文件中有以下值。
user1 India GJ 1000 IT contractor
user2 Ind GJ 1001 HR contractor
user3 USA CA 1002 R&D hourly
user4 India TN 1003 R&D fte
user5 Ind KA 1004 FE fte
user6 In GJ 2345 HR hourly
需要匹配第 3 列并更新第 2 列。我可以使用以下命令来完成。
awk -i inplace '/GJ|TN|KA/ {$2="IN"} {print}' filename
上述命令的输出是
user1 IN GJ 1000 IT contractor
user2 IN GJ 1001 HR contractor
user3 USA CA 1002 R&D hourly
user4 IN TN 1003 R&D fte
user1 IN GJ 1000 IT contractor
user5 IN KA 1004 FE fte
user6 IN GJ 2345 HR hourly
但当我通过 ssh 运行时,同样的方法不起作用
ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2="IN"} {print}" filename
SSH 上的输出
user1 GJ 1000 IT contractor
user2 GJ 1001 HR contractor
user3 USA CA 1002 R&D hourly
user4 TN 1003 R&D fte
user1 GJ 1000 IT contractor
user5 KA 1004 FE fte
user6 GJ 2345 HR hourly
不确定我遗漏了什么,以及为什么它不能在我们的 SSH 上运行。我愿意接受任何其他解决方案。
谢谢。
答案1
发生了什么
您的命令
ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2="IN"} {print}'" filename
(请注意,我添加了缺失的'
;如果没有它awk
根本无法运行)
不会执行您想要的操作,因为本地 shell 会删除所有双引号。请看:
ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2="IN"} {print}'" filename
quoted: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^
unquoted: ^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^
实际上ssh
获取awk -i inplace '/GJ|TN|KA/ {$2=IN} {print}'
和filename
(作为单独的参数)。它构建以下命令在远程端运行:
awk -i inplace '/GJ|TN|KA/ {$2=IN} {print}' filename
这意味着awk
执行
/GJ|TN|KA/ {$2=IN} {print}
其中IN
不被视为字符串,它是 中的变量awk
。该变量为空。
解决方案
为了使“内部”双引号保留下来并到达远程 shell(并awk
最终到达),请像对以下内容进行转义$
:
ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2=\"IN\"} {print}'" filename
更多信息:
如何通过 ssh 执行复杂的命令行?你的命令不太复杂,我的答案链接问题可能会有所帮助,因为它解释了如何
ssh
运行命令以及如何处理一些可能的问题。你有一条想要提供给
ssh
无需任何局部扩张。以下问题正是旨在帮助解决这一问题:如何方便地在 Bash 中单引号或转义整个命令行?