리눅스 head 명령어: 파일의 시작 부분 확인하기

LinuxBeginner
지금 연습하기

소개

이 실습에서는 텍스트 파일의 앞부분을 미리 보는 데 유용한 리눅스의 head 명령어를 살펴봅니다. 여러분이 수많은 파일 속에서 중요한 정보를 빠르게 찾아내야 하는 디지털 탐정이 되었다고 상상해 보세요. head 명령어는 파일을 일일이 다 열어보지 않고도 파일의 시작 부분을 살짝 엿볼 수 있게 해주는 든든한 돋보기가 되어줄 것입니다.

우리는 바쁜 웹 서버에서 생성된 로그 파일들을 조사하는 상황을 가정해 보겠습니다. 여러분의 목표는 이 로그들을 효율적으로 검토하여 잠재적인 문제를 식별하고 통찰력을 얻는 것입니다. 이 실무적인 연습을 통해 head 명령어를 효과적으로 사용하는 방법을 익히고, 파일 탐색 작업을 훨씬 더 빠르고 효율적으로 수행할 수 있게 될 것입니다.

head 명령어의 기본 이해하기

먼저 간단한 로그 파일을 살펴보며 head가 어떻게 작동하는지 알아보겠습니다.

우선 프로젝트 디렉터리로 이동합니다.

cd /home/labex/project

이제 access.log라는 파일에 head 명령어를 사용해 보겠습니다.

head access.log

다음과 유사한 출력이 나타날 것입니다.

192.168.1.100 - - [01/Jan/2024:00:00:01 +0000] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [01/Jan/2024:00:00:02 +0000] "GET /style.css HTTP/1.1" 200 567
192.168.1.102 - - [01/Jan/2024:00:00:03 +0000] "GET /logo.png HTTP/1.1" 200 2345
192.168.1.103 - - [01/Jan/2024:00:00:04 +0000] "POST /login HTTP/1.1" 302 -
192.168.1.104 - - [01/Jan/2024:00:00:05 +0000] "GET /dashboard HTTP/1.1" 200 3456
192.168.1.105 - - [01/Jan/2024:00:00:06 +0000] "GET /api/user HTTP/1.1" 200 789
192.168.1.106 - - [01/Jan/2024:00:00:07 +0000] "GET /images/banner.jpg HTTP/1.1" 200 4567
192.168.1.107 - - [01/Jan/2024:00:00:08 +0000] "POST /comment HTTP/1.1" 201 -
192.168.1.108 - - [01/Jan/2024:00:00:09 +0000] "GET /search?q=linux HTTP/1.1" 200 2345
192.168.1.109 - - [01/Jan/2024:00:00:10 +0000] "GET /about HTTP/1.1" 200 1234

기본적으로 head는 파일의 처음 10 줄을 보여줍니다. 이 로그의 각 줄은 웹 서버에 대한 개별 요청을 나타내며, IP 주소, 타임스탬프, HTTP 메서드, 요청된 리소스, 상태 코드 및 응답 크기를 보여줍니다.

출력 줄 수 변경하기

때로는 10 줄이 너무 많거나 적을 수 있습니다. head가 표시하는 줄 수를 원하는 대로 조절하는 방법을 배워봅시다.

로그의 처음 5 줄만 보려면 -n 옵션을 사용합니다.

head -n 5 access.log

명령어를 실행하면 다음과 같이 출력됩니다.

192.168.1.100 - - [01/Jan/2024:00:00:01 +0000] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [01/Jan/2024:00:00:02 +0000] "GET /style.css HTTP/1.1" 200 567
192.168.1.102 - - [01/Jan/2024:00:00:03 +0000] "GET /logo.png HTTP/1.1" 200 2345
192.168.1.103 - - [01/Jan/2024:00:00:04 +0000] "POST /login HTTP/1.1" 302 -
192.168.1.104 - - [01/Jan/2024:00:00:05 +0000] "GET /dashboard HTTP/1.1" 200 3456

이 기능은 파일의 맨 앞부분에 있는 특정 정보만 확인하고 싶을 때 매우 유용합니다.

여러 파일 동시에 확인하기

파일 탐정으로서 여러 파일을 빠르게 훑어봐야 할 때가 많습니다. head 명령어를 사용하면 여러 파일의 시작 부분을 한 번에 확인할 수 있습니다.

access.logerror.log의 시작 부분을 함께 살펴보겠습니다.

head access.log error.log

다음과 같은 형식의 출력을 볼 수 있습니다.

==> access.log <==
192.168.1.120 - - [01/Jan/2024:00:00:53 +0000] "POST /about HTTP/1.1" 200 7616
192.168.1.147 - - [01/Jan/2024:00:00:45 +0000] "GET /dashboard HTTP/1.1" 200 7348
192.168.1.138 - - [01/Jan/2024:00:00:03 +0000] "DELETE /comment HTTP/1.1" 400 8341
192.168.1.138 - - [01/Jan/2024:00:00:31 +0000] "DELETE /about HTTP/1.1" 200 3254
192.168.1.122 - - [01/Jan/2024:00:00:15 +0000] "PUT /index.html HTTP/1.1" 500 6061
192.168.1.125 - - [01/Jan/2024:00:00:09 +0000] "DELETE /logo.png HTTP/1.1" 301 4916
192.168.1.148 - - [01/Jan/2024:00:00:33 +0000] "POST /admin/dashboard HTTP/1.1" 201 5546
192.168.1.146 - - [01/Jan/2024:00:00:56 +0000] "GET /images/banner.jpg HTTP/1.1" 301 2332
192.168.1.195 - - [01/Jan/2024:00:00:12 +0000] "DELETE /dashboard HTTP/1.1" 404 6740
192.168.1.136 - - [01/Jan/2024:00:00:18 +0000] "GET /login HTTP/1.1" 200 2374

