У меня есть сценарий оболочки, который извлекает детали из файла журнала между двумя датами и выполняет команду на выходе для создания некоторого отчета. Файлы журнала находятся на другом сервере, а сценарии выполняются на другом сервере. Скрипт выглядит так:
#!/bin/sh
time1=$1
time2=$2
echo `ssh -i key user@ip -yes cat file | awk '{if(substr($4,2)>="'$time1'" && substr($4,2)<="'$time2'") print $0;}'` > tmp.log
`cat tmp.log | some operation to get detail`
Ожидаемый результат будет таким:
ip1 date1 - - request1 file1 method1 status1
ip2 date2 - - request2 file2 method2 status2
то есть несколько строк, но сгенерированный вывод представляет собой одну строку, содержащую все детали, такие как:
ip1 date1 - - request1 file1 method1 status1 ip2 date2 - - request2 file2 method2 status2
При запуске той же команды непосредственно на сервере она генерирует желаемый результат, но не при удаленном выполнении.
Итак, мой вопрос: как мне получить правильный результат, и хороший ли это способ сделать это?
Как объяснялось в разных местах (например, в этом http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-05/msg00584.html) echo выводит свои аргументы, разделенные пробелами
Следовательно, вы должны либо передать результат команды в обратных кавычках как один аргумент.
echo "`some command that outputs multiple lines here`"
Или не использовать echo
но например printf