다음 형식의 코드가 있는 스크립트를 AIX에서 Linux로 이식하려고 합니다.
grep <pattern> $LOG | sort -b +rn4 -5 +2 -3
AIX에서는 이 정렬 구문이 문서화되어 있습니다. 기본적으로 +a -b 구문은 a 필드를 건너뛰고 a와 b 사이의 필드를 정렬 키로 처리하는 것을 의미합니다.
Linux 정렬 명령은 +a "skip field" 인수의 "rn"(역 숫자) 플래그를 좋아하지 않기 때문에 Linux에서는 작동하지 않습니다. 하지만 작동합니다.
grep <pattern? $LOG | sort -b -rn +4 -5 +2 -3
분명히 "필드 건너뛰기 논리"예Linux 정렬이 지원되지만 매뉴얼 페이지에 문서화되어 있지 않습니다(어쨌든 볼 수는 있습니다). 두 시스템 모두에서 사용 가능한 -k 옵션은 키 필드 번호를 지정합니다. 그런데 여기서 이상한 현상이 발생합니다. AIX에서
ls -l | sort -n +4
다섯 번째 필드(크기)를 기준으로 정렬된 파일 목록을 생성합니다. 그러나 Linux에서는 동일한 명령을 실행하면 오류가 발생합니다.
정렬: 읽을 수 없음: +4: 해당 파일이나 디렉터리가 없습니다.
ls -l | sort -n +4 -5
그러나 그것은 작동합니다. 따라서 분명히 +skip-skip 키 선택 구문은 유효하지만 시작 및 끝 열 건너뛰기 매개변수를 모두 지정하는 경우에만 가능합니다. 그리고 그것은 문서화되지 않았습니다. 그래서 제 질문은 - 이 열 건너뛰기 구문이 더 이상 사용되지 않습니까? 코드가 명령에 있고 아무도 그것을 꺼내는 방법을 모르기 때문에 작동합니까?
답변1
귀하의 Linux 시스템이 GNU를 사용한다고 가정합니다 sort
. GNU sort
의 매뉴얼 페이지는 완전한 문서를 제공하지 않습니다. 대신 문서는 정보 파일( info sort
) 형식으로 제공됩니다 .Coreutils 온라인 매뉴얼에도 있습니다.. 후자는 현재 보고 있는 동작을 설명합니다.
POSIX 1003.1-2001을 준수하지 않는 시스템에서는
sort
정렬 키를 지정하는 데 기존 원점 0 구문 " "이 지원됩니다. 전통적인 명령 ' '은 다음과 같은 경우 ' '와 동일합니다.+pos1 [-pos2]
sort +a.x -b.y
sort -k a+1.x+1,b
와이'0
'이거나 존재하지 않습니다. 그렇지 않으면 ' '과 동일합니다.sort -k a+1.x+1,b+1.y
이 레거시 동작은 환경 변수를 통해 제어할 수 있습니다
_POSIX2_VERSION
(참조:표준 준수);POSIXLY_CORRECT
설정되지 않은 경우 '를 사용하여 기존 구문을 사용하여 활성화할 수도 있습니다.-pos2
' 전시하다.
환경이 GNU를 실행하도록 설정되어 있으면 sort
독립형으로 사용할 수 있습니다._POSIX2_VERSION
199209
+x
ls -l | _POSIX2_VERSION=199209 sort -n +4