在ssh中使用通配符和引号

时间:2013-11-30 20:28:04

标签: regex bash quotation-marks

我有一个文件,我想用"Nov 30""Nov 30"等字符串来显示行(基本上我不想指定中间的空格数。

在终端这可以,我只是这样做:

grep 'Nov * 30' file

然而,为了我的目的保持一般是很好的,所以实际上我想做的事情如下:

grep "$(date +%b) * $(date +%d)" file

这很好但我真的想通过ssh这样做,所以它就像

ssh -t host "grep "$(date +%b) * $(date +%d)" file"

此时我遇到了问题。它不是仅仅为11月30日类型的日期字符串打算,而是返回各种不同的11月日期。我觉得这个问题与双引号的使用有关(或许-t参数的第一组双引号会影响第二批,但我看不到如何绕过它),我从{ {3}}回答“bash会在本地机器上评估和替换双引号内的变量,但会在单引号内的目标机器上执行”。所以我尝试用

替换上面的内容
ssh -t host "grep '$(date +%b) * $(date +%d)' file"

但是现在grep根本没有返回任何结果!我认为这是因为我正在为文字“$(日期+%b)...”而不是替换的“11月”,但后来我不明白为什么第一次使用双引号的尝试没有工作

欢迎任何帮助

3 个答案:

答案 0 :(得分:1)

逃避你的报价:

ssh -t host "grep \"$(date +%b) * $(date +%d)\" file"

答案 1 :(得分:0)

或者,单引用您希望在远程计算机上执行的命令行。 (在这种情况下,date命令将在远程端执行。)

ssh -t host 'grep "$(date +%b) * $(date +%d)" file'

答案 2 :(得分:0)

在此版本中,date命令将在本地执行:

ssh -t host "grep '$(date +%b) * $(date +%d)' file"

在此版本中,date命令将在远程主机上执行:

ssh -t host 'grep "$(date +%b) * $(date +%d)" file'

当您的本地PC和服务器位于不同的时区时,这会有所不同。例如,现在是12月1日在法国,但是11月30日在我在美国的服务器上。

在第一个版本中,双引号内的$()在发送到服务器之前进行评估。因此,发送到服务器的命令在我的时区中为grep 'Dec * 1' file

在第二版中,单引号内的$()在发送到服务器之前不会被评估。因此,发送到服务器的命令为grep "$(date +%b) * $(date +%d)" file,因此服务器将在双引号内评估$()