맘가는 대로
GNU Coreutil 간략 정리 본문
서버 관리를 하다보면 다양한 도구가 필요한데, GNU Coreutil 중에 이미 구현된 되었을 때가 있다.
스크립트를 짜기 전에 커맨드라인으로 빠르게 처리할 경우를 높이기 위해 존재하는 도구를 미리 알아야 할 필요가 있을 것으로 생각되며, 특히, coreutil 은 거의 대부분의 리눅스 배포판에서 반드시 설치되는 패키지이기 때문에 매우 유용할 것이라고 생각한다.
우선, 무엇이 있는지부터 빠르게 훑어보자.
아래의 표는 coreutil 에 있는 프로그램들을 알파벳 순으로 구분한 표이다.
[ | |||||||||
arch | |||||||||
b2sum | base32 | base64 | basename | basenc | |||||
cat | chcon | chgrp | chmod | chown | chroot | cksum | comm | coreutils | cp |
csplit | cut | ||||||||
date | dd | df | dir | dircolors | dirname | du | |||
echo | env | expand | expr | ||||||
factor | false | fmt | fold | ||||||
groups | |||||||||
head | hostid | hostname | |||||||
id | install | ||||||||
join | |||||||||
kill | |||||||||
link | ln | logname | ls | ||||||
md5sum | mkdir | mkfifo | mknod | mktemp | mv | ||||
nice | nl | nohup | nproc | numfmt | |||||
od | |||||||||
paste | pathchk | pinky | pr | printenv | printf | ptx | pwd | ||
readlink | realpath | rm | rmdir | runcon | |||||
seq | sha1sum | sha224sum | sha256sum | sha384sum | sha512sum | shred | shuf | sleep | sort |
split | stat | stdbuf | stty | sum | sync | ||||
tac | tail | tee | test | timeout | touch | tr | true | truncate | tsort |
tty | |||||||||
uname | unexpand | uniq | unlink | uptime | users | ||||
vdir | |||||||||
wc | who | whoami | |||||||
yes |
많으면 많다고 볼 수도 있고, 조금만 다른 프로그램도 많기 때문에 의외로 적다고 볼 수도 있다.
각 프로그램들의 용도와 예시를 간략하게 썻다.
- [ , test
test 혹은 [ 은 주어진 조건식의 boolean 값, true 혹은 false 을 판단하여 출력하는 프로그램이다.
조건식은 문자열, 정수, 파일에 대한 표현식이다.
보통 쉘 스크립트 내에서 조건문에 사용된다.
- arch
쉘이 작동하는 시스템의 architecture 를 표시한다.
예를 들어, 인텔 CPU 를 사용하면 x86_64 가 표시된다.
- b2sum, cksum, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, sum
주어진 파일의 내용 혹은 입력된 문자열의 해시 함수로 계산된 값을 표시해준다.
프로그램 이름에서 sum 앞의 이름은 사용되는 해시 함수를 나타낸다.
b2 는 BLAKE2, ck 는 CRC, md5 는 MD5, sha1 은 SHA1, sha224 는 SHA224, sha256 은 SHA256, sha384 는 SHA384, sha512 는 SHA512 해시 함수, sum 은 BSD 알고리즘을 사용한다.
보통 이 프로그램은 파일의 정합성을 빠르게 알아내기 위해 사용된다.
가령 한 개발자가 자신의 프로그램 혹은 압축파일을 배포하기 위해 파일을 웹 페이지에 업로드하였을 때 단순히 파일만 올리는 것이 아니라 특정 해시 함수를 이용해 파일의 해시값도 같이 올린다.
이러할 경우 악의적인 방법으로 파일이 변경됐을 경우 파일이 변경된 것을 알아챌 수 있다.
- base32, base64, basenc
데이터를 base32, base64 로 인코딩 혹은 디코딩을 하여 표준 출력으로 표시하는 프로그램이다.
base32, 64 는 문자열 데이터를 이진데이터로 혹은 반대 방향으로 변환하는데 사용되며, 보통 이메일에서 데이터를 전송하는 등의 데이터 전송에 주로 사용된다.
- basename
주어진 파일명에서 디렉토리 이름들을 지워주며, -s 옵션을 통해 접미사(주로, 확장자)도 지울 수 있다.
- cat
파일의 내용을 표준 출력으로 표시해준다. 여러개의 파일을 대상으로 할 경우 주어진 파일명 순서대로 출력한다.
- chcon
파일의 SELinux 속성을 바꾸는 프로그램이다.
효과가 있으려면 사용하는 서버 혹은 시스템에서 SELinux 가 작동되어야 한다. 작동 여부는 getenforce 혹은 sestatus 명령어로 확인이 가능하다.
파일의 SELinux 속성은 ls 의 -Z 옵션을 이용해서 확인한다.
SELinux 속성은 부모 디렉토리에서 상속받는다. 기본 속성 값은 matchpathcon 을 통해 확인 가능하다.
chcon 을 통해 SELinux 속성을 바꿀 수 있고, 직접 속성을 지정하거나 참고 파일을 지정할 수 있다. 또한 -R 옵션을 통해 재귀적인 작업도 가능하다.
restorecon 을 통해 SELinux 의 기본 속성으로 다시 되돌릴 수 있다.
- chown, chgrp
파일의 소유권한을 바꿀 수 있다. 단, chgrp 는 소유 권한 중 그룹의 권한만 수정이 가능하다.
- chmod
파일의 권한(혹은 mode 비트)을 수정할 수 있다.
권한 수정은 아래의 형태를 가진다고 한다.
[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+
즉, 문자와 숫자의 형태로 표시할 수 있으며, 원하는 형태 혹은 단순히 권한을 수정하는 것만 할 수도 있다.
- chroot
리눅스는 / 디렉토리는 최상위 디렉토리이며 모든 파일 작동은 / 아래에서 실행된다.
chroot 는 서버내의 특정 디렉토리를 최상위 디렉토리로 바꾸는 명령어이다.
chroot 를 통해 /test-root 로 이동했음에도, 실행되는 쉘에서는 최상위 디렉토리로 보고 있다.
즉, 일종의 프로세스 격리로 볼 수 있으며, 현재 많이 사용되고 있는 컨테이너 기술의 기초 구성 요소이기도 하다.
- comm
두 개의 정렬된 파일을 라인별로 비교하는 프로그램이다.
첫번째 열은 처음 주어진 파일에만 있는 문장을, 두번째 열은 두번째로 주어진 파일에만 있는 문장을, 세번째 열은 두 파일 모두 갖고 있는 문장을 보여준다.
- cp
파일과 디렉토리를 복사하기 위한 프로그램이다.
파일과 디렉토리를 하나 이상 복사할 수 있으며, 인자를 주는 방식에 따라 사용법이 조금씩 다르다.
보존할 파일 속성들에 따라 주어지는 옵션이 다르며, 보통 전체 보존을 위해 -a 옵션을 사용한다.
- csplit, split
파일을 나누는 프로그램이며, csplit 은 주어진 문장의 패턴을 참조하여 파일을 나누는 프로그램이다.
split 을 통해 나눌 경우의 예시이다.
csplit 을 통해 나눌 경우 예시이다.
아래는 예시 파일이다.
5 번째 줄을 기준으로 파일을 나눌 경우
test 가 들어간 라인을 기준으로 파일을 나눌 경우
- cut
파일의 각 문장들을 옵션에 맞게 잘라내는 프로그램이다.
각 라인의 2 번째에서 4 번째까지의 문자만을 출력할 경우
구분자를 - 로 하고 첫번째 열의 문장만 출력할 경우
- date
날짜와 시간을 표시해준다.
단순 사용의 경우, 바로 요일과 월, 일, 시각과 타임존, 년을 출력한다.
원하는 형태로 시간을 출력할 수 있다.
- dd
파일을 복사하거나 변환하는데 사용된다. 보통 파일을 원형 복사하는데 주로 쓰인다.
무의미한 랜덤 파일을 생성하는 경우
if 는 입력 파일을 의미한다. 사용된 /dev/urandom 은 유사 난수를 생성하는데 사용되는 특수 파일이다.
of 는 출력 파일을 의미한다. 대상이 되는 파일을 지정하면 된다.
bs 는 복사할 때 기준으로 하는 블록의 바이크 갯수를 나타낸다. 각 단위는 아래와 같다.
count 는 복사할 블록의 갯수를 의미한다.
status 는 출력하는 정보의 수준을 나타내는데, 복사 과정을 지켜보기 위해 progress 로 하였다.
총 복사한 파일의 크기는 bs 와 count 의 곱으로 계산되는데, 4MiB 크기의 블록을 256 개 옮겼으니 총 1 GiB 크기의 파일을 복사하였다. GB 는 1000 을 단위로, GiB 는 1024 단위로 계산되는 것도 유의하면 좋다.
- df
사용하는 파일 시스템의 사용량을 출력한다.
보통 -h 옵션과 함께 읽기 쉽게 출력한다.
- dir, ls
디렉토리 내의 파일들을 보여준다.
리눅스에서 dir 와 ls 는 같기 때문에, dir 대신 ls 를 써도 된다.
- dircolors
ls 를 통해 나타나는 디렉토리의 색을 지정해주는데 필요한 명령어를 출력해준다.
터미널을 사용할 때 보여지는 파일들이나 디렉토리의 색을 변경하는데 쓰일 수 있겠지만, 평소에는 쓸 일이 없을 듯 하다. 보통 서버보다는 터미널 클라이언트쪽을 수정하는게 더 좋으니...
- dirname
basename 과는 반대로 주어진 파일명에서 디렉토리의 이름을 출력해준다.
- du
파일의 디스크 사용량을 보여준다.
단순히 명령어만 입력하였을 경우 디렉토리의 총 디스크 사용량을 보여준다. 기본 단위는 1024byte 이다.
대상을 지정하고 싶을 경우 단순히 파일명을 입력하거나, 쉘 확장을 이용할 수 있다. 또한 -h 옵션을 통해 보기 쉽게 파일 크기를 변환할 수 있다.
- echo
주어진 문장을 표준 출력으로 출력한다.
- env
프로그램을 실행할 때 환경 변수를 달리 줄 수 있게 한다.
명령어를 바로 입력하면 현재 사용되는 환경 변수를 표시한다.
프로그램이 실행되는 디렉토리 위치를 바꿔서 실행할 수 있다.
- expand, unexpand
expand 는 파일 혹은 표준 입력의 탭 문자를 스페이스(칸 띄움) 문자로 바꿔준다.
반대로 unexpand 는 파일 혹은 표준 입력의 스페이스 문자를 탭 문자로 바꿔준다.
아래는 expand 를 사용한 예이다.
탭 문자를 변경할 경우 아래와 같다.
-t 옵션을 통해 스페이스 개수를 조정할 수 있다.
아래는 unexpand 를 사용한 예이다.
-t 옵션을 통해 주어진 수의 배수의 위치에 있는 스페이스 문자를 탭문자로 변경한다.
- expr
표현식을 계산해준다.
사칙연산과 크기 비교, 논리 연산이 가능하다.
다만, 정수 계산만 가능하다.
- factor
주어진 정수 혹은 정수 리스트의 소인수 분해를 한다.
- false, true
어떠한 동작을 하지 않고 상태 코드를 내놓는다. 주어진 인수는 모두 무시된다.
false 는 실패(1)를, true 는 성공(0)를 상태 코드로 반환한다.
- fmt
주어진 파일 혹은 표준 입력의 문장들을 주어진 옵션에 맞게 형태를 바꾼다.
- fold
주어진 파일 혹은 표준 입력의 각 문장들을 주어진 문장 폭에 맞게 조정한다.
- groups
주어진 사용자 계정의 그룹을 표시한다. 사용자 계정이 주어지지 않을 경우 명령어가 실행되는 프로세스의 소유자 그룹을 표시한다.
- head
파일의 앞 부분을 표시해준다.
- hostid
명령어가 실행된 호스트의 구분자를 표시한다.
리눅스의 경우 사용중인 IP 주소에 의해 결정되므로, 고유 번호라고 할 수 없다.
- hostname
명령어가 실행되는 호스트의 호스트명을 표시한다. 관련된 파일로 /etc/hostname, /etc/hosts 가 있다.
- id
실제(real) UID 및 GID 와 유효(effective) UID 및 GID 를 표시한다.
- install
파일을 복사하고 속성을 설장한다.
- join
파일들 각 줄을 합친다. 이 때 필드를 바꿔가며 합칠 수 있다.
- kill
이 명령어를 사용할 때는 주의할 점이 있다. 일반적으로 Bash 에서 내재함수로서 kill 이 제공되기 때문에 coreutils 에서 제공되는 kill 을 사용할 때는 절대 경로를 제공해서 사용하여야 한다.
아무런 옵션을 주지않고 사용할 때에는 해당하는 프로세스에 TERM 신호를 보낸다. 이를 IPC(inter process communication) 라 하며, 보통 시그널 혹은 신호라 부른다.
위의 이미지에서 보낼 수 있는 시그널 종류를 확인할 수 있다.
kill 은 프로세스를 죽이는 명령어라기 보다는 죽이는 신호를 포함하여 프로세스에 신호를 보내는 신호기라 할 수 있다.
- link, ln
ln 은 파일간 링크를 만드는 명령어이다. ln 을 통해서 하드 링크와 소프트 링크를 생성할 수 있다.
link 명령어는 'ln --directory --no-target-directory TARGET LINK' 로 볼 수 있으며, 하드 링크를 생성할 수 있다.
하드 링크는 대상 파일의 i-node 를 복제하여 파일을 생성하기 때문에 동일한 데이터를 참조한다고 볼 수 있으며, 심볼릭 링크는 대상의 주소를 참조한다. 하드 링크는 다른 파일 시스템간의 링크를 생성할 수 없지만, 심볼릭 링크는 주소만 참조하기 때문에 가능하다.
- logname, whoami
logname 은 자신이 처음 로그인한 계정의 이름을 표시한다.
whoami 는 유효 계정의 이름을 표시한다.
- mkdir
디렉토리를 생성하는 명령어이다.
- mkfifo
이름이 있는 파이프(named pipe) 를 생성하는 명령어이다. 파이프 파일을 통해 입력과 출력이 가능하며, FIFO 알고리즘을 사용하기 때문에 입력한 순서대로 출력된다.
- mknod
특수 파일을 생성하는 명령어이다.
블록 파일과 문자 파일은 메이저 및 마이너 번호가 필요하지만 파이프 파일은 필요하지 않다.
- mktemp
임시 파일 혹은 임시 디렉토리를 생성하고 그 파일 혹은 디렉토리의 이름을 반환한다.
- mv
파일을 옮기거나 파일의 이름을 바꿔준다.
- nice
프로세스의 우선순위(niceness)를 조정한다.
보통 우선순위는 0 으로 주어지며, 우선순위는 -20 ~ 19 로 정할 수 있다.
커널에서 사용되는 프로세스 스케줄러에 따라 다르지만, 보통 우선순위를 통해 CPU 사용 시간이 조정된다.
우선순위는 커널에서 사용되는 중요도(priority)와 연관이 있다. priority = niceness + 20 으로 계산되며,
커널에서 실제 사용되는 값은 priority + 100 으로 사용된다.
커널에서 사용되는 priority 는 0 ~ 99 의 값을 이용하며, top 을 통해 조회할 때는 rt 로 나타나고 리얼타임 프로세스를 의미한다.
- nl
파일의 라인수를 나타내는 프로그램이다.
좌측의 숫자가 라인번호를, 우측의 문자열이 파일내의 내용을 보여준다.
- nohup
HUP(hangup) 신호를 무시하게 한다.
보통 터미널이 닫힐 때 터미널의 자식 프로세스들이 해당 신호를 받아 프로세스가 종료되지만, nohup 과 함께 사용되면 프로세스가 종료되지 않는다. 표준출력으로 출력되는 데이터들은 nohup.out 혹은 지정된 파일로 저장된다.
터미널이 사라져서 부모 프로세스가 사라졌을 경우 고아 프로세스에 작동하는 것과 같이 PID 1 프로세스가 부모 프로세스가 된다.
- nproc
처리장치의 갯수를 보여준다. 다만, CPU 의 총 쓰레드 갯수로 볼 수 있다.
VM 에서 vCPU 를 1 개 주었을 때 아래와 같다.
하지만 6 코어 12 스레드의 CPU 환경에서 명령어를 실행하면 아래와 같이 나온다.
즉, 처리 장치 갯수라 함은 물리적으로 제공되는 처리 장치의 갯수이다. 보통 효율적인 병렬 처리 등을 위해 CPU 의 갯수를 파악할 필요가 있을 것이다.
- numfmt
컴퓨터에서 쓰이는 단위들을 사람이 읽기 쉽게 혹은 데이터로 쓰기 쉽게 변환해준다.
숫자를 바로 변환
명령어의 출력을 파이프를 통해 처리
- od
파일의 내용을 8진수 혹은 다양한 방법으로 표시할 수 있다.
UTF-8 코드에서 각 문자가 나타내는 값을 변형하는 것이기 때문에, 실제 문자로 나타내느 1 이 값으로 변환되는 것이 아닌, UTF-8 에서 1 이 나타내는 값인 49 가 변환된다.
- paste
파일의 각 줄을 합친다.
- pathchk
파일명의 유효성 혹은 이식성을 검사한다.
아래의 예는 파일명은 유효하지만 이식성은 없을 때의 예시이다.
- pinky
사용자의 정보를 나타낸다.
- pr
파일의 내용을 인쇄 목적으로 재배치해준다.
- printenv
현재 쉘의 환경 변수 값들을 출력한다.
- printf
주어진 문자열 형태에 따라 데이터를 표시한다. C 언어 등에서 제공되는 printf 함수와 쓰임새가 유사하다.
- ptx
파일의 permuted index(순열 색인)을 생성해준다.
보통 UNIX 계열의 매뉴얼에서 위와 같은 색인을 제공했는데, 명령어 조회를 빠르게 하는 목적이라고 한다. 다만, 많은 문서 형식에서 사용되지 않고, 익숙하지도 않아 적응하는데 문제가 있을 것으로 보이며, 주로 사용될 것으로 보여지지 않는다.
다만, 기술 문서를 작성하는 사람에게는 도움이 되지 않을까 생각된다.
- pwd
현재 있는 디렉토리를 표시한다.
환경 변수의 PWD 도 같은 값을 나타낸다.
다만, -P 옵션을 사용하면 모든 심볼릭 링크를 무시하기 때문에 물리적 위치를 표시한다. 심볼릭 링크가 많아서 헷갈릴 때 유용하다.
- readlink
심볼릭 링크가 가리키는 파일을 표시한다.
- realpath
심볼릭 링크가 가리키는 원본 파일을 표시한다. 재귀적으로 추적하기 때문에 심볼릭 링크가 아닌 파일이 나올 때까지 추적한다.
- rm
파일 혹은 디렉토리를 지운다.
- rmdir
비어있는 디렉토리를 삭제한다. 조건 덕분에 안전한 디렉토리 삭제가 가능하다.
- runcon
특정 SELinux 보안 컨텍스트 설정으로 명령어를 실행한다.
명령어나 보안 컨텍스트가 지정되지 않았을 경우 현재의 보안 컨텍스트를 표시한다.
- seq
수열을 표시한다.
- shred
파일을 복구하기 어렵도록 덮어쓴다.
다만, 매뉴얼에서도 잘 나와있지만 최근의 파일시스템들은 파일 복구를 위한 다양한 기능들이 기본적으로 적용되고 있기 때문에 이 명령어를 통해 파일의 내용이 완전히 지워졌다고 보장되지 않는다.
- shuf
파일의 내용을 임의의 순열로 라인을 출력한다.
- sleep
주어진 시간동안 유휴한다.
- sort
파일의 내용을 각 라인의 내용에 따라 정렬한다.
- stat
파일 혹은 파일 시스템 정보를 표시한다.
- stdbuf
표준 스트림에 대한 버퍼링 모드를 수정하여 명령어를 수행한다.
예시
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
보통 파이프 버퍼링을 라인 버퍼링(줄만 바뀌면 바로 버퍼 플러시)으 변경해 명령어 실행을 빠르게 할 수 있다.
- stty
터미널 라인에 대한 설정을 표시하고 변경할 수 있다.
- sync
메모리 캐시를 스토리지에 데이터를 쓰도록 한다.
리눅스는 디스크에 쓰기 작업을 할 때 바로 디스크에 기록을 하는게 아니고, 커널에서 메모리 버퍼를 이용하여 데이터를 저장하고 있다가 임계점에 도달했을 때 디스크에 데이터를 기록한다. 이는 잦은 디스크 쓰기 작업으로 인한 성능 저하를 막기 위함이다. 보통 이러한 버퍼를 더티 페이지라 지칭한다.
- tac
파일을 역순으로 출력한다. cat 의 반대임을 나타내기 위해 tac 으로 쓴다.
- tail
파일의 끝부분을 출력한다.
보통 -f 옵션을 통해 계속 증가하는 로그 파일을 지켜보는 경우가 많다.
- tee
표준 입력에서 읽은 데이터를 표준 출력과 파일으로 보낸다.
- timeout
명령어 실행에 시간 제한을 둔다.
- touch
파일의 타임스탬프를 변경한다.
존재하지 않는 파일에 명령어를 실행할 경우 빈 파일을 생성한다.
- tr
문자를 변경하거나 삭제한다.
- truncate
대상 파일의 크기를 늘리거나 줄인다.
기존 파일 크기보다 늘릴 경우 파일 구멍(널바이트로 채워진 파일 데이터)가 생기며, 기존 파일보다 줄일 경우 데이터가 삭제된다.
- tsort
파일 내용에 대해 위상정렬을 한다.
과거 실행 파일의 의존성을 파악하기 위해 사용되었다고 한다.
- tty
현재 터미널의 표준 출력으로 되어있는 파일 이름을 표시한다.
- uname
시스템 정보를 표시한다.
- uniq
파일의 반복되는 라인을 없애거나 출력한다.
- unlink
지정한 파일의 링크를 삭제한다.
- uptime
시스템의 실행 시간을 표시한다.
- users
현재 접속한 사용자들의 계정명을 표시한다.
정보를 제공하는 파일을 사용하며 지정되지 않을 경우에는 /var/log/utmp 를 사용한다.
- vdir
디렉토리 내의 파일을 표시한다.
- wc
파일의 바이트, 단어, 라인의 수를 센다.
- who
누가 접속되어있는지 표시한다.
- yes
해당 프로세스가 종료되기 전까지 문장을 반복하여 출력한다.
보통 y 를 계속 주기 위해 사용된다.