본문 바로가기

CentOS/Study

[Study15]Linux에서 파일 내용을 조작하고 보기 위한 유용한 명령 - head / tail

반응형

head 명령어

head 명령어는 파일의 앞부분을 출력하는 명령어입니다.

이 명령어는 대용량 파일에서 앞부분만 빠르게 확인할 수 있어 매우 유용합니다.

head 명령어를 옵션 없이 사용하면, 기본적으로 파일의 처음 10줄을 출력합니다.

head 명령어는 -n 옵션 다음에 오는 숫자를 사용하여 출력할 행 수를 지정할 수 있습니다.

-c 옵션 다음에 오는 숫자 byte 수 만큼만 출력할 수 있습니다.

head 명령어는 다음과 같은 형식으로 사용할 수 있습니다.

 

[명령어 형식]

# head /etc/passwd             기본적으로 처음 10줄을 출력합니다.
# head -n 5 /etc/passwd/*      출력할 행 수를 지정합니다 (기본값은 10줄).
# head -c 10 /etc/passwd/*     -c 옵션 다음에 오는 숫자 byte 수 만큼만 출력합니다.

 

따라서, head 명령어는 파일 내용을 미리 살펴볼 때 유용합니다.

또한, -n 옵션을 사용하여 원하는 행 수만 출력할 수 있습니다.

-c 옵션을 사용하면 byte 수만큼 출력할 수 있습니다.

 

[명령어 옵션]

옵션 설명
-n (숫자) 파일의 처음부터 출력할 행수를 지정합니다
-c (숫자) byte 수 만큼만 출력합니다

 

"head -n #" 실습

유닉스 기반 운영 체제에서 head 명령어는 파일의 처음 몇 줄을 표시하는 데 사용됩니다.

이 명령어는 파일의 시작 부분만 표시하기 때문에 대용량 파일의 내용을 미리보기에 자주 사용됩니다.

가장 기본적인 head 명령의 사용 방법은 다음과 같이 파일 이름을 지정하는 것입니다.

 

# head /path/to/file

기본적으로 이 명령은 파일의 처음 10 줄을 표시합니다.

하지만 -n 옵션 뒤에 숫자를 지정하여 표시할 줄 수를 변경할 수 있습니다.

예를 들어 파일의 처음 5 줄을 표시하려면 다음 명령어를 사용할 수 있습니다.

 

# head -n 5 /path/to/file

n 옵션 외에도 head 명령은 c 옵션을 지원합니다.

이 옵션을 사용하면 처음 몇 바이트를 표시할 수 있습니다.

예를 들어 파일의 처음 10바이트를 표시하려면 다음 명령어를 사용할 수 있습니다.

 

# head -c 10 /path/to/file

head 명령어는 다양한 상황에서 유용하게 사용될 수 있습니다.

예를 들어 대용량 로그 파일을 다루는 경우 head 명령어를 사용하여 최신 항목을 빠르게 확인할 수 있습니다.

또한 구성 파일을 다루는 경우 head 명령어를 사용하여 파일을 미리보기하고 올바른 섹션을 편집하는지 확인할 수 있습니다.

요약하면, head 명령어는 유닉스 기반 시스템에서 파일의 내용을 미리보는 데 유용한 간단하고 유용한 도구입니다.

 

head 명령어를 이용한 프로세스의 헤더 부분 출력

# ps -ef
# ps -ef | more
# ps -ef | grep ssh
root       1488      1  0 16:51 ?        00:00:00 /usr/sbin/sshd -D
root       4092   1488  0 18:58 ?        00:00:00 sshd: root@pts/0
root       4354   4217  0 19:00 ?        00:00:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root       6513   1488  0 19:48 ?        00:00:00 sshd: root@pts/1
root       7119   6518  0 20:30 pts/1    00:00:00 grep --color=auto ssh

위 출력 결과에서 각 내용이 무엇을 의미하는지 정확하게 파악하기 어려웠습니다.

 

다음 명령어를 실행하여 출력 결과를 분할할 수 있습니다.

# ps -ef | head –1
UID        PID  PPID  C STIME TTY          TIME CMD

위 명령어는 출력 결과의 첫 줄만 보여줍니다.

 

다음 명령어를 실행하면, sshd 프로세스 관련 정보만 출력됩니다.

