행의 인스턴스를 필터링하고 기록하는 방법

행의 인스턴스를 필터링하고 기록하는 방법

수천 줄의 로그 파일이 있습니다. 수백 행까지 필터링할 수 있습니다. 대부분의 행은 동일한 정보가 포함된 중복 행이므로 이러한 중복 행 중 하나만 표시하고 싶습니다.

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입니다.

관련 정보