grep ステートメント内の if/else

grep ステートメント内の if/else

のすべてのインスタンスを検索し"type":"FollowEvent"、それらのインスタンス内で、文字列"actor":の後に が続かない場合は{"の直後に続くで囲まれた文字列をキャプチャします。それ以外の場合は、の直後に続く"actor":で囲まれた文字列をキャプチャします。""login:"

これまでに私が持っているもの:

zgrep -e '"type":"FollowEvent"' /path/to/dir/* | zgrep -o '"actor":(?!{)*' | cut -f2- -d: | cut -d',' -f1 > results_file.txt

編集: これは何zgrepをするのでしょうか:

/path/to/dir 内のすべてのファイルにおいて、 を含むすべての行で"type":"FollowEvent""actor:"の後に続かないを検索します{。次に、 の後:と次の の前にあるすべてのものを取得します,。結果を に格納しますresults_file.txt

表示データの編集:

grep されるファイル内の 1 行は次のようになります。

{"repo":{"url":"https://url","name":"/"},"type":"FollowEvent","public":true,"created_at":"2011-05-29","payload":{"target":{"gravatar_id":"73","id":64,"repos":35,"followers":58,"login":"username3"}},"actor":{"gravatar_id":"06","id":439,"url":"https://url","avatar_url":"https://.png","login":"username4"},"id":"14"}

または次のようになります:

{"repo":{"url":"https://url/","name":"/"},"type":"FollowEvent","public":true,"created_at":"2011-04-01","payload":{"target":{"gravatar_id":"40","repos":2,"followers":1,"login":"username2"},"actor":"username1","actor_gravatar":"de4"},"actor":{"gravatar_id":"de4","id":716,"url":"https://url","avatar_url":"https://.png","login":"username2"},"id":"12"}

答え1

login以下にリストされているユーザー名は、target次の方法で両方の JSON ドキュメントから取得できますjq

$ jq -r '.payload.target.login' file1.json
username3

同様に、login以下もactor得られます:

$ jq -r '.actor.login' file1.json
username4

出力を に条件付きで設定したい場合(でないtype場合は何も生成しない場合):typeFollowEvent

jq -r 'select(.type == "FollowEvent") | .actor.login' file1.json

関連情報