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) 비어 있지 않은 일치 항목에 대한 zgrep -o 'login":"[^"]*"'검색 문자열 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/*에 있는 모든 파일의 모든 항목에서 모든 사용자 이름을 찾습니다(이것은 " " 뒤의 세 번째 필드에 있는 텍스트입니다). ") 그런 다음 이러한 사용자 이름을 정렬하고 각 사용자 이름의 발생 횟수를 계산합니다.

내 문제는 이 부분이다.

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표준 출력의 별도 줄에 "{"를 삽입합니다. 패턴 공간은 변경되지 않았으며 "{"가 추가되지 않았습니다.

s검색 및 바꾸기 명령으로 sed에서 가장 일반적인 명령입니다. \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 파일 형식입니다.

그게 다야. 소설을 써서 미안해요 :)

관련 정보