2015-11-09 3 views
0

Я пытаюсь разобрать строки из журнала ошибок в BASH, а затем отправить определенную часть в переменную BASH, которая будет использоваться позже в скрипте, и возникнуть проблемы после того, как я попытаюсь передать ее к переменной BASH.Проблемы с передачей AWK на BASH-переменную

Что файл журнала выглядит следующим образом:

1446851818|1446851808.1795|12|NONE|DID|80

Мне нужен номер в третьем сете (в этом случае число 12) линии

Вот пример команды I бегу:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}' 

строка кода пытается выполнить это:

  1. захватить последние строки файла журнала
  2. Поиск по фразе (в данном случае подключения, я использую ту же команду, чтобы вызвать различные элементы)
  3. Отдельный номер в третьем сете линии так, он может быть использован в других

Если я запускаю выше полную команду, она выполняется успешно, как так:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}' 
12 

Теперь, если я пробую и присвоить его переменной в одной и той же линии/команды, я Мне не удалось вернуть его назад BLE.

Моя команда при назначении переменной выглядит следующим образом:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}') 

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

#!/bin/bash 
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}') 
echo "$brand"; 

Я знаю, что это, скорее всего, не самое эффективное/красноречивое решение для этого, поэтому, если есть другие идеи/способы достижения этого, я открыт для них (мои навыки BASH являются базовыми, но улучшающими)

+3

Не 'Foo | x = $ (bar) ', вместо этого' x = $ (foo | bar) '. –

+0

Правая сторона трубы работает в подоболочке, поэтому внесенные в нее изменения теряются, когда эта сторона трубопровода выходит: 'x = hello; эхо прощай | читать x; echo $ x' будет выводить 'hello', а не' good-bye'. –

ответ

6

Вы должны захватывать вывод всего трубопровода , не только в заключительной части этого:

brand=$(tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '|' '{print $3}') 

Вы также можете рассмотреть, что произойдет, если есть более чем одна строка, содержащая CONNECT в последние пять строк файла (или, действительно, если их нет). Это приведет к тому, что brand будет иметь несколько значений (или нет).


Если ваша цель, чтобы получить третье поле из последней строки в файле, содержащем CONNECT, awk может в значительной степени обрабатывать всю вещь без необходимости tail или grep:

brand=$(awk -F '|' '/CONNECT/ {latest = $3} END {print latest}') 
+3

справа и также потерять grep: 'tail ... | awk -F '|' '/ CONNECT/{print $ 3}' ' –

+0

@Ed, я подумал об этом, но беспорядок только смотреть на последние пять строк остановил меня. Тем не менее, я добавил предложение в соответствии с вашим комментарием, что указывает на небольшую разницу с тем, что спросил ОП, для чего, конечно, не всегда то, что они хотят :-) – paxdiablo

+0

Re: количество строк в поиске, моя живая копия имеет ли он значение -n1, поскольку он использует inotifywait и проверяет файл в момент его изменения, я запускал это вручную, а последняя запись журнала с применимой фразой составляла около 4 строк, поэтому я просто быстро ее модифицировал для тестирования/запуска рука. – TD46

Смежные вопросы