Извлекайте поля из журналов с помощью awk и объединяйте их для новой команды - PullRequest
0 голосов
/ 05 октября 2018

У меня есть такой журнал:

2018-10-05 09:12:38 286 <190>1 2018-10-05T09:12:38.474640+00:00 app web - - Class uuid=uuid-number-one cp=xxx action='xxxx'
2018-10-05 10:11:23 286 <190>1 2018-10-05T10:11:23.474640+00:00 app web - - Class uuid=uuid-number-two cp=xxx action='xxxx'

Мне нужно извлечь uuid и выполнить второй запрос с:

./getlogs --search 'uuid-number-one OR uuid-number-two'

Длямомент для первого запроса я делаю это, чтобы извлечь uuid:

./getlogs | grep 'uuid' | awk 'BEGIN {FS="="} { print $2 }' | cut -d' ' -f1

Мои три вопроса:

  • Я думаю, я мог бы избавиться от grep и cut и использовать только awk?
  • Как я могу получить только значение uuid.Я попытался awk '/uuid=\S*/{ print $1 }' или awk 'BEGIN {FS="uuid=\\S*"} { print $1 }', но это не удалось.
  • Как я могу объединить результат и превратить его в одну переменную оболочки, которую я могу использовать для новой команды?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы можете определить два разделителя полей:

$ awk -F['= '] '/uuid/{print $12}' file

Результат:

uuid-number-one
uuid-number-two

Вопрос 2:

Часть шаблона в awk просто выбирает строки для обработки.Он не меняет внутренние переменные, такие как $1 или NF.Затем необходимо выполнить замену:

$ awk '/uuid=/{print gensub(/.*uuid=(\S*).*/, "\\1", "")}' file

Вопрос 3:

var=$(awk -F['= '] '/uuid/{r=r","$12}END{print substr(r,2)}' file)

Реализуйте фактическое агрегирование для каждой строки (здесь r=r","$12).

0 голосов
/ 05 октября 2018

Не могли бы вы попробовать следующее (проверено на показанных образцах и в среде BASH).

awk 'match($0,/uuid=[^ ]*/){print substr($0,RSTART+5,RLENGTH-5)}'  Input_file

Решение 2-е: В случае, если ваш uid являетсябез пробела используйте следующее.

awk '{sub(/.*uuid=/,"");sub(/ .*/,"")} 1'  Input_file

решение 3-е: с использованием sed может помочь вам (учитывая, что у uid нет свободного местав его значениях).

sed 's/\(.*uuid=\)\([^ ]*\)\(.*\)/\2/'  Input_file

Решение четвертое: с использованием метода разделения полей awk для показанных образцов.

awk -F'uuid=| cp' '{print $2}'  Input_file

Кобъединить все значения в переменную оболочки, используя следующую команду:

shell_var=$(awk 'match($0,/uuid=[^ ]*/){val=val?val OFS substr($0,RSTART+5,RLENGTH-5):substr($0,RSTART+5,RLENGTH-5)} END{print val}'  Input_file)
...