우분투16.04
bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)
나는 grep
두 가지 패턴을 원해서 나란히 배치합니다. 현재 내가 가지고 있는 것은 다음과 같습니다.
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
귀하의 예제 콘텐츠는 하나의 파일에서만 나오므로 하나의 및 인스턴스 만 있습니다 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'