我正在尝试使用awk从远程机器上的日志中提取一些数据,并注意到如果我进入机器运行并运行
awk '{print $0}' /path/to/log.txt
Run Code Online (Sandbox Code Playgroud)
我得到了预期的输出(包含日志消息,堆栈跟踪等),但是如果我运行的话
ssh host "awk '{print $0}' /path/to/log.txt"
Run Code Online (Sandbox Code Playgroud)
然后输出如下所示:
0
1
0
0
1
1
1
1
1
1
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?
逃离美元符号.
ssh host "awk '{print \$0}' /path/to/log.txt"
Run Code Online (Sandbox Code Playgroud)
因为单引号不保护$0本地,所以它被替换,因为它被发送到远程端.
你也可以尝试:
ssh host 'awk "{print \$0}" /path/to/log.txt'
Run Code Online (Sandbox Code Playgroud)
这可以保护$0远程端,但需要对命令进行更多更改.
一种方法是在没有反斜杠的情况下执行此操作:
ssh domain.tld <<'EOF'
awk '{print $1}' /var/log/syslog*
EOF
Run Code Online (Sandbox Code Playgroud)
这使用here-docs:
man bash | less +/'Here Documents'
Run Code Online (Sandbox Code Playgroud)