3

我正在尝试使用 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

任何想法为什么会发生这种情况?

4

3 回答 3

6

转义美元符号。

ssh host "awk '{print \$0}' /path/to/log.txt"

因为单引号不保护$0本地端,所以它在发送到远程端之前被替换。

你也可以试试:

ssh host 'awk "{print \$0}" /path/to/log.txt'

这可以保护$0远程端,但需要对您的命令进行更多更改。

于 2012-06-04T18:08:14.787 回答
5

一种不使用反斜杠的方法:

ssh domain.tld <<'EOF'
awk '{print $1}' /var/log/syslog*
EOF

这使用here-docs

man bash | less +/'Here Documents'
于 2012-06-04T18:20:42.523 回答
2

试试这个:

ssh host "awk '{print}' /path/to/log.txt"

它之所以有效,是因为 $0 是打印的默认值。

如果您的命令中有 $,则在脚本文件中创建命令会更简单。然后你可以这样做:

ssh host < cmdfile #cmdfile contains the command

单引号不会阻止变量扩展。一个脚本可以。

于 2012-06-04T18:11:45.097 回答