로그 파일이 여러 개 있는데 "고유 ID"가 포함된 특정 줄의 발생 횟수를 계산해야 합니다.
따라서 로그 라인은 다음과 같습니다.
<Some_ID> is related to <Unique_ID>
위의 값은 로그에서 여러 번 반복될 수 있습니다.
여러 파일에서 위 로그 줄(다른 ID 사용)의 고유한 발생 횟수를 계산하는 명령을 찾아야 합니다.
답변1
이 명령은 고유 ID 앞의 모든 텍스트를 제거한 다음 고유 ID의 발생 횟수를 계산하고 발생 순서에 따라 정렬된 목록을 생성합니다.
cat log1 log2 ... logN | sed 's/^.* is related to //' | sort | uniq -c | sort -n
답변2
"Some_ID"와 "Unique_ID" 사이의 텍스트가 실제로 상수인 경우 다음이 작동합니다(예: 타임스탬프 없이).
cat log1 log2 ... | grep "Some_ID" | sort | uniq -c | sort -n
답변3
내가 올바르게 이해했다면 ID를 얻으려는 경우 를 사용하여 이 작업을 수행하고 이를 sed
and 의 while 루프에 삽입할 수 있습니다.grep
wc
cat files | sed -e 's/.*is related to //g' \
| while IFS= read -r ID; do
count=`grep $ID files | wc -l`
echo "$ID = $count"
done
답변4
귀하의 질문과 의견의 설명을 통해 귀하의 질문을 이해하는 방식은 귀하가 고유한 관계의 수를 찾고 있다는 것입니다. 따라서 다음과 같이 파일이 주어지면:
345 is related to 123
678 is related to 123
187 is related to 732
678 is related to 123
결과는 3이어야 합니다. 이를 위해 , sort
, uniq
및 cat
파이프 wc
연산자가 도움이 될 것입니다.
검색하려는 모든 파일이 폴더에 있는 경우 간단히 사용할 수 있습니다 *
(와일드카드 연산자) 각 파일을 검색합니다. 예를 들어 cat *
현재 디렉터리에 있는 모든 파일의 내용을 인쇄합니다. 여러 파일을 나열하여 지정할 수도 있습니다. cat file1.txt file2.txt
인쇄할 것입니다 file1
및 file2
. 특정 하위 디렉터리에 파일을 지정하기 위해 와일드카드와 함께 사용할 수 있습니다( cat dir1/* dir3/*
건너뛰기 dir2/
). 부분 파일 이름을 지정할 수도 있습니다. cat file*
일치 file1
하지만 file123
일치하지 않습니다 afile
.
위의 내용을 사용하면 다음을 포함할 수 있습니다.어느가져오려는 파일입니다 sort
. 파이프 연산자( |
)는 한 명령의 출력을 가져와 다른 명령의 입력으로 파이프합니다. cat file1 | sort
내용이 정렬됩니다 file1
. 그런 다음 이를 파이프하여 uniq
중복 항목을 필터링한 다음 wc
다음을 사용하여 행 수를 계산할 수 있습니다 cat file1 | sort | uniq | wc -l
.
위에 제공한 예제 파일을 사용하면 이 sort
명령은 출력을 다음과 같이 변경합니다.
187 is related to 732
345 is related to 123
678 is related to 123
678 is related to 123
uniq
중복된 항목(이 예의 하단)은 제거됩니다.
187 is related to 732
345 is related to 123
678 is related to 123
wc -l
행 수를 계산하고 반환 합니다 3
.
노트:이것은 중요합니다 123 is related to 321
그리고 321 is related to 123
~처럼둘별도의 관계. 이 문제를 해결하려면 입력 데이터를 구문 분석하고 항목을 테이블이나 해시 맵으로 구성하는 등 좀 더 복잡한 작업을 수행해야 합니다.
또한 매우 큰 입력의 경우 명령 체인이 중단되고 정지된 것처럼 보일 수 있습니다. 많은 입력 데이터로 작업하는 경우 데이터를 관리하기 위해 데이터베이스를 설정하는 것이 좋습니다. 이렇게 하면 쿼리를 사용하여 이러한 유형의 검색을 더 빠르게 수행할 수 있기 때문입니다.