콘텐츠로 이동

Linux 사용자를 위한 고급 명령

고급 명령어는 기본 명령어에 익숙해진 후에 특수한 상황에서 더 큰 맞춤 및 제어를 제공합니다.


목표: 이 문서에서는 미래의 Linux 관리자가 다음을 수행하는 방법을 배웁니다:

✔ 이전 장에서 다루지 않은 몇 가지 유용한 명령어 ✔ 일부 고급 명령어

🏁 사용자 명령어, linux

지식: ⭐
복잡성: ⭐ ⭐

소요 시간: 20분


vi 명령어

uniq 명령은 특히 로그 파일 분석을 위해 sort 명령과 함께 사용되는 매우 강력한 명령어입니다. 중복 항목을 제거하여 항목을 정렬하고 표시할 수 있습니다.

uniq 명령의 작동 방식을 설명하기 위해, 이름 목록을 포함하는 firstnames.txt 파일을 사용하겠습니다.

antoine
xavier
steven
patrick
xavier
antoine
antoine
steven

참고

uniq는 연속된 줄만 비교하기 때문에 실행하기 전에 입력 파일을 정렬해야 합니다.

인수가 없으면 uniq 명령은 firstnames.txt 일에서 서로 뒤따르는 동일한 줄을 표시하지 않습니다:

$ sort firstnames.txt | uniq
antoine
patrick
steven
xavier

한 번만 나타나는 행만 표시하려면 -u 옵션을 사용하세요:

$ sort firstnames.txt | uniq -u
patrick

반대로 파일에 최소한 두 번 이상 나타나는 행만 표시하려면 -d 옵션을 사용하세요:

$ sort firstnames.txt | uniq -d
antoine
steven
xavier

한 줄 또는 n개의 줄 삭제(잘라내기):

$ sort firstnames.txt | uniq -D
antoine
antoine
antoine
steven
steven
xavier
xavier

마지막으로 각 행의 발생 횟수를 계산하려면 -c 옵션을 사용하세요:

$ sort firstnames.txt | uniq -c
      3 antoine
      1 patrick
      2 steven
      2 xavier
$ sort firstnames.txt | uniq -cd
      3 antoine
      2 steven
      2 xavier

command 모드

xargs 명령을 사용하면 표준 입력에서 명령줄을 구성하고 실행하는 데 사용됩니다.

xargs 명령어는 공백이나 개행 문자로 구분된 인수를 표준 입력에서 읽고, 초기 인수 다음에 표준 입력에서 읽은 인수를 사용하여 한 번 이상 명령(기본적으로 /bin/echo) 실행합니다.

첫 번째 간단한 예제는 다음과 같습니다:

$ xargs
use
of
xargs
<CTRL+D>
use of xargs

xargs 명령은 표준 stdin 입력에서 입력을 기다립니다. 3줄이 입력됩니다. 사용자 입력의 끝은 CTRL+D 키 조합으로 xargs에 지정됩니다. 그런 다음 xargs는 기본 명령 echo를 실행하고 사용자 입력에 해당하는 세 개의 인수를 따릅니다:

$ echo "use" "of" "xargs"
use of xargs

xargs에 의해 실행될 명령을 지정할 수 있습니다.

다음 예에서 xargs는 표준 입력에 지정된 폴더 집합에서 ls -ld 명령을 실행합니다.

$ xargs ls -ld
/home
/tmp
/root
<CTRL+D>
drwxr-xr-x. 9 root root 4096  5 avril 11:10 /home
dr-xr-x---. 2 root root 4096  5 avril 15:52 /root
drwxrwxrwt. 3 root root 4096  6 avril 10:25 /tmp

실제로 xargs 명령은 ls -ld /home /tmp /root 명령을 실행했습니다.

find 명령어와 같이 여러 인수를 허용하지 않는 명령어의 경우 어떻게 될까요?

$ xargs find /var/log -name
*.old
*.log
find: paths must precede expression: *.log

xargs 명령어는 -name 옵션 뒤에 여러 인수로 find 명령어를 실행하려고 시도했으므로 find가 오류를 생성했습니다:

$ find /var/log -name "*.old" "*.log"
find: paths must precede expression: *.log

이 경우 xargs 명령어를 강제로 find 명령어를 여러 번 실행해야 합니다(표준 입력으로 입력된 한 줄당 한 번씩 입력됨). -L 옵션 뒤에 정수를 사용하면 한 번에 명령으로 처리할 최대 항목 수를 지정할 수 있습니다.

$ xargs -L 1 find /var/log -name
*.old
/var/log/dmesg.old
*.log
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>

두 인수를 동일한 줄에 지정하려면 -n 1 옵션을 사용하세요:

$ xargs -n 1 find /var/log -name
*.old *.log
/var/log/dmesg.old
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>

검색을 기반으로 한 tar를 사용한 백업 사례 연구:

$ find /var/log/ -name "*.log" -mtime -1 | xargs tar cvfP /root/log.tar
$ tar tvfP /root/log.tar
-rw-r--r-- root/root      1720 2017-04-05 15:43 /var/log/boot.log
-rw-r--r-- root/root    499270 2017-04-06 11:01 /var/log/audit/audit.log

