>我正在尝试使用 awk 从远程机器上的日志中提取一些数据,并注意到如果我 ssh 进入机器并运行
awk '{print $0}' /path/to/log.txt
我得到了预期的输出(包含日志消息、堆栈跟踪等),但如果我运行
ssh host "awk '{print $0}' /path/to/log.txt"
则输出如下所示:
0
1
0
0
1
1
1
1
1
1
知道为什么会发生这种情况吗?
转义美元符号。
ssh host "awk '{print $0}' /path/to/log.txt"
由于单引号不能保护本地端的$0
,因此它被替换为发送到远程端。
您也可以尝试:
ssh host 'awk "{print $0}" /path/to/log.txt'
这可以保护远程端的$0
,但需要对命令进行更多更改。
一种无需反斜杠的方法:
ssh domain.tld <<'EOF'
awk '{print $1}' /var/log/syslog*
EOF
这使用这里-文档:
man bash | less +/'Here Documents'
试试这个:
ssh host "awk '{print}' /path/to/log.txt"
它之所以有效,是因为 $0 是打印的默认值。
如果命令中有 $,则在脚本文件中创建命令会更简单。然后你可以做:
ssh host < cmdfile #cmdfile contains the command
单引号不会阻止变量扩展。脚本可以。