"sort"와 "uniq"가 있다는 것을 알고 있지만 오늘의 질문은 AWK를 사용하여 이런 종류의 작업을 수행하는 방법입니다. 실제 목록(ips, 이름 또는 숫자)이 있고 이를 정렬하고 싶다고 가정해 보겠습니다.
다음은 메일 로그에서 IP 번호를 얻는 방법의 예입니다.
awk 'match($0,/\[[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\]/) { if ( NF == 8 && $6 == "connect" ) {print substr($0, RSTART+1,RLENGTH-2)} }' maillog
동일한 awk 명령에서 "언제 어디서나" IP를 정렬할 수 있습니까? 내 질문에 대한 완전한 답변은 필요하지 않지만 어디서부터 시작해야 할지에 대한 몇 가지 팁이 필요합니다.
건배!
답변1
정렬하려면 다음과 같이 명령 내부에 파이프를 사용할 수도 있습니다 awk
.
awk '{ print ... | "sort ..." }'
이 구문은 데이터 파일의 해당 행이 모두 동일한 정렬 인스턴스로 전달됨을 의미합니다.
물론 셸 수준에서도 이 작업을 동일하게 수행할 수 있습니다.
awk '{ print ... }' | sort ...
awk
또는 자체적으로 여러 정렬 기능을 정의하는 GNU를 사용할 수도 있습니다 .
이는 일반적 으로 "고유한 데이터 요소 또는 키"를 연관 배열에 저장하고 새 데이터를 기억해야 하는지 확인하여 수행됩니다 uniq
. awk
설명할 수 있는 예를 들어보세요.
awk '!a[$0]++'
즉, 현재 행이 배열에 없으면 조건은 true이고 해당 행을 인쇄하는 기본 작업이 트리거됩니다. 동일한 데이터가 있는 후속 행에서는 오류 조건이 발생하고 데이터가 인쇄되지 않습니다.
답변2
큰 따옴표를 사용하면 나에게 효과적이었습니다.
substr(a[1],1,5) 인쇄 "sort -u" # 고유한 값