Grep строка из данных json

echo "01/01/2001 05/16/1970 06/08/2010" > datefile
sed 's:[0-1][0-9]/[0-3][0-9]/::g' datefile

Результат:2001 1970 2010

Это будет работать, когда все даты находятся в одной строке, и когда каждая дата находится в отдельной строке. Разделителем является :для облегчения разборчивости. Глобальная опция gделает все допустимые замены.

0
26.07.2019, 10:58
5 ответов

Инструмент jq, который я использую в этом ответе, может быть загружен изhttps://stedolan.github.io/jq/(даже для Solaris )и установлен в домашнем каталоге не -пользователя root без какого-либо доступа root. Кроме того, он вообще не имеет никаких зависимостей во время выполнения.


В документе JSON нет «второго столбца». Ваш документ также может быть написан

[
  {
    "FRUIT": "APPLE",
    "CAR": "FORESTER",
    "COMPANY": "SUBARU",
    "MAKE": "2015",
    "CITY": "UNION CITY",
    "STATE": 0,
    "COUNTRY": 0,
    "LOCATION": 0,
    "RANK": "1"
  },
  {
    "FRUIT": "MANGO",
    "CAR": "OUTBACK",
    "COMPANY": "SUBARU",
    "MAKE": "2017",
    "CITY": "EDISON",
    "STATE": 0,
    "COUNTRY": 0,
    "LOCATION": 0,
    "RANK": "2"
  }
]

Добавленный пробел не влияет на фактические данные JSON.

Чтобы извлечь значения всех записей, соответствующих ключу CAR, используйте jqсинтаксический анализатор JSON командной строки:

$ jq '.[].CAR' file.json
"FORESTER"
"OUTBACK"

Выражение .[].CARозначает «Для каждого элемента верхнего -самого массива вернуть значение ключа CAR».

Если вы хотите, чтобы в выводе не было кавычек, добавьте-r(или--raw-output)к вызову jq. Это вернет декодированные данные.

-2
28.01.2020, 02:22

Вы можете использовать json_xs, он обычно устанавливается по умолчанию в любой системе, поддерживающей Perl:

json_xs -f json -t json-pretty < file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2

Или с Python:

python3 -m json.tool file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2
3
28.01.2020, 02:22

Не самый элегантный подход, но он работает с данными вашего примера:

$ tr, '\n' < file | awk -F: '{if(/\{/){NR=1}}NR==2{print $2}'
"FORESTER"
"OUTBACK"

trзаменит все ,символами новой строки. awk сбросит переменную NRпо умолчанию на 0, когда увидит {. Поскольку NRсодержит текущий номер строки и автоматически увеличивается в каждой строке, это означает, что он будет 2только во второй строке каждого набора пар значений ключа -. Итак, когда NRравно 2, мы печатаем второе поле, разделенное :-.


В качестве альтернативы используйте подходящий язык сценариев, поддерживающий данные JSON. Например, вperl:

$ perl -M"JSON" -lne 'my $json = decode_json($_); 
                      foreach $f (@{$json}){print $f->{"CAR"};}' file
FORESTER
OUTBACK
1
28.01.2020, 02:22

Попробуйте следующую команду

$ sed "s/{/\n/g" file.txt | awk -F, 'NF>=2{split($2,Arr,":");print Arr[2]}'
"FORESTER"
"OUTBACK"

мы разбиваем одну строку на несколько строк с помощью команды sed, затем с помощью awk получаем значение второго столбца

2
28.01.2020, 02:22

Аналогично ответу Тердона:

sed s'/[,{}]/\n/g' < file.json | grep '^\"CAR\"\:' | cut -d ':' -f2

После заметки Кусалананды о том, что Solaris не поддерживает указанный выше sedстиль, его можно заменить следующим trвариантом:

tr ',{}' '\n' < file.json | grep '^\"CAR\"\:' | cut -d ':' -f2

Rudimentary разбивает json на каждое поле в отдельной строке, заменяя все символы,{и }новой строкой. Затем просматриваем результаты для строк, начинающихся с "CAR":, и печатаем значение после :.

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

0
28.01.2020, 02:22

Теги

Похожие вопросы