2021. 1. 12. 17:49ㆍLinux/Command-line
1. sort
파일이나 stream으로 읽어들인 line을 정렬하는 명령어 입니다.
sort [OPTION] file_name
정렬 옵션
- -b
- ignore leading blank(필드 앞 공백 무시)
- -d
- dictionary sort(사전순)
- -r
- 정렬 결과 reverse
- -f
- ignore case(대소문자 구분 안함)
- -n
- numeric sort
- -g
- general-numeric sort
- 지수표기법(), NaN, infinity, -infinity을 포함한 숫자 sort
- -M
- month sort
- ex. JAN, FEB, MAR, ..., DEC
- -h
- human-numeric sort
- K, M, G, T, P, E, Z, Y
- ex. 10K, 5M, 2G
정렬 이외 옵션
- -k
- 정렬할 key를 설정
- 키 정의:
F[.C][OPTS][,F[.C][OPTS]]
- F : field number
- C : character position
- OPTS : ordering option
- key 옵션 심화 참고
- -t
- 필드 구분자 설정
- default:
' '
- -u
- unique
- 정렬 기준 key가 중복될 경우 맨 먼저 찾아진 line만 출력
- --debug
- 정렬 기준 출력
2. sort 사용 예제
아래의 예제를 통해 sort 명령어를 사용하는 방법을 상세히 알아보도록 합시다.
예제에서는 정렬에 사용된 필드 확인을 위해 --debug
옵션을 사용하였고, sort옵션에 집중하기 위해 파일내용은 pipe로 넘겼습니다.
melon.txt 은 아래와 같은 내용이 들어있는 파일입니다.
cat melon.txt
grape 10e100 nnnnn abcde 230 mmmmm apple -infinity fifif ABCDE 999e-34 dmmmn violin 33 test ABCDE infinity dmmmn test 4.2 test GRAPE 11.5 dmmmn lily NaN aaaaa
2.1. character 정렬
첫번째 필드값을 이용하여 character 정렬을 해봅니다.
2.1.1. 기본
cat melon.txt | sort -k1,1 --debug
정렬 기준이 되는 필드만 설정하고 정렬해봅니다.
abcde 230 mmmmm _____ _______________ ABCDE 999e-34 dmmmn _____ ___________________ ABCDE infinity dmmmn _________ ________________________ apple -infinity fifif _____ _____________________ grape 10e100 nnnnn _____ __________________ GRAPE 11.5 dmmmn _____ ________________ lily NaN aaaaa ____ ______________ test 4.2 test ____ _____________ violin 33 test ______ ______________
일반 string 정렬에서는 필드에 leading blank도 포함됩니다.
그리고, 기본적으로 필드가 중복될 경우, line 순서대로 출력됩니다.
필요에 따라 옵션을 설정하여 출력 결과를 달리해봅니다.
sort 명령어도 당연히
cat melon.txt | sort -bfu -k1,1 --debug
- -b : ignore leading blank
- -u : unique
- -f : ignore case
필드 앞 공백을 무시하고, 대소문자 구분하지 않고, 중복된 필드는 최초에 출력된 line만 출력되도록 합니다.
abcde 230 mmmmm _____ apple -infinity fifif _____ grape 10e100 nnnnn _____ lily NaN aaaaa ____ test 4.2 test ____ violin 33 test ______
2.2. numeric 정렬
2.2.1. general-numeric sort
general-numeric 정렬은 지수표기법(), NaN, infinity, -infinity을 포함한 숫자를 정렬합니다.
cat melon.txt | sort -k2g,2 --debug
lily NaN aaaaa ___ ______________ apple -infinity fifif _________ _____________________ ABCDE 999e-34 dmmmn _______ ___________________ test 4.2 test ___ _____________ GRAPE 11.5 dmmmn ____ ________________ violin 33 test __ ______________ abcde 230 mmmmm ___ _______________ grape 10e100 nnnnn ______ __________________ ABCDE infinity dmmmn ________ ________________________
cat melon.txt | sort -k2n,2 --debug
ABCDE infinity dmmmn ^ no match for key ________________________ apple -infinity fifif ^ no match for key _____________________ lily NaN aaaaa ^ no match for key ______________ test 4.2 test ___ _____________ grape 10e100 nnnnn __ __________________ GRAPE 11.5 dmmmn ____ ________________ violin 33 test __ ______________ abcde 230 mmmmm ___ _______________ ABCDE 999e-34 dmmmn ___ ___________________
numeric sort에서는 NaN, infinity가 사용 불가능하며, 지수표기법 가 인식되지 않습니다
K, M, G 와 같은 용량을 정렬하는 -h
옵션에 대한 예제입니다.
df -h | tail -n +2 | sort -k4hr,4 --debug
df -h
를 이용하여 서버 용량을 조회하여 남은 용량(4번째 필드)을 내림차순으로 정렬해봅니다.
/dev/vda2 99G 13G 82G 14% / ___ _______________________________________ tmpfs 919M 0 919M 0% /dev/shm ____ ______________________________________________ tmpfs 919M 0 919M 0% /sys/fs/cgroup ____ ____________________________________________________ devtmpfs 909M 0 909M 0% /dev ____ __________________________________________ tmpfs 919M 105M 815M 12% /run ____ __________________________________________ tmpfs 184M 0 184M 0% /run/user/1000 ____ ____________________________________________________
-r
: 내림차순
2.3. Month 정렬
ls -al | tail -n +4
출력 결과를 이용하여 Month 정렬을 해봅시다.
-rw-rw-r-- 1 jini jini 90 Jan 8 10:18 apple.txt -rw-rw-r-- 1 jini jini 0 Oct 28 11:05 banana.sql -rw-rw-r-- 1 jini jini 45 Jan 8 10:19 blue.txt -rw-r--r-- 1 jini jini 15123 Dec 29 03:30 demo.log -rw-rw-r-- 1 jini jini 54 Jan 2 03:39 green.txt -rw-rw-r-- 1 jini jini 99 Nov 3 17:11 Hello.java -rw-rw-r-- 1 jini jini 1823 Nov 20 14:17 login.html -rw-rw-r-- 1 jini jini 7524 Oct 30 15:38 lpsum.txt -rw-rw-r-- 1 jini jini 163 Jan 11 16:52 melon.txt -rw-r--r-- 1 jini jini 1425 Jan 1 22:16 passwd -rw-rw-r-- 1 jini jini 224 Jan 7 16:41 sort_test.txt -rw-rw-r-- 1 jini jini 24362 Nov 17 16:12 spring.md -rw-rw-r-- 1 jini jini 3640 Jan 1 06:31 TokenClass.java -rw-rw-r-- 1 jini jini 200 Nov 17 10:31 ttt.tmp
ls -al | tail -n +4 | sort -k6M,6 -k7n,7 --debug
6번째 필드를 Month sort하고, 그 다음 sort 기준으로 7번째 필드를 numeric sort 합니다.
-rw-r--r-- 1 jini jini 1425 Jan 1 22:16 passwd ___ _ ________________________________________________ -rw-rw-r-- 1 jini jini 3640 Jan 1 06:31 TokenClass.java ___ _ _________________________________________________________ -rw-rw-r-- 1 jini jini 54 Jan 2 03:39 green.txt ___ _ ___________________________________________________ -rw-rw-r-- 1 jini jini 224 Jan 7 16:41 sort_test.txt ___ _ _______________________________________________________ -rw-rw-r-- 1 jini jini 45 Jan 8 10:19 blue.txt ___ _ __________________________________________________ -rw-rw-r-- 1 jini jini 90 Jan 8 10:18 apple.txt ___ _ ___________________________________________________ -rw-rw-r-- 1 jini jini 163 Jan 11 16:52 melon.txt ___ __ ___________________________________________________ -rw-rw-r-- 1 jini jini 0 Oct 28 11:05 banana.sql ___ __ ____________________________________________________ -rw-rw-r-- 1 jini jini 7524 Oct 30 15:38 lpsum.txt ___ __ ___________________________________________________ -rw-rw-r-- 1 jini jini 99 Nov 3 17:11 Hello.java ___ _ ____________________________________________________ -rw-rw-r-- 1 jini jini 200 Nov 17 10:31 ttt.tmp ___ __ _________________________________________________ -rw-rw-r-- 1 jini jini 24362 Nov 17 16:12 spring.md ___ __ ___________________________________________________ -rw-rw-r-- 1 jini jini 1823 Nov 20 14:17 login.html ___ __ ____________________________________________________ -rw-r--r-- 1 jini jini 15123 Dec 29 03:30 demo.log ___ __ __________________________________________________
3. key 옵션 심화
F[.C][OPTS][,F[.C][OPTS]]
- F : field number
- C : character position
- OPTS : ordering option
3.1. end field number 생략
각 line을 정렬하기 위해서는 정렬의 기준이 될 필드가 필요합니다.
키는 F[.C][OPTS][,F[.C][OPTS]]
형식으로 정의하는데, 정렬하고자 하는 필드 시작번호와 끝번호를 설정할 수 있습니다.
end field number를 생략할 경우, sort 기준에 따라 default end field number가 설정됩니다.
- character sort 의 경우
- 맨 마지막 field number가 설정됨
- 그 외의 sort의 경우(numeric, human-numeric 등..)
- start field number가 설정됨
아래의 예제를 확인해봅시다.
cat melon.txt | sort -k2 --debug
별도의 정렬 옵션을 설정하지 않을 경우 사전순으로 정렬되는데, 이는 character 정렬 일종이기 때문에, 맨 2번째 필드부터 맨 끝필드까지를 정렬기준으로 인식합니다.
grape 10e100 nnnnn _____________ __________________ GRAPE 11.5 dmmmn ___________ ________________ abcde 230 mmmmm __________ _______________ violin 33 test ________ ______________ test 4.2 test _________ _____________ ABCDE 999e-34 dmmmn ______________ ___________________ ABCDE infinity dmmmn _______________ ________________________ apple -infinity fifif ________________ _____________________ lily NaN aaaaa __________ ______________
general-numeric-sort는 자동으로 start field number까지를 필드로 인식합니다.
cat melon.txt | sort -k2g --debug
lily NaN aaaaa ___ ______________ apple -infinity fifif _________ _____________________ ABCDE 999e-34 dmmmn _______ ___________________ test 4.2 test ___ _____________ GRAPE 11.5 dmmmn ____ ________________ violin 33 test __ ______________ abcde 230 mmmmm ___ _______________ grape 10e100 nnnnn ______ __________________ ABCDE infinity dmmmn ________ ________________________
단일 필드로 정렬하고 싶다면 이렇게 암시적으로 이용하는 것 보다는 sort -k2g,2
와 같이 명시적으로 end field number를 설정하는 것이 보다 직관적이므로 직접 필드를 모두 정의하는 것을 권장합니다.
3.2. C(character position)
sort를 사용하면서 아직 C 를 한번도 설정한적이 없었습니다.
character position. 말 그대로 문자 위치를 의미하며 정렬하고자 하는 필드의 시작점과 끝점을 설정할 수 있습니다.
보통 필드 전체를 가지고 정렬을 하기 때문에, 필요한 경우에만 사용하면 됩니다.
아래의 예제를 확인해 봅시다.
cat apple.txt | sort -k1.2r,1.4 --debug
grape 12345 nnnnn
___
_________________
apple viooo fifif
___
_________________
cocoa ooooo sksks
___
_________________
melon rrrrr dmmmn
___
_________________
abcde pine2 mmmmm
___
_________________
1번째 필드의 2번째 문자
부터 1번째 필드의 4번째 문자
까지를 정렬 기준으로 하여 내림차순 사전방식으로 정렬하였습니다.
++
- sort: options '-Mn' are incompatible
- how to sort multiple columns using sort command in unix & linux
- sort command in Linux with example
'Linux > Command-line' 카테고리의 다른 글
[Command-line] nl을 이용한 줄번호 설정 (0) | 2021.08.12 |
---|---|
ssh 터널링을 이용한 원격 private database 접속 (0) | 2021.03.03 |
[Command-line] tr 명령어를 이용한 character set 변환 및 삭제 (0) | 2021.01.05 |
[Command-line] tail을 이용한 실시간 로그 모니터링 (+ head) (0) | 2020.12.29 |
[CLI vim] 2. cursor 이동 (0) | 2020.12.01 |