xargs 명령어의 특징은 입력 인수를 호출된 명령의 끝에 놓는다는 점입니다. 위의 예제에서는 전달된 파일이 아카이브에 추가될 파일 목록을 형성하므로 이 기능이 매우 잘 작동합니다.

cp 명령의 예를 들어 파일 목록을 디렉토리에 복사하려는 경우 해당 파일 목록이 명령 끝에 추가됩니다. 그러나, cp 명령은 이 명령의 끝에 있어야 합니다. 이렇게 하려면 -I 옵션을 사용하여 입력 인수를 라인의 끝이 아닌 다른 위치에 놓을 수 있습니다.

$ find /var/log -type f -name "*.log" | xargs -I % cp % /root/backup

-I 옵션을 사용하면 xargs에 대한 입력 파일을 배치할 문자(위 예에서는 % 문자)를 지정할 수 있습니다.

yum-utils 패키지

yum-utils 패키지는 다양한 작성자에 의해 yum을 위해 만들어진 유틸리티 모음입니다. 이를 사용하면 yum을 더 쉽고 강력하게 사용할 수 있습니다.

참고

Rocky Linux 8에서 yumdnf로 대체된 반면, 패키지 이름은 yum-utils로 유지되며 dnf-utils로도 설치할 수 있습니다. 이들은 DNF 위에 CLI shim으로 구현된 클래식 YUM 유틸리티로 yum-3와 하위 호환성을 유지합니다.

다음은 이러한 유틸리티의 몇 가지 예입니다:

  • vimtutor 명령

repoquery 명령은 리포지토리의 패키지를 쿼리하는 데 사용됩니다.

예시:

  • 패키지의 종속성(설치되었거나 설치되지 않은 소프트웨어 패키지일 수 있음)을 표시합니다. 이는 dnf deplist <package-name>에 해당합니다.

    repoquery --requires <package-name>
    

  • 설치된 패키지에서 제공한 파일 표시합니다.(설치되지 않은 패키지에서는 작동하지 않음), 이는 rpm -ql <package-name>에 해당합니다.

    $ repoquery -l yum-utils
    /etc/bash_completion.d
    /etc/bash_completion.d/yum-utils.bash
    /usr/bin/debuginfo-install
    /usr/bin/find-repos-of-install
    /usr/bin/needs-restarting
    /usr/bin/package-cleanup
    /usr/bin/repo-graph
    /usr/bin/repo-rss
    /usr/bin/repoclosure
    /usr/bin/repodiff
    /usr/bin/repomanage
    /usr/bin/repoquery
    /usr/bin/reposync
    /usr/bin/repotrack
    /usr/bin/show-changed-rco
    /usr/bin/show-installed
    /usr/bin/verifytree
    /usr/bin/yum-builddep
    /usr/bin/yum-config-manager
    /usr/bin/yum-debug-dump
    /usr/bin/yum-debug-restore
    /usr/bin/yum-groups-manager
    /usr/bin/yumdownloader
    …
    
  • yumdownloader 명령:

yumdownloader 명령은 리포지토리에서 RPM 패키지를 다운로드합니다. dnf download --downloadonly --downloaddir ./ package-name과 동일한 기능입니다.

참고

이 명령은 몇 rpm의 로컬 저장소를 빠르게 구축하는 데 매우 유용합니다!

예시: yumdownloadersamba rpm 패키지와 해당 종속성을 모두 다운로드합니다:

$ yumdownloader --destdir /var/tmp --resolve samba
or
$ dnf download --downloadonly --downloaddir /var/tmp  --resolve  samba
옵션 설명
--destdir 다운로드한 패키지는 지정된 폴더에 저장됩니다.
--resolve 패키지 종속성도 다운로드합니다.

psmisc 패키지

psmisc 패키지에는 시스템 프로세스를 관리하기 위한 유틸리티가 포함되어 있습니다:

  • pstree: pstree 명령은 시스템의 현재 프로세스를 트리와 같은 구조로 표시합니다.
  • killall: killall 명령은 이름으로 식별된 모든 프로세스에 킬 신호를 보냅니다.
  • fuser: fuser 명령은 지정된 파일 또는 파일 시스템을 사용하는 프로세스의 PID를 식별합니다.

예시:

$ pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]
# killall httpd

/etc/httpd/conf/httpd.conf 파일에 액세스하는 프로세스를 종료합니다(옵션 -k).

# fuser -k /etc/httpd/conf/httpd.conf

n번째 줄로 이동:

watch 명령은 주기적으로 명령어를 실행하고 결과를 터미널에 전체 화면으로 표시합니다.

-n 옵션을 사용하면 각 명령 실행 간격을 초 단위로 지정할 수 있습니다.

참고

watch명령을 종료하려면 다음 키를 입력해야 합니다: CTRL+C 입력 후 프로세스를 종료합니다.

예시:

  • /etc/passwd 파일의 끝을 매 5초마다 표시합니다:
$ watch -n 5 tail -n 3 /etc/passwd

결과:

Every 5,0s: tail -n 3 /etc/passwd                                                                                                                                rockstar.rockylinux.lan: Thu Jul  1 15:43:59 2021

sssd:x:996:993:User for sssd:/:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • 폴더에 있는 파일 수를 모니터링합니다:
$ watch -n 1 'ls -l | wc -l'
  • 시계 표시:
$ watch -t -n 1 date