Feb 7 domainserver dovecot[37495]: auth(default): od(tjones): lookup failed for user: tjones
위는 내가 정렬하려는 항목의 샘플 출력입니다. 첫 번째 열에서는 날짜별로 정렬하고 tjones
오른쪽에서는 사용자 별로 정렬하고 싶습니다 .
tjones
기본적으로 모든 인스턴스를 함께 그룹화하되 날짜별로 정렬하고 싶습니다 . 이 작업을 수행하기 위해 어떤 명령을 사용해야 하는지, 또는 열을 다시 정렬하기 위해 awk 명령을 사용해야 하는지 잘 모르겠습니다.
분명히 users 보다 더 많으므로 tjones
이 두 열을 기준으로 정렬하고 싶습니다.
다음을 시도했지만 "정렬: 다중 문자 탭 '\t'" 오류가 발생합니다.
sort -t '\t' -k1,1 -k5,5n auth_2014uniq.txt > auth_2014uniqtest
답변1
sort
특정 필드별로 정렬 허용-k
옵션:
sort -k11 -k1,2 data
먼저 필드 11(사용자 이름)을 기준으로 정렬한 다음 필드 1과 2를 함께(날짜) 기준으로 정렬합니다. 알아채다순서가 중요하다여기에서는 -k
먼저 첫 번째 옵션을 기준으로 정렬한 다음 다음 옵션을 사용하여 동점을 끊습니다(등등).
이는 정확한 출력에 따라 크게 달라집니다. 공백의 각 시퀀스는 필드 구분 기호이므로 "찾기 실패"는 세 개의 다른 필드입니다.
실제 데이터에 탭으로 구분된 필드가 있는 것처럼 보이도록 편집하세요. 하지만 이 경우에는 탭이 어디에 있는지 알 수 없습니다. 그렇다면 -t
-에 대한 인수 로 리터럴 탭을 제공해야 하며 sort
이스케이프가 이해되지 않으며 쉘 \t
도 확장되지 않을 것입니다. 그 안에 리터럴 탭을 쓰거나 Ctrl-VTab탭으로 바꾸십시오. 그런 것은 "$(echo -ne '\t')"
옵션입니다. 이 경우 해당 필드 번호를 바꾸십시오.
-k5,5n
필드 5만 숫자로 정렬합니다. 데이터가 숫자가 아니므로 실수인 것 같습니다.
GNU sort
및 기타 일부에는 다음이 포함됩니다.-M
한달월을 순서대로 정렬하는 데 사용할 수 있는 정렬 확장 프로그램입니다. 당신은 그것을 사용할 수도 있고 사용하지 못할 수도 있습니다.FreeBSD그리고운영 체제,하지만다른 BSD상업용 Unices보다는. 가능한 경우 -k1,1M -k2,2n
날짜는 올바른 월/일 순서로 정렬됩니다. 로케일에 따라서도 다릅니다. 로그 파일과 환경이 다른 지역화를 사용하는 경우에는 작동하지 않습니다. 이것이 없으면 월별로 그룹화되고 매월 날짜별로 올바르게 정렬됩니다.
답변2
sed -n 's/\(.*user: \)\([^ ]*\)$/\2 \1\2/p' <<\DATA |\
sort -t' ' -k1,1 -k2,3M |\
sed 's/[^ ]* //'
Feb 7 domainserver dovecot[37495]: auth(default): od(tjones): lookup failed for user: tjones
Feb 8 domainserver dovecot[37495]: auth(default): od(tjones): lookup failed for user: tjones
Feb 5 domainserver dovecot[37495]: auth(default): od(lbones): lookup failed for user: lbones
Jan 7 domainserver dovecot[37495]: auth(default): od(chaz): lookup failed for user: chaz
Mar 7 domainserver dovecot[37495]: auth(default): od(lbones): lookup failed for user: lbones
DATA
산출
Jan 7 domainserver dovecot[37495]: auth(default): od(chaz): lookup failed for user: chaz
Feb 5 domainserver dovecot[37495]: auth(default): od(lbones): lookup failed for user: lbones
Mar 7 domainserver dovecot[37495]: auth(default): od(lbones): lookup failed for user: lbones
Feb 7 domainserver dovecot[37495]: auth(default): od(tjones): lookup failed for user: tjones
Feb 8 domainserver dovecot[37495]: auth(default): od(tjones): lookup failed for user: tjones
먼저 문자열이 포함된 행만 선택하여 데이터를 자릅니다.사용자:그리고 다음 필드를 줄 시작 부분에 복사합니다. 따라서 다음 데이터가 제공됩니다.
*CRUFT*user: nospaces$
여기서 은 $
줄의 끝을 나타내며 가장 먼저 sed
해야 할 일은 다음과 같습니다.
nospaces *CRUFT*user: nospaces$
...복사공간 없음대기열의 선두에. 이는 일반적으로 행의 필드 수 변경(1 또는 2)이 큰 영향을 미치기 때문에 이러한 유형의 작업에서 일반적인 관행입니다 sort
.sort
오직그것에 대해서. 어쨌든, 그게 여기서 일어나고 있는 일이에요.
따라서 sed
편집된 데이터는 첫 번째 필드(사용자 이름) |pipe
를 sort
먼저 정렬한 다음 두 번째와 세 번째 필드를 MONTH
결합하는 ey로 전달됩니다. -k
결과적으로 모든 행은 사용자 이름별로 그룹화되고 각 그룹은 날짜별로 정렬됩니다.
마지막으로 sort
데이터를 넘겨주세요뒤쪽에sed
다른 필드를 덮어쓰고 |pipe
행 sed
의 첫 번째 필드를 삭제합니다. 해당 필드는 처음에 해당 필드에 복사되었기 때문에 존재합니다.