==> error.log <==
[01/Jan/2024:00:01:23 +0000] [error] [client 192.168.1.150] File does not exist: /var/www/html/missing.html
[01/Jan/2024:00:02:34 +0000] [error] [client 192.168.1.151] PHP Parse error:  syntax error, unexpected ';' in /var/www/html/index.php on line 30
... (중략) ...

head가 각 파일의 출력을 헤더로 명확하게 구분해 주는 것을 알 수 있습니다. 이는 여러 파일의 시작 부분을 빠르게 비교해야 할 때 매우 유용합니다.

파이프와 함께 head 사용하기

숙련된 파일 탐정은 데이터를 더 효과적으로 필터링하고 분석하기 위해 여러 명령어를 조합합니다. head 명령어는 파이프 (|) 와 함께 사용하기에 매우 적합하여 다른 명령어들과 연결해 사용할 수 있습니다.

예를 들어, access.log의 처음 3 줄만 보되, 타임스탬프와 요청된 리소스 부분만 추출하고 싶다고 가정해 봅시다. cut 명령어와 head를 조합하여 이를 수행할 수 있습니다.

cut -d '"' -f2 access.log | head -n 3

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

POST /about HTTP/1.1
GET /dashboard HTTP/1.1
DELETE /comment HTTP/1.1

이 명령어의 작동 원리는 다음과 같습니다.

  1. cut -d '"' -f2 access.log: 각 줄을 큰따옴표 (") 기준으로 나누고, HTTP 요청 내용이 포함된 두 번째 필드를 선택합니다.
  2. |: cut 명령어의 출력 결과를 head 명령어로 전달합니다.
  3. head -n 3: 전달받은 내용 중 처음 3 줄만 표시합니다.

이러한 조합을 통해 로그 항목의 특정 부분에 빠르게 집중할 수 있어 조사 효율이 높아집니다.

head 와 grep 으로 조사하기

이번에는 head를 또 다른 강력한 명령어인 grep과 결합하여 로그에서 특정 패턴을 검색해 보겠습니다.

/admin 페이지와 관련된 비정상적인 활동 보고를 받았다고 가정해 봅시다. 액세스 로그에서 /admin이 포함된 처음 몇 개의 항목을 확인하고 싶을 때 다음과 같이 입력합니다.

grep "/admin" access.log | head -n 3

출력 결과는 다음과 유사할 것입니다.

192.168.1.148 - - [01/Jan/2024:00:00:33 +0000] "POST /admin/dashboard HTTP/1.1" 201 5546
192.168.1.115 - - [01/Jan/2024:00:00:22 +0000] "PUT /admin HTTP/1.1" 302 1113
192.168.1.163 - - [01/Jan/2024:00:00:56 +0000] "POST /admin/dashboard HTTP/1.1" 301 815

이 명령어는 다음 과정을 거칩니다.

  1. grep "/admin" access.log: access.log 파일에서 "/admin" 문자열이 포함된 줄을 찾습니다.
  2. |: grep의 검색 결과를 head 명령어로 보냅니다.
  3. head -n 3: 검색된 결과 중 처음 3 줄만 보여줍니다.

이 조합을 사용하면 방대한 로그 파일에서 관련 있는 항목만 빠르게 추려내어 조사를 더 정밀하고 효율적으로 진행할 수 있습니다.

head 로 대용량 파일 탐색하기

파일 탐정은 종종 매우 큰 로그 파일을 다루게 됩니다. head 명령어는 파일 전체 내용을 메모리에 로드하지 않고도 파일의 시작 부분을 빠르게 확인할 수 있어 대용량 파일을 다룰 때 특히 유용합니다.

우리가 사용 중인 access.log 파일이 실제로는 훨씬 더 큰 대용량 파일이라고 가정하고 실습해 보겠습니다.

먼저 파일의 크기를 확인해 봅니다.

ls -lh access.log

이제 head를 사용하여 처음 15 줄을 확인해 보겠습니다.

head -n 15 access.log

이전과 비슷하지만 10 줄 대신 15 줄이 출력되는 것을 볼 수 있습니다.

head 명령어가 대용량 파일 처리에 가치 있는 이유는 다음과 같습니다.

  1. 속도가 빠릅니다: 파일의 시작 부분만 읽기 때문에 파일이 아무리 커도 순식간에 작업이 완료됩니다.
  2. 메모리 효율적입니다: 파일 전체를 메모리에 올릴 필요가 없습니다.
  3. 빠른 미리보기를 제공합니다: 파일을 통째로 열지 않고도 파일의 구조와 내용을 즉시 파악할 수 있습니다.

요약

이 실습에서는 파일의 시작 부분을 빠르게 확인하는 강력한 도구인 head 명령어를 살펴보았습니다. 우리가 배운 내용은 다음과 같습니다.

  1. head를 사용하여 기본적으로 파일의 처음 10 줄을 확인하는 방법.
  2. -n 옵션을 사용하여 표시할 줄 수를 조절하는 방법.
  3. 여러 파일을 동시에 확인하는 방법.
  4. 파이프를 사용하여 headcut, grep 등 다른 명령어와 조합하는 방법.
  5. 대용량 파일을 효율적으로 다루기 위해 head를 활용하는 방법.

이 실습에서 다루지 않은 추가적인 head 매개변수들:

  • -c: 줄 단위 대신 처음 몇 바이트를 지정하여 출력합니다.
  • -q: 여러 파일을 확인할 때 파일 이름 헤더를 표시하지 않습니다.
  • -v: 여러 파일을 확인할 때 항상 파일 이름 헤더를 표시합니다.