Есть переменная с шелл скриптом, выводит все нужные мне строки Код (Text): $result = shell_exec("grep -i 'SERVICE ALERT' /home/den/shell/today/-".$date."-00.log | sed 's/ SERVICE ALERT:/;/g; s/^.//g;s/]//g' | awk -F ';' '/WARNING|CRITICAL/ {print $1, $2, $3, $4}' | sort | uniq -c | sort -nr | grep -i $host"); echo iconv("cp1251", "UTF-8", "<pre>$result</pre>"); 1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL 1 1411073895 SCP-3 AR ERROR in EDR CRITICAL 1 1411073405 SCP-3 MT ERROR in EDR CRITICAL 1 1411072955 SCP-3 AR ERROR in EDR CRITICAL 1 1411072255 SCP-3 AR ERROR in EDR CRITICAL Но если я перенаправляю эту переменную в другую и вывожу эхо, то на экране только первая строка Код (Text): $result = shell_exec("grep -i 'SERVICE ALERT' /home/den/shell/today/-".$date."-00.log | sed 's/ SERVICE ALERT:/;/g; s/^.//g;s/]//g' | awk -F ';' '/WARNING|CRITICAL/ {print $1, $2, $3, $4}' | sort | uniq -c | sort -nr | grep -i $host"); $result1 = shell_exec ("echo $result"); echo iconv("cp1251", "UTF-8", "<pre>$result1</pre>"); 1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL И в логе апача появляются ошибки такого вида: Код (Text): sh: 169: 1: not found sh: 170: 1: not found sh: 171: 1: not found sh: 172: 1: not found sh: 173: 1: not found sh: 174: 1: not found Подскажите плиз как нормальный вывод получить
всё верно. вы выполнили один запрос. получили текстовый ответ который в первом примере. теперь сами себе вопрос задайте может ли этот текст быть шел-скриптом? нет. а вы его передаете в еще один экзек. что делает баш на том уровне? он получает 5 строк которые должен выполнить интерпретатор. к первой строке добавляется эхо. это успешно попадает в результат выполнения второго экзека. а остальные 4 строки без эхо пытаются выполниться как команда. и на этом шел ругается что программа 1 не обнаружена. все логично. расскажите что вы пытаетесь сделать? ваш код теряет логику на этом втором экзеке. вы выполнили внешнюю программу (ряд утилит), получили текст, зачем-то еще раз выполняете внешнюю программу которая тупо напечатает текст и этот текст вы уже пытаетесь конвертировать. почему первый результат не сконвертировать? ну и собственно если так уж нужно выполнить это лишнее эхо для несколькострочного текста то все просто: Код (Text): $result1 = shell_exec('echo '.escapeshellarg($result));
1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL Во втором екзеке я пытаюсь взять вывод первого и конвертировать время epoch_time в человеческий формат и вывести все на екран, т.к. в первом екзеке у меня это не получается подумал что отформатированным выводом из первого будет легче работать. Правда ниче не выходит.
а почему не сделать preg_replace_callback для первого вывода с заменой всех юникс таймстампов на дату в нужном формате?
Совсем догнать не могу. С помощью preg_replace_callback мы берем значения 0-9 (10) цифр, конвертим их в нормальный формат и выводим как первый слотбец. Вроди так, но реализовать не выходит. Помогите, пожалуйста.
там 2 действия всего: объявить колбэк и выполнить реплейс с этим колбэком. я код уже давно написал. покажите свои наработки чтоб мне тут халявой не разбрасываться)))))
Код (Text): $result = shell_exec("grep -i 'SERVICE ALERT' /home/den/shell/today/-".$date."-00.log | sed 's/ SERVICE ALERT:/;/g; s/^.//g;s/]//g' | awk -F ';' '/WARNING|CRITICAL/ {print $1, $2, $3, $4}' | sort | uniq -c | sort -nr | grep -i $host"); $epoch = тут мы обьявляем человеческое время $preg = preg_replace_callback ("\/d{10}/", ($epoch) ; echo iconv("cp1251", "UTF-8", "<pre>$result1</pre>"); Знаю что херь...
мдя... еще разок попробуйте? там нет ничего сложного. просто надо не тяп-ляп, а чуть более вдумчиво прочитать мануал.
да вы нихрена и не пробовали. халявщик... Код (PHP): $source = '1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL a 1 1411073895 SCP-3 AR ERROR in EDR CRITICAL b 1 1411073405 SCP-3 MT ERROR in EDR CRITICAL c 1 1411072955 SCP-3 AR ERROR in EDR CRITICAL d 1 1411072255 SCP-3 AR ERROR in EDR CRITICAL e'; function epoch2human($m) { return $m['prepend'] . date('Y-m-d H:i:s', (int)$m['time']) . $m['append']; } $result = preg_replace_callback('#^(?<prepend>.+\s)(?P<time>\d+)(?P<append>\s.+)$#mU', 'epoch2human', $source); var_dump($result); /* string(290) "1 2014-09-19 00:58:15 SCP-3 MODIFICATION TIME EDR FILES CRITICAL a 1 2014-09-19 00:58:15 SCP-3 AR ERROR in EDR CRITICAL b 1 2014-09-19 00:50:05 SCP-3 MT ERROR in EDR CRITICAL c 1 2014-09-19 00:42:35 SCP-3 AR ERROR in EDR CRITICAL d 1 2014-09-19 00:30:55 SCP-3 AR ERROR in EDR CRITICAL e" */ 1. лишние символы в конце строк это для личной идентификации разных строк 2. математика регулярки: от начала строки один и более символов и обязательный пробел - запомнить под псевдонимом препенд. далее одна и более цифр - псевдоним тайм. обязательный пробел и далее один и более символов до конца - псевдоним аппенд. выполняем с флагами m и U для обработки многострочного текста и не жадных квантификаторов соответственно. остальное, надеюсь, и так понятно...
$source = $result А почему когда я скармливаю вашему коду переменную $result в которой больше 5-ти строк, то получаю неактуальное время? И такой вывод. Код (Text): string(11637) " 1970-01-01 02:00:01 1411073895 SCP-3 MODIFICATION TIME EDR FILES 1970-01-01 02:00:01 1411073895 SCP-3 AR ERROR in EDR 1970-01-01 02:00:01 1411073405 SCP-3 MT ERROR in EDR 1970-01-01 02:00:01 1411072955 SCP-3 AR ERROR in EDR 1970-01-01 02:00:01 1411072255 SCP-3 AR ERROR in EDR 1970-01-01 02:00:01 1411072245 SCP-3 MODIFICATION TIME EDR FILES 1970-01-01 02:00:01 1411071305 SCP-3 AR ERROR in EDR 1970-01-01 02:00:01 1411071285 SCP-3 MT ERROR in EDR 1970-01-01 02:00:01 1411071005 SCP-3 MODIFICATION Обьясните если не трудно...пожалуйста
всё просто. те сообщения, которые вы публиковали, по формату не соответствуют тем данным, которые у вас есть на самом деле. я писал регулярку под одно, а на самом деле у вас другое. вот и всё.
Я понимаю что регулярка под первый пример написана, но дальше сообщения в абсолютно таком-же формате Даже ваш пример скопипастил и вывод почему то такой Код (Text): string(338) "1 2014-09-18 23:58:15 SCP-3 MODIFICATION TIME EDR FILES CRITICAL a 1970-01-01 02:00:01 1411073895 SCP-3 AR ERROR in EDR CRITICAL b 1970-01-01 02:00:01 1411073405 SCP-3 MT ERROR in EDR CRITICAL c 1970-01-01 02:00:01 1411072955 SCP-3 AR ERROR in EDR CRITICAL d 1970-01-01 02:00:01 1411072255 SCP-3 AR ERROR in EDR CRITICAL e"
я беру код из своего сообщения. вставляю в новый php-файл. выполняю. сравниваю результат с тем ответом, который закомментирован в моем коде. вижу что фактический результат соответствует ожидаемому. что я делаю не так?