Могу ли я получить 2 паттерна и перечислить их рядом?

Ubuntu 16.04
Bash-версия
GNU bash, версия 4.4.0 (1) -релиз (x86_64-unknown-linux-gnu)

Я хотел бы grep для 2 моделей, а затем перечислить их рядом. Банкомат, вот что у меня есть:

root@tires ~ # grep -e tire_id -e appID /path/to/*/vehicle/production.json /path/to/000001_000002/vehicle/production.json: "tire_id": "1305436516186552", /path/to/000001_000002/vehicle/production.json: "appID": "1164562920689523", /path/to/000001_000079/vehicle/production.json: "tire_id": "1815123428733289", /path/to/000001_000079/vehicle/production.json: "appID": "18412365908966538", /path/to/000001_000088/vehicle/production.json: "tire_id": "138477888324", 

Это то, что я хотел бы иметь или что-то подобное на самом деле будет работать.

 root@tires ~ # grep -e tire_id -e appID /path/to/*/vehicle/production.json /path/to/000001_000002/vehicle/production.json: tire_id: 1305436516186552, appID: 1164562920689523 /path/to/000001_000079/vehicle/production.json: tire_id: 1815123428733289, appID: 18412365908966538 

Пример файла здесь:

 { "socal": "https://xxx.xxxxx.xxx", "ip": "xxx.xxx.xxx.xxx", "tire_id": "213275925375485", "client": { "platform": "xx", "clientID": "xxxxx", "serviceID": "xxxxx", "service_id": XXXX, "vendor": "default" }, "locale": "en_US", "cdc": { "appID": "233262274090443", "isdel": "ORdiZBMAQS2ZBCnTwZDZD", }, "attachments": { "output": "attachments", "public": false, }, } 

Правильный путь с jq инструмента jq для действительных документов JSON:

Пример file1.json :

 { "socal": "https://xxx.xxxxx.xxx", "ip": "xxx.xxx.xxx.xxx", "tire_id": "213275925375485", "client": { "platform": "xx", "clientID": "xxxxx", "serviceID": "xxxxx", "service_id": "XXXX", "vendor": "default" }, "locale": "en_US", "cdc": { "appID": "233262274090443", "isdel": "ORdiZBMAQS2ZBCnTwZDZD" }, "attachments": { "output": "attachments", "public": false } } 

Пример file2.json :

 { "socal": "https://xxx.xxxxx.xxx", "ip": "xxx.xxx.xxx.xxx", "tire_id": "1305436516186552", "client": { "platform": "xx", "clientID": "xxxxx", "serviceID": "xxxxx", "service_id": "XXXX", "vendor": "default" }, "locale": "en_US", "cdc": { "appID": "1164562920689523", "isdel": "ORdiZBMAQS2ZBCnTwZDZD" }, "attachments": { "output": "attachments", "public": false } } 

И само решение:

 jq -r 'input_filename + " tire_id: \(.tire_id) appID: \(.cdc.appID)"' file*.json 

Выход:

 file1.json tire_id: 213275925375485 appID: 233262274090443 file2.json tire_id: 1305436516186552 appID: 1164562920689523 

Вы можете сделать это с помощью grep но это довольно сложно, и ответ Романа на самом деле лучше.

Содержимое вашего примера только из одного файла, поэтому есть только один раз экземпляр tire_id и appID .

Использовать этот:

 echo $(echo /path/to/production.json && egrep "tire_id|appID" /path/to/production.json | sed -e 's|"||g' | sed -e 's|,||2') && echo $(echo /path/to/production2.json && egrep "tire_id|appID" /path/to/production2.json ) | sed -e 's|"||g' | sed -e 's|,||2' 

echo помещает все в одну строку с подстановкой команд.

egrep делает то же самое, что и grep -e но позволяет вам собрать все строки вместе, разделенные | вместо того, чтобы использовать -e string каждый раз.

sed -e 's|"||g' удаляет апострофы.

sed -e 's|,||2 удаляет запятую в конце значения для appID которое отображается в желаемом выводе.

Выход:

 /path/to/production.json tire_id: 213275925375485 appID: 233262274090443 /path/to/production2.json tire_id: 1815123428733289 appID: 18412365908966538 

/path/to/production.json и /path/to/production2.json являются просто заполнителями.

Это, очевидно, требует значительных изменений, так как вам придется создавать grep для каждого файла отдельно и использовать подстановку команды echo для каждого. Я включаю его только в том случае, если вы настаиваете на использовании grep или если в будущем это не файл json .

С помощью сценария sed:

 grep -e tire_id -e appID /path/to/*/vehicle/production.json | sed -n '/\(.*:\)/h;n;s/.*n://;H;g;s/\n//;p' 

Retrun

 /path/to/000001_000002/vehicle/production.json: "tire_id": "1305436516186552", "appID": "1164562920689523", /path/to/000001_000079/vehicle/production.json: "tire_id": "1815123428733289", "appID": "18412365908966538", /path/to/000001_000088/vehicle/production.json: "tire_id": "138477888324", 

это работает, если за каждой строкой “tyre_id” следует строка “appID”. В противном случае вам нужен более сложный сценарий sed

Эта команда будет работать, даже если в файле пропущена строка “tire_id” или “appID”. Это не будет отображено :

 grep -e tire_id -e appID /path/to/*/vehicle/production.json | sed -n 's/\(tire_id\)/\1/;T;h;n;s/.*n:.*\(appID\)/\1/;T;H;g;s/\n/ /;s/"//g;s/,//g;p'