Ubuntu16.04
bash -version
GNU bash, version 4.4.0(1)-release (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,
},
}
答え1
正しい方法は次のようにすることです。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
答え2
これを行うことはできますが、grep
かなり複雑で、実際にRomanの答えが良いです。
tire_id
あなたのサンプルコンテンツは1つのファイルからしか出てこないので、1つのインスタンスしかありません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
単なるプレースホルダーです。
echo
各ファイルを個別にgrepし、各ファイルに対してコマンド置換を使用する必要があるため、明らかに多くの修正が必要です。あなたが主張するか、grep
将来のファイルではない場合にのみ含めますjson
。
答え3
sedスクリプトを使用してください。
grep -e tire_id -e appID /path/to/*/vehicle/production.json | sed -n '/\(.*:\)/h;n;s/.*n://;H;g;s/\n//;p'
やり直す
/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",
「tire_id」の各行の後に「appID」行が続くと機能します。それ以外の場合は、より複雑なsedスクリプトが必要です
答え4
このコマンドは、ファイルに「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'