远程机器上的 grep

远程机器上的 grep

我有一个包含内容的模板文件

数量:2

ssh ubuntu@ip << EOF
 cat template|grep count|awk -F":" '{print $2}' > log
EOF

期望的输出是2

但正在打印count : 2

答案1

这里的文档<< EOF创建了一个类似于"..."变量扩展的引用上下文。那里有一个$2in ,它是由本地 shell 扩展的。 (撇号不引用任何内容,因为它们位于较大的引用字符串(heredoc)内,因此它们不是特殊字符。您不能通过嵌套来“增加引用级别'...'"..."

您的本地 shell 可能没有参数$2,因此它扩展为空字符串,而远程 shell 在 stdin 上接收到的内容是:

cat template|grep count|awk -F":" '{print }' > log

awkprint是整行。

您可以通过向终止字符串添加撇号样式的引用来要求heredoc运算符不要扩展变量,如下所示:

ssh ... << 'EOF'
...
EOF

如果您对示例执行此操作,则该文件$2将在heredoc处理中幸存并通过ssh传递到远程shell。

附加提示:cat | grep | awk这是双重浪费,因为awk可以做到这一切。您的远程命令相当于

awk -F":" '/count/ {print $2}' template > log

相关内容