나는 이 명령의 일부가 어떤 역할을 하는지 이미 알고 있습니다.
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}'
문자 그대로 명령 뒤에 입력한 모든 내용 i
과 a
개행 문자 또는 표현식이 끝날 때까지(-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 파일 형식입니다.
그게 다야. 소설을 써서 죄송해요 :)