Печать Awk несколько раз выполняется только один раз, как и ожидалось

#shell #awk

#оболочка #awk

Вопрос:

У меня есть сценарий оболочки

 logstash_out=`echo "green" | /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {codec => json} }' --log.level=error`
echo "_______________________________"
echo $logstash_out
echo "_______________________________"
msg=`echo "$logstash_out" |  awk -F 'input:' '{print $1}'`
echo $msg
echo "_______________________________"
msg1=`echo "$logstash_out" |  awk -F '{' -v q='{' '{print q$2}'`
echo $msg1
echo "_______________________________"
  

Результат приведенного выше сценария :

 _______________________________
Sending Logstash logs to /opt/logstash/logs which is now configured via log4j2.properties The stdin plugin is now waiting for input: {"host":"medium","@timestamp":"2020-11-19T10:32:03.860Z","message":"green","@version":"1"}
_______________________________
Sending Logstash logs to /opt/logstash/logs which is now configured via log4j2.properties The stdin plugin is now waiting for {"host":"medium","@timestamp":"2020-11-19T10:32:03.860Z","message":"green","@version":"1"}
_______________________________
{ { {"host":"medium","@timestamp":"2020-11-19T10:32:03.860Z","message":"green","@version":"1"}
_______________________________
  

Проблемы :

  1. Я хочу разделить часть json, когда я попробую первый сценарий awk, т.е.

    сообщение = echo "$logstash_out" | awk -F 'input:' '{print $1}'

Он удаляет слово «input:» из переменной $ logstash_out вместо его разделения.То же самое можно увидеть на выходе.

  1. Если я попробую второй сценарий awk, то есть

    msg1 = echo "$logstash_out" | awk -F '{' -v q='{' '{print q$2}'

Он печатает переменную «q» три раза. Кто-нибудь может помочь мне объяснить, что я делаю неправильно.

Ожидаемый результат:

 {"host":"medium","@timestamp":"2020-11-19T10:32:03.860Z","message":"green","@version":"1"}
  

Комментарии:

1. Спасибо, что поделились своими усилиями в виде кода, продолжайте в том же духе. Не могли бы вы сообщить нам пример ожидаемого результата на ваш вопрос? Кроме jq того, есть ли у вас в вашей системе инструмент, который эксперты рекомендуют как идеальный инструмент для обработки JSON-файлов (или вы можете установить его в свой ящик)?

2. @RavinderSingh13 Мне просто нужен вывод в виде {«host»:»medium», «@timestamp»:»2020-11-19T10:32:03.860Z», «message»:»green», «@version»:»1″}

3. Пожалуйста, обновите свой вопрос с помощью примера ввода и ожидаемого результата, пожалуйста, комментарий не предназначен для показа образцов / кодов, спасибо.

4.Пожалуйста, отредактируйте свой вопрос, чтобы включить вывод echo "$logstash_out" с двойными кавычками. Нет надежного способа определить, что там находится, из информации, размещенной в вопросе. Например, пропущенные новые строки в отображаемом выводе изменят поведение awk команд.

Ответ №1:

Я предлагаю следующее awk решение:

 awk -F "[{}]" '{print "{" $2 "}"}'
  

Дайте нам знать, если это поможет

Комментарии:

1. спасибо, но это не помогло, так как выдает следующий вывод {} {} {«@version»:»1″, «message»:»green», «@timestamp»: «2020-11-19T13:47:11.758Z», «host»:»medium»}