# ps -ef | grep sshd
root       1266      1  0 12:38 ?        00:00:00 /usr/sbin/sshd -D
root       7878   1266  0 14:24 ?        00:00:00 sshd: root@pts/1
root       8047   7880  0 14:32 pts/1    00:00:00 grep --color=auto sshd

위 명령어는 sshd 관련 프로세스의 정보만 출력합니다.

 

두 명령어를 한번에 실행하고 싶다면, 다음 명령어를 사용하실 수 있습니다.

# ps -ef | head -1 ; ps -ef | grep sshd

위 명령어는 첫번째 명령어의 결과와 두번째 명령어의 결과를 한번에 출력합니다.

 

이를 사용하기 편리하도록 다음 명령어를 실행하여, alias를 추가합니다.

# alias pps='ps -ef | head -1 ; ps -ef | grep $1'
# pps sshd
UID         PID   PPID  C STIME TTY          TIME CMD
root       1266      1  0 12:38 ?        00:00:00 /usr/sbin/sshd -D
root       7878   1266  0 14:24 ?        00:00:00 sshd: root@pts/1
root       8047   7880  0 14:32 pts/1    00:00:00 grep --color=auto sshd

위 명령어는 pps을 실행한 후 sshd를 첫번째 인자로 넘겨주면, sshd 프로세스 정보만 출력됩니다.

 

이를 편하게 사용하기 위해, ~/.bashrc 파일에 다음 alias를 추가합니다.

alias pps='ps -ef | head -1 ; ps -ef | grep $1'

 

변경사항을 적용하기 위해 다음 명령어를 실행합니다.

# . ~/.bashrc

 

이후 pps 명령어를 사용하여 sshd 프로세스 정보를 쉽게 확인할 수 있습니다.

# pps sshd

 

Unix 계열의 초창기 head와 유사한 명령어

# sed 5q /etc/passwd        /* 파일의 5줄을 출력하고, 끝내라(q)는 뜻 */
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# sed -n '1,5p' /etc/passwd

Unix 계열에서는 파일의 내용을 확인할 때, head 명령어를 이용합니다.

하지만, 초창기 Unix 계열에서는 head 명령어가 없었습니다.

이때, sed 명령어를 이용하여 파일의 내용을 확인할 수 있습니다.

sed 명령어를 이용하면, 파일의 원하는 부분만 출력할 수 있습니다.

위 코드에서는 /etc/passwd 파일에서 5줄만 출력하거나 처음부터 5줄까지 출력하는 방법을 보여주고 있습니다.

 

tail 명령어

tail은 Unix 및 Unix 계열 시스템에서 사용하는 프로그램으로, 주어진 텍스트 파일이나 데이터의 마지막 몇 줄을 출력하는 데 사용됩니다.

파일의 끝 부분만 출력하고자 할 때 유용하며, 기본적으로 문서의 마지막 10줄을 보여줍니다.

그러나 tail 명령어는 다양한 옵션을 사용할 수 있습니다.

 

예를 들어, tail 명령어에 -f 옵션을 사용하면 파일의 끝에 새로운 데이터가 추가될 때마다 출력이 갱신되어 파일을 실시간으로 모니터링할 수 있습니다.

또한, tail 명령어에 -n 옵션을 사용하면 파일의 마지막 n개 줄을 출력할 수 있습니다.

-n 옵션 뒤에 출력할 줄 수를 지정할 수 있습니다.

 

예를 들어, tail -n 20 /var/log/messages 명령어를 사용하면 /var/log/messages 파일의 마지막 20줄을 출력할 수 있습니다.

추가로, 여러 파일을 한꺼번에 확인할 수 있는 옵션도 제공됩니다.

여러 파일을 지정하면 tail 명령어는 지정된 파일의 마지막 줄부터 출력합니다.

 

예를 들어, tail -f /var/log/messages /var/log/syslog 명령어를 사용하면 /var/log/messages와 /var/log/syslog 파일의 마지막에 추가된 내용을 실시간으로 확인할 수 있습니다.

 

[명령어 형식]

# tail /etc/passwd     (# tail -10 /etc/passwd, # taill -n 10 /etc/passwd)
# tail -5 /etc/passwd
# tail -n +5 /etc/passwd < 상단의 라인에서 4개의 라인을 제거하고 나머지를 출력

