수천 줄의 로그 파일이 있습니다. 수백 행까지 필터링할 수 있습니다. 대부분의 행은 동일한 정보가 포함된 중복 행이므로 이러한 중복 행 중 하나만 표시하고 싶습니다.
cat file.log | grep "plugin time out"
hostA plugin time out
hostA plugin time out
hostA plugin time out
hostB plugin time out
hostB plugin time out
hostC plugin time out
이 출력을 어떻게 얻을 수 있습니까?
hostA plugin time out
hostB plugin time out
hostC plugin time out
답변1
uniq에 파이프 추가
cat file.log | grep "plugin time out" |uniq
답변2
몇 가지 의견과 제안
- 피하다고양이에게 쓸모없는 용도. 많은 명령은 파일 이름을 입력으로 직접 받아들이거나 그렇지 않은 경우 리디렉션을 사용할 수 있습니다. 예를 들면:
tr 'a-z' 'A-Z' < ip.txt
또는< ip.txt tr 'a-z' 'A-Z'
- 쉘 해석을 피하려면 작은따옴표를 사용하십시오. 바라보다mywiki.wooledge - 인용문
솔루션 활용awk
$ awk '/plugin time out/ && !seen[$1]++' file.log
hostA plugin time out
hostB plugin time out
hostC plugin time out
/plugin time out/
사용법과 같습니다grep
. 필터 라인 매칭plugin time out
!seen[$1]++
해당 행의 첫 번째 열을 기준으로 고유한 행만 필터링합니다. (입력 행은 기본적으로awk
공백으로 분할되며 필드는 등을 통해 액세스할 수 있습니다$1
.$2
)seen
첫 번째 필드를 키로 사용하는 연관 배열입니다. 숫자 컨텍스트의 기본값은 입니다0
. 따라서!seen[$1]
처음 발생하는 경우에만 true입니다.