2013-11-30 1 views
0

У меня есть файл, который я хочу Grep из строк с строками, как "Nov 30" или "Nov 30" (в основном я не хочу, чтобы указать количество пробелов в середине.Использование подстановочных и кавычки в SSH

В терминал это будет хорошо, я бы просто сделать:

grep 'Nov * 30' file 

Однако, было бы неплохо, чтобы сохранить его вообще для моих целей, поэтому на самом деле я хотел бы сделать что-то вроде:

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

Это работает отлично, но я на самом деле хочу, чтобы сделать это через SSH, так что бы как

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

В этот момент я бегу в проблемы. Вместо grepping только для строк даты 30 ноября, он возвращает всевозможные разные ноябрьские даты. Я чувствую, что проблема связана с использованием двойных кавычек (возможно, первый набор двойных кавычек для аргумента -t влияет на второй лот, но я не вижу, как обойти это), и я вижу от this ответьте, что «bash будет оценивать и заменять переменные внутри двойных кавычек на локальном компьютере, но будет делать это на целевой машине внутри одинарных кавычек». Поэтому я попытался заменить вышеперечисленное

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

Но теперь grep не возвращает результатов вообще! Я предполагаю, что это потому, что я готовлю буквально «$ (date +% b) ...», а не «Nov ...», но тогда я не понимаю, почему первая попытка с двойными кавычками не Работа.

Добро пожаловать помощь

+0

http://mywiki.wooledge.org/BashFAQ/050 –

ответ

1

Побег ваши цитаты:

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

Попеременно одинарные кавычки в командной строке вы хотите выполнить на удаленной машине. (. В этом случае date команды будут выполняться на удаленном конце)

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

В этой версии команда date будет выполняться локально:

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

В этой версии команда date будет выполнена на удаленный хост:

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

Это может иметь значение, если ваш локальный ПК и сервер находятся в другом часовом поясе. Прямо сейчас, например, это 1 декабря во Франции, но 30 ноября на моем сервере в США.

В первой версии $() в двойных кавычках оценивается перед отправкой на сервер. Таким образом, команда, отправленная на сервер, составляет grep 'Dec * 1' file в моем часовом поясе.

Во второй версии $() в одинарных кавычках НЕ оценивается перед отправкой на сервер. Таким образом, команда, отправленная на сервер, равна grep "$(date +%b) * $(date +%d)" file, поэтому сервер будет оценивать $() в двойных кавычках.