# tail -f /var/log/messages

tail 명령어를 사용하여 파일의 끝 부분을 출력하는 방법을 배웠습니다.

이 명령어는 파일 모니터링 및 파일 내용 확인에 유용합니다.

또한, 여러 파일을 확인하거나 원하는 줄 수만큼 출력할 수 있는 다양한 옵션도 제공됩니다.

 

[명령어 옵션]

옵션 설명
-c (숫자) 끝에서부터 지정된 수만큼의 바이트에 해당하는 정보를 보여줍니다.
-f 파일의 크기가 변할 때마다 추가된 정보를 출력합니다.
-F -f 옵션의 경우, 파일 크기가 변하여 5Mbytes 정도 되면 확장자에 숫자를 붙여 백업 파일을 생성하고, 다시 본 파일은 0byte부터 저장됩니다. 그래서 tail -f 파일명으로 실행중인 명령이 멈춰버린다는 문제가 생겨 재실행시켜줘야 하는 번거로움이 있습니다. -F 옵션을 사용하면 이런 재실행 문제 및 용량 변화로 인한 문제를 걱정하지 않아도 됩니다. -f 옵션 때와 마찬가지로 Ctrl+C로 빠져나올 수 있습니다.
-(숫자) 끝에서부터 지정된 수만큼의 줄을 보여줍니다.
-q 출력 결과에서 맨 윗줄에 입력 파일명을 표시하지 않게 설정합니다.
-v -q와 반대로 출력 결과에서 맨 윗줄에 입력 파일명을 항상 표시해줍니다.
--help 도움말을 보여줍니다.
--version 버전 정보를 보여줍니다.

 

tail 명령어의 기본 사용법

tail 명령어는 파일의 마지막 부분을 보여주는 데 사용하는 명령어입니다.

특히 로그 파일이나 파일의 변경 내용을 실시간으로 모니터링할 때 유용합니다.

다음은 tail 명령어를 사용하는 몇 가지 예시입니다:

# /etc/passwd 파일의 마지막 5줄을 출력
tail -n 5 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user01:x:1000:1000:user01:/home/user01:/bin/bash
fedora:x:1001:1001::/home/fedora:/bin/bash

# /etc/passwd 파일의 마지막 15바이트를 출력
tail -c 15 /etc/passwd

# /etc/passwd 파일의 마지막 5줄을 출력
tail -n 5 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user01:x:1000:1000:user01:/home/user01:/bin/bash
fedora:x:1001:1001::/home/fedora:/bin/bash

# /etc/passwd 파일의 마지막 15바이트를 출력
tail -c 15 /etc/passwd

첫 번째 예시에서는 명령어가 /etc/passwd 파일의 마지막 5줄을 출력합니다.

/etc/passwd 파일은 사용자 계정 정보를 포함하고 있습니다.

두 번째 예시에서는 명령어가 동일한 파일의 마지막 15바이트를 출력합니다.

tail 명령어는 여러 가지 옵션과 인수와 함께 사용할 수 있습니다.

예를 들어 -f 옵션을 사용하여 파일의 변경 내용을 실시간으로 모니터링할 수 있으며, -grep 옵션을 사용하여 특정 패턴과 일치하는 줄을 출력할 수도 있습니다.

요약하자면, tail 명령어는 Unix 및 Linux 시스템에서 파일을 다룰 때 유용한 도구입니다.

기본적인 사용법은 간단하지만 다양한 옵션과 인수를 사용하여 다양한 용도로 커스터마이징할 수 있습니다.

 

로그 파일 모니터링(EX: tail -f CMD)

tail은 실시간으로 파일의 변화를 감지할 수 있게 해주는 -f 옵션이라는 특별한 명령행 옵션을 가지고 있다.

마지막 몇줄을 출력하고 끝내는 것에 그치지 않고, tail은 그 줄들을 표시하고 파일을 감독한다.

새 줄들이 다른 프로세스에 의해 그 파일에 추가될 때, tail의 -f옵션은 그 표시또한 실시간으로 업데이트한다.

이 옵션은 특히 로그파일(입출력정보파일)들을 감독할때 유용하다.

