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 중인 파일의 한 줄은 다음과 같습니다.

{"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

마찬가지로 loginunder도 다음 과 같이 actor가질 수 있습니다.

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

에 대한 조건부 출력을 만들고 가 아닌 type경우 아무것도 생성하지 않으 려면 다음을 수행하십시오 .typeFollowEvent

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

관련 정보