За последние 24 часа нас посетили 16848 программистов и 1641 робот. Сейчас ищут 929 программистов ...

Вывод $переменной

Тема в разделе "Прочие вопросы по PHP", создана пользователем DenD88, 10 окт 2014.

  1. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Есть переменная с шелл скриптом, выводит все нужные мне строки

    Код (Text):
    1. $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");
    2. 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):
    1.  
    2. $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");
    3. $result1 = shell_exec ("echo $result");
    4. echo iconv("cp1251", "UTF-8", "<pre>$result1</pre>");

    1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL

    И в логе апача появляются ошибки такого вида:

    Код (Text):
    1. sh: 169: 1: not found
    2. sh: 170: 1: not found
    3. sh: 171: 1: not found
    4. sh: 172: 1: not found
    5. sh: 173: 1: not found
    6. sh: 174: 1: not found
    Подскажите плиз как нормальный вывод получить
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    всё верно. вы выполнили один запрос. получили текстовый ответ который в первом примере. теперь сами себе вопрос задайте может ли этот текст быть шел-скриптом? нет. а вы его передаете в еще один экзек. что делает баш на том уровне? он получает 5 строк которые должен выполнить интерпретатор. к первой строке добавляется эхо. это успешно попадает в результат выполнения второго экзека. а остальные 4 строки без эхо пытаются выполниться как команда. и на этом шел ругается что программа 1 не обнаружена. все логично.

    расскажите что вы пытаетесь сделать? ваш код теряет логику на этом втором экзеке. вы выполнили внешнюю программу (ряд утилит), получили текст, зачем-то еще раз выполняете внешнюю программу которая тупо напечатает текст и этот текст вы уже пытаетесь конвертировать. почему первый результат не сконвертировать?

    ну и собственно если так уж нужно выполнить это лишнее эхо для несколькострочного текста то все просто:
    Код (Text):
    1. $result1 = shell_exec('echo '.escapeshellarg($result));
     
  3. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    • 1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL
    Во втором екзеке я пытаюсь взять вывод первого и конвертировать время epoch_time в человеческий формат и вывести все на екран, т.к. в первом екзеке у меня это не получается подумал что отформатированным выводом из первого будет легче работать. Правда ниче не выходит.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а почему не сделать preg_replace_callback для первого вывода с заменой всех юникс таймстампов на дату в нужном формате?
     
  5. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    А можно пример, если не трудно?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    можно. но вы хотя бы попробуйте.
     
  7. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Совсем догнать не могу. С помощью preg_replace_callback мы берем значения 0-9 (10) цифр, конвертим их в нормальный формат и выводим как первый слотбец. Вроди так, но реализовать не выходит. Помогите, пожалуйста.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    там 2 действия всего: объявить колбэк и выполнить реплейс с этим колбэком. я код уже давно написал. покажите свои наработки чтоб мне тут халявой не разбрасываться)))))
     
  9. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Код (Text):
    1. $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");
    2. $epoch = тут мы обьявляем человеческое время
    3. $preg = preg_replace_callback ("\/d{10}/", ($epoch) ;
    4. echo iconv("cp1251", "UTF-8", "<pre>$result1</pre>");
    Знаю что херь...
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    мдя... еще разок попробуйте? там нет ничего сложного. просто надо не тяп-ляп, а чуть более вдумчиво прочитать мануал.
     
  11. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Нихрена не выходит...сжальтесь :)
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да вы нихрена и не пробовали. халявщик...
    Код (PHP):
    1. $source = '1 1411073895 SCP-3 MODIFICATION TIME EDR FILES CRITICAL a
    2. 1 1411073895 SCP-3 AR ERROR in EDR CRITICAL b
    3. 1 1411073405 SCP-3 MT ERROR in EDR CRITICAL c
    4. 1 1411072955 SCP-3 AR ERROR in EDR CRITICAL d
    5. 1 1411072255 SCP-3 AR ERROR in EDR CRITICAL e';
    6.  
    7. function epoch2human($m) {
    8.     return $m['prepend'] . date('Y-m-d H:i:s', (int)$m['time']) . $m['append'];
    9. }
    10.  
    11. $result = preg_replace_callback('#^(?<prepend>.+\s)(?P<time>\d+)(?P<append>\s.+)$#mU', 'epoch2human', $source);
    12.  
    13. var_dump($result);
    14.  
    15. /*
    16. string(290) "1 2014-09-19 00:58:15 SCP-3 MODIFICATION TIME EDR FILES CRITICAL a
    17. 1 2014-09-19 00:58:15 SCP-3 AR ERROR in EDR CRITICAL b
    18. 1 2014-09-19 00:50:05 SCP-3 MT ERROR in EDR CRITICAL c
    19. 1 2014-09-19 00:42:35 SCP-3 AR ERROR in EDR CRITICAL d
    20. 1 2014-09-19 00:30:55 SCP-3 AR ERROR in EDR CRITICAL e"
    21. */
    1. лишние символы в конце строк это для личной идентификации разных строк
    2. математика регулярки: от начала строки один и более символов и обязательный пробел - запомнить под псевдонимом препенд. далее одна и более цифр - псевдоним тайм. обязательный пробел и далее один и более символов до конца - псевдоним аппенд. выполняем с флагами m и U для обработки многострочного текста и не жадных квантификаторов соответственно.

    остальное, надеюсь, и так понятно...
     
  13. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    $source = $result


    А почему когда я скармливаю вашему коду переменную $result в которой больше 5-ти строк, то получаю неактуальное время? И такой вывод.
    Код (Text):
    1. 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
    Обьясните если не трудно...пожалуйста
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    всё просто. те сообщения, которые вы публиковали, по формату не соответствуют тем данным, которые у вас есть на самом деле. я писал регулярку под одно, а на самом деле у вас другое. вот и всё.
     
  15. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Я понимаю что регулярка под первый пример написана, но дальше сообщения в абсолютно таком-же формате
    Даже ваш пример скопипастил и вывод почему то такой
    Код (Text):
    1. 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"
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я беру код из своего сообщения. вставляю в новый php-файл. выполняю. сравниваю результат с тем ответом, который закомментирован в моем коде. вижу что фактический результат соответствует ожидаемому. что я делаю не так?
     
  17. DenD88

    DenD88 Новичок

    С нами с:
    10 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Тю странно. В любом случае очень благодарен вам.