USB 플래시 드라이브의 오류를 테스트하는 도구를 사용하기 위해 Bash 스크립트를 작성 중입니다 f3
. 다음과 같은 텍스트가 있습니다( f3read
프로그램에서 로그를 수집하여 생성됨).
2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors)
2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors)
2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors)
2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors)
2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors)
2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors)
행 끝에 표시된 불량 섹터 수를 기준으로 행을 정렬하고 싶습니다. 사용해 보았지만 옵션을 사용하여 원하는 대로 작동하게 만드는 sort
방법을 모르겠습니다 .--key
보고를 위해 드라이브 이름(sda, sdb 등)을 추출해야 하기 때문에 먼저 줄을 자를 수가 없습니다.
답변1
POSIXly에서는 다음과 같이 할 수 있습니다.
sort -t '(' -k2n < file
즉, 필드 구분 기호를 설정 (
하고 두 번째 필드(또는 두 번째 필드로 시작하는 줄의 일부)를 숫자로 정렬합니다.
또는 5번째 필드에 대한 기본 필드 구분 기호(공백이 아닌 항목에서 공백으로의 전환)를 유지 " (12"
하고 다음을 사용할 수 있습니다.
sort -k5.3n < file
(즉, 5번째 필드 의 3번째 문자부터 시작하는 줄 부분을 숫자로 정렬합니다 .)
동점인 경우 전체 행의 어휘 비교인 최종 정렬 순서가 적용됩니다(연대순 순서는 여기에서 편리하게 제공됩니다).
드라이브 이름별로 관계를 정렬하려면 다음을 사용할 수 있습니다.
sort -t '(' -k2n -k1.21
(두 번째 키는 문자 21에서 시작하는 줄의 일부, 어휘 비교입니다.)
답변2
sort -V
이 옵션을 사용할 수 있는 경우 사용
-V, --version 정렬
텍스트에서 (버전) 번호의 자연스러운 순서
$ <cmd> | sort -k5,5V
2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors)
2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors)
2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors)
2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors)
2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors)
2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors)
2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors)
2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors)
2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors)
답변3
나는 그것을 발견했다.
sort -n -t '(' -k2V
-n
문자열의 숫자 값을 읽도록 정렬에 지시합니다.
-t '('
(
문자를 필드 구분 기호로 사용하도록 지시합니다 . 이 말 때문에부서)이는 앞으로도 항상 동일하며 정렬 순서에 영향을 주지 않습니다.
-k2V
(
두 번째 열(첫 번째 문자 뒤의 텍스트)을 사용하여 정렬할 사용자 정의 키를 정의합니다 .
답변4
약간 더 유연한 솔루션은 섹터 수를 추출하여 줄 시작 부분에 복사하고 정렬한 다음 마지막으로 중복 항목을 다시 제거합니다.
sed 's/^.*(\([0-9]\{1,\} \)sectors)$/\1&/' |
sort -n |
cut -d ' ' -f 2-
이 솔루션은 각 레코드의 정렬 키를 식별하는 모든 패턴과 함께 작동하므로 더욱 유연합니다.