다음의 명령구문은 messages라는 파일의 마지막 열줄을 보여주고 새 줄들이 추가되면 그 줄들을 추가하여 보여준다.

 

telnet 서비스 Open 방법(일반사용자)

파일이 30 라인으로 되어져 있는데 파일 중간의 10라인만 출력할 수 있는지에 대한 것입니다.

이를 해결하기 위해서는 head와 tail 명령어를 사용하면 됩니다.

하지만, 이 명령어에 대한 자세한 설명이 없어서, 명령어를 사용하기 어렵다는 피드백을 받았습니다.

head 명령어는 지정한 파일의 앞부분을 출력하는 명령어입니다.

이때, 출력할 라인 수를 지정할 수 있습니다. tail 명령어는 지정한 파일의 뒷부분을 출력하는 명령어입니다.

이때, 출력할 라인 수도 지정할 수 있습니다.

따라서, head와 tail 명령어를 조합하여 파일 중간의 10라인을 출력하는 방법은 다음과 같습니다.

# cp /etc/passwd /test/filename
# cd /test
# head -n 20 filename | tail -n 10

위의 명령어는 /etc/passwd 파일의 20번째 라인부터 10개의 라인을 출력하는 명령어입니다.

이를 사용하면, 파일이 30 라인으로 되어져 있는 경우, 파일 중간의 10라인만 출력할 수 있습니다.

 

또한, head와 tail 명령어를 사용하는 방법 외에도 nl 명령어를 사용하여 파일에 번호를 매길 수도 있습니다.

이때, nl 명령어를 사용하여 파일에 번호를 매긴 다음, head와 tail 명령어를 사용하여 파일 중간의 10라인을 출력할 수 있습니다.

# cp /etc/passwd /test/filename
# cd /test
# nl filename | head -n 20 | tail -n 10

 

출력결과는 다음과 같습니다.

    11  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    12  operator:x:11:0:operator:/root:/sbin/nologin
    13  games:x:12:100:games:/usr/games:/sbin/nologin
    14  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    15  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    16  nobody:x:99:99:Nobody:/:/sbin/nologin
    17  vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    18  apache:x:48:48:Apache:/var/www:/sbin/nologin
    19  exim:x:93:93::/var/spool/exim:/sbin/nologin
    20  rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin

따라서, 사용자분이 원하시는 목적에 맞게 head와 tail 명령어, nl 명령어를 사용하시면 됩니다.

 

서버를 실시간으로 모니터링

[TERM1] # top                        (# gnome-system-monitor)
[TERM2] # tail -f /var/log/messages  (# gnome-system-log)

# tail -f /var/log/messages | grep -i DHCP
# tail -f /var/log/messages | grep -i DNS
# tail -f /var/log/messages | grep oracle
# tail -f /var/log/messages | grep wasuser  (특정 서비스에 대한 모니터링)

또 다른 활용방안

# cat /var/log/messages | egrep –i '(warn|err|alert|emerg)'

서버를 운영하다 보면 갑자기 서비스가 다운되어 곤란한 경우가 많습니다.

이를 방지하기 위해 실시간으로 서버를 모니터링하는 것이 중요합니다.

서버 모니터링을 위해 다음과 같은 방법을 사용할 수 있습니다.

  • top 명령어를 사용하여 프로세스의 상태를 확인합니다. 이를 통해 CPU, 메모리 등의 상태를 확인할 수 있습니다.
  • tail -f /var/log/messages 명령어를 사용하여 로그 파일의 내용을 실시간으로 확인합니다. 이를 통해 DHCP, DNS, 오라클 등 특정 서비스에 대한 모니터링이 가능합니다.
  • 로그 파일에서 특정 문자열을 검색하여 원하는 내용만 필터링할 수 있습니다. 예를 들어, tail -f /var/log/messages | grep -i DHCP 명령어를 사용하면 DHCP 서비스에 대한 로그만 필터링할 수 있습니다.
  • egrep –i '(warn|err|alert|emerg)' 명령어를 사용하여 로그 파일에서 경고, 오류, 알림, 긴급 상황과 관련된 내용을 필터링할 수 있습니다.

이러한 서버 모니터링 방법을 사용하여 서버의 상태를 실시간으로 파악함으로써, 서버 다운 등의 문제를 예방하고 조치할 수 있습니다.

반응형