2つのパターンを見つけて並べて表示できますか?

2つのパターンを見つけて並べて表示できますか?

Ubuntu16.04

bash -version  
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)

私はgrep2つのパターンを望んで並んで配置します。現在私が持っているものは次のとおりです。

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

関連情報