grep 및 sed 명령의 기능은 무엇입니까?

grep 및 sed 명령의 기능은 무엇입니까?

나는 이 명령의 일부가 어떤 역할을 하는지 이미 알고 있습니다.

zgrep -v "org" /path/to/files/* | zgrep "FollowEvent" | zgrep -o 'login":"[^"]*"' | cut -d'"' -f3 | sort | uniq -c | sed '1i{
       s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}' > usernames_followevents.txt

한 조각씩:

1) 파일을 검색하는 데 zgrep사용됩니다 .grep.json.gz

2) 는 의 zgrep -v "org" /path/to/files/*각 파일에서 ./path/to/files/*"org"

3) |파이프입니다. "그리고 나서"라는 뜻이에요

4)는 첫 번째 zgrep에서 찾은 결과 내에서 zgrep "FollowEvent"문자열을 찾는 것을 의미합니다 ."FollowEvent"

5) |파이프입니다. "그리고 나서"라는 뜻이에요

6)은 항목에서 'login'이라는 단어 뒤에 오는 zgrep -o 'login":"[^"]*"'문자열과 모든 텍스트에 대해 비어 있지 않은 일치 항목을 찾는 것을 의미합니다 .login":"

7)은 | cut -d'"' -f3"결과 일치 항목에서 세 번째 필드만 가져옵니다"를 의미합니다. 이 경우 사용자 이름입니다.

8) | sort | uniq -c은 "그런 다음 사용자 이름을 정렬한 다음 각 사용자 이름의 고유 인스턴스 수를 계산합니다"를 의미합니다.

지금까지 우리는 다음을 가지고 있습니다:

zgrep -v "org" /path/to/files/* | zgrep "FollowEvent" | zgrep -o 'login":"[^"]*"' | cut -d'"' -f3 | sort | uniq -c

이는 "org" 문자열을 포함하지 않지만 "FollowEvent" 문자열을 포함하는 /path/to/files/*에 있는 모든 파일의 모든 항목에서 모든 사용자 이름(" 다음 세 번째 필드의 텍스트)을 찾습니다. login") 그런 다음 이러한 사용자 이름을 정렬하고 각 사용자 이름이 나타나는 횟수를 계산합니다.

내 문제는 이 부분에 있습니다.

sed '1i{ s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}'

나는 이 정도를 알고 있다(또는 안다고 생각한다):

1) sed텍스트 조작을 허용하는 스트림 편집기입니다.

2)는 sed '1i{"이전 줄에 {"를 삽입한다는 의미입니다.

3) 이 명령은 {"username":count of that username}앞에서 설명한 대로 모든 파일의 모든 사용자 이름을 반환합니다. 그런 다음 이를 usernames_followevents.txt.

4) 해당 부분은 "\2":"두 번째 필드(?)인 사용자 이름 주위에 큰따옴표를 넣은 다음 :를 삽입하십시오"를 의미합니다.

명령 을 조작하고 싶지만 sed나머지 세부 사항을 이해하지 못하면 수정을 시작할 수 없습니다.

sed명령의 각 부분이 무엇을 하는지 설명해 주시겠습니까 ?

답변1

이제 sed 명령이 작성되는 방식이 올바르지 않습니다. 다음과 같은 스크립트여야 합니다.

1i{
s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/
$a}

또는 다음과 같이 한 줄에:

sed -e '1i{' -e 's/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/' -e '$a}'

문자 그대로 명령 뒤에 입력한 모든 내용 ia개행 문자 또는 표현식이 끝날 때까지(-e 사용) 표준 출력에 직접 인쇄됩니다.

그것이 무엇을 하는지 분석해 보겠습니다.

1i{

1회선 주소입니다. sed에게 언제 명령을 실행할지 알려줍니다. 첫 번째 줄의 내용을 패턴 공간으로 읽으면(후행 개행 없이) i표준 출력의 별도 줄에 '{'를 삽입합니다. 패턴 공간은 변경되지 않으며 '{'를 추가하지 않았습니다.

ssed에서 가장 다재다능한 명령인 검색 및 바꾸기 명령입니다. \s공백과 일치합니다. \(regex\)수학처럼 내부의 정규식을 그룹화하지만 해당 그룹의 순서(\1~\9)에 따라 숫자 레지스터에 일치하는 내용을 저장합니다.

의 출력은 uniq -c다음과 같습니다:

    occurrences string
    3 user

이제 복잡한 부분은 다음과 같습니다.

\s*\([0-9]*\)\s*\(.*\)

여전히 라인 1에 있습니다. 패턴 공간은 공백 묶음이고 그 다음은 '3 user'입니다. 이를 일치시키기 위해 우리는 공백을 0번 이상 검색한 다음 레지스터 \1에 저장된 숫자, 즉 숫자(내 생각에는 * 대신 +였어야 했음)를 검색한 다음 공백(*는 내 생각에는 필요하지 않은 것 같습니다), 레지스터 \2에 저장되는 모든 문자가 여러 번(역시 + 더 좋았을 것입니다). 이제 발생 항목은 \1에 있고 문자열/사용자는 \2에 있습니다.

"\2": \1,

전체 줄이 일치하고 조각이 저장되었습니다. 이제 일치하는 항목을 따옴표, 사용자, 따옴표, 콜론, 공백, 발생 및 쉼표로 바꿉니다.

$a}

$라인 주소이기도 합니다. 현재 라인이 마지막 라인이라면, 현재는 그렇지 않은 경우, a별도 라인의 표준 출력에 '}'를 추가하는 명령을 호출하십시오.

이것이 이 라인에 대한 코드 처리의 끝이며, 조작이 완료된 후와 같이 패턴 공간을 자동으로 인쇄한 다음 두 번째 라인의 내용을 읽고 전체 사이클이 반복됩니다.

예제 출력:

{
"user": 3,
}

들여쓰기가 잘못되었지만 기본적으로 JSON 파일 형식입니다.

그게 다야. 소설을 써서 죄송해요 :)

관련 정보