Как получить определенные данные с помощью GREP?

#grep

#grep

Вопрос:

Команда:

 grep -oP '(?<="name":")[^"]*|(?<="title":")[^"]*' *.json >newjson
  

o / p получает как,

 10XANY10G_1.json:chMax
10XANY10G_1.json:Max Frequency in GHz
10XANY10G_1.json:up
10XANY10G_1.json:UP
10XANY10G_1.json:down
10XANY10G_1.json:DOWN
10XANY10G_1.json:CapabilityList
10XANY10G_1.json:Capabilities
10XANY10G_1.json:encoding
10XANY10G_1.json:Encoding
  

ожидаемый o / p:

 chMax:"Max Frequency in GHz",

up:"UP",

down:"DOWN",
  

содержимое файла:

 {"card":{"cardName":"10AN10G","portSignalRates":["10AN10G-1-OTU2","10AN10G-1-OTU2E","10AN10G-1-TENGIGE","10AN10G-1-STM64"],"listOfPort":{"10AN10G-1-OTU2":{"portAid":"10AN10G-1-OTU2","signalType":"OTU2","tabNames":["PortDetails"],"requestType":{"PortDetails":"PTP"},"paramDetailsMap":{"PortDetails":[{"type":"dijit.form.TextBox","name":"signalType","title":"Signal Rate","id":"","options":[],"label":"","value":"OTU2","checked":"","enabled":"false","selected":""},{"type":"dijit.form.TextBox","name":"userLabel","title":"Description","id":"","options":[],"label":"","value":"","checked":"","enabled":"true","selected":""},{"type":"dijit.form.Select","name":"Frequency","title":"Transmit Frequency",}}}}}}
  

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

1. Я не вижу данных, которые вы хотели бы получить в файле. Нет Max Frequency , нет up и т. Д

2. Кроме того, практически нет смысла анализировать JSON с помощью grep.

3. ожидаемый ввод-вывод из приведенного выше файла: signalType: «Скорость сигнала», userLabel: «Описание», Frequecy: «Частота передачи»,

Ответ №1:

Я думаю, вы ищете это,

 $ grep -oP '(?<="name":")[^"]*|(?<="title":)[^,]*' file
signalType
"Signal Rate"
userLabel
"Description"
Frequency
"Transmit Frequency"
  

Чтобы получить желаемый результат

 $ grep -oP '(?<="name":")[^"]*|(?<="title":)[^,]*' file | paste -d: - -
signalType:"Signal Rate"
userLabel:"Description"
Frequency:"Transmit Frequency"
  

Ответ №2:

Я думаю, что ваша проблема в том, что вы объединяете две группы с помощью | попробуйте удалить | , и вы приблизитесь к тому, что ищете, но вам, возможно, придется добавить термин, чтобы пропустить любые промежуточные теги для случаев, когда name и title не сразу следуют друг за другом, тогда вам, возможно, придется поумнеть, чтобы разобраться со случаем, в котором есть запись с именем, но нет заголовка.

Как уже говорилось, grep не лучший инструмент для синтаксического анализа json, есть множество других — лично я бы посоветовал использовать python и библиотеку json для загрузки вашего файла, а затем вывести нужные вам теги.

Ответ №3:

Вот gnu awk (из-за RS) версия для извлечения данных:

 awk -F" '/title/ {print $3":"$7}' RS='name' file
signalType:Signal Rate
userLabel:Description
Frequency:Transmit Frequency