2개의 패턴을 찾아 나란히 나열할 수 있나요?

2개의 패턴을 찾아 나란히 나열할 수 있나요?

우분투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|,||2appID원하는 출력에 표시된 값 끝에서 쉼표를 제거합니다.

산출:

/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'

관련 정보