Linux에서 tail 명령을 사용하는 방법

Linux의 tail 명령어는 파일의 끝부분 데이터를 보여줍니다. 실시간으로 파일에 추가되는 내용을 감시하는 기능도 갖추고 있습니다. 이 글에서는 tail 명령어의 다양한 활용법을 살펴보겠습니다.

tail 명령, 여전히 유용한가?

tail 명령어는 파일의 끝부분 데이터를 표시하는 데 특화되어 있습니다. 일반적으로 새 데이터는 파일의 끝에 추가되기 때문에, tail 명령어를 활용하면 파일에 가장 최근에 추가된 내용을 빠르게 확인할 수 있습니다. 또한, 파일 내용을 실시간으로 감시하면서, 새로운 텍스트가 추가될 때마다 그 내용을 바로 보여줄 수 있습니다. 이러한 기능은 로그 파일을 모니터링하는 데 매우 효과적입니다.

최근 많은 Linux 배포판에서 systemd라는 시스템 및 서비스 관리자를 사용하고 있습니다. systemd는 부팅 시 가장 먼저 실행되는 프로세스로, 프로세스 ID 1을 가지며, 모든 다른 프로세스의 부모 역할을 합니다. 과거에는 초기화 시스템이 이러한 역할을 담당했습니다.

systemd 도입과 함께 시스템 로그 파일 형식에도 변화가 생겼습니다. 더 이상 일반 텍스트 형식이 아닌, systemd에 의해 바이너리 형식으로 저장됩니다. 이러한 로그 파일을 확인하려면 journalctl 유틸리티를 사용해야 합니다. 반면, tail 명령어는 일반 텍스트 형식의 파일에서만 작동하기 때문에 바이너리 파일에는 사용할 수 없습니다. 그렇다면 tail 명령어는 더 이상 문제 해결에 유용하지 않은 걸까요? 꼭 그렇지만은 않습니다.

실시간 업데이트 표시 외에도 tail 명령어는 여전히 다양한 용도로 활용 가능합니다. 특히, 시스템에서 생성되지 않지만 일반 텍스트로 저장되는 로그 파일이 많습니다. 예를 들어, 애플리케이션에서 생성되는 로그 파일은 여전히 일반 텍스트 형식을 유지하고 있습니다.

tail 명령어 사용법

tail 명령어에 파일 이름을 전달하면, 해당 파일의 마지막 10줄이 출력됩니다. 여기서는 예시로 정렬된 단어 목록이 포함된 파일을 사용합니다. 각 줄은 번호가 매겨져 있어 다양한 옵션이 어떻게 적용되는지 쉽게 확인할 수 있습니다.

tail word-list.txt

다른 줄 수를 보고 싶다면 -n 옵션을 사용하면 됩니다.

tail -n 15 word-list.txt

실제로는 -n을 생략하고 숫자만 사용하여 줄 수를 지정할 수 있습니다. 이때, 하이픈과 숫자 사이에 공백이 없어야 합니다. 기술적으로, 이러한 형식은 더 이상 권장되지 않지만, 매뉴얼 페이지에도 여전히 언급되어 있으며 실제로도 작동합니다.

tail -12 word-list.txt

여러 파일에 tail 적용하기

tail 명령어를 사용하면 여러 파일의 끝부분을 동시에 확인할 수 있습니다. 명령줄에 여러 파일 이름을 나열하기만 하면 됩니다.

tail -n 4 list-1.txt list-2.txt list-3.txt

각 파일에서 출력된 줄이 어느 파일에 속하는지 알 수 있도록 파일 이름이 헤더로 표시됩니다.

파일 시작 부분부터 줄 출력하기

+ 기호(시작부터 계산)를 수정자로 사용하면, 지정된 줄 번호부터 파일의 끝까지 내용을 출력할 수 있습니다. 만약 파일이 매우 길고 출력하려는 줄이 파일 시작 부분에 가깝다면, 터미널 창에 많은 양의 내용이 출력될 수 있습니다. 이런 경우, tail 명령어의 출력을 less 명령어로 파이프하는 것이 좋습니다.

tail +440 list-1.txt

less 명령어를 사용하면 텍스트를 편리하게 페이지 단위로 탐색할 수 있습니다.

해당 파일은 총 20,445줄로 구성되어 있기 때문에, 위 명령은 -6 옵션을 사용하는 것과 동일한 결과를 보여줍니다.

tail +20440 list-1.txt

바이트 단위로 tail 사용하기

-c 옵션(바이트)을 사용하면, 줄 단위 대신 바이트 단위로 오프셋을 지정할 수 있습니다. 이 기능은 텍스트 파일이 고정된 크기의 레코드로 구성되어 있을 때 유용합니다. 줄바꿈 문자는 1바이트로 계산됩니다. 다음 예시에서는 파일의 마지막 93바이트를 출력합니다.

tail -c 93 list-2.txt

-c 옵션과 함께 + 기호(파일 시작부터 계산)를 사용하면, 파일 시작부터 지정된 바이트 오프셋까지 내용을 출력할 수 있습니다.

tail -c +351053 list-e.txt

tail 명령어와 파이프

앞서 tail 명령어의 출력을 less 명령어로 파이프한 것을 확인했습니다. 다른 명령어의 출력을 tail 명령어로 파이프하는 것도 가능합니다.

수정 시간이 가장 오래된 5개의 파일 또는 폴더를 확인하려면, ls 명령어와 -t 옵션(수정 시간별 정렬)을 함께 사용하고, 그 출력을 tail 명령어로 파이프합니다.

ls -tl | tail -5

head 명령어는 파일의 시작 부분부터 텍스트 줄을 출력합니다. headtail 명령어를 함께 사용하면 파일의 특정 부분을 추출할 수 있습니다. 다음 예시는 head 명령어를 사용하여 파일의 처음 200줄을 추출한 뒤, 그 결과를 tail 명령어로 파이프하여 마지막 10줄을 출력합니다. 즉, 191번째 줄부터 200번째 줄까지의 내용을 보여줍니다.

head -n 200 list-1.txt | tail -10

다음 명령은 메모리 사용량이 가장 많은 5개의 프로세스를 보여줍니다.

ps aux | sort -nk +4 | tail -5

각 부분을 자세히 살펴보겠습니다.

ps 명령어는 실행 중인 프로세스에 대한 정보를 보여줍니다. 사용된 옵션은 다음과 같습니다.

  • a: 현재 사용자뿐만 아니라 모든 프로세스를 나열합니다.
  • u: 사용자 중심의 출력을 표시합니다.
  • x: TTY 내에서 실행되지 않는 프로세스를 포함하여 모든 프로세스를 나열합니다.

sort 명령어는 ps 명령어의 출력을 정렬합니다. 사용된 옵션은 다음과 같습니다.

  • n: 숫자 값으로 정렬합니다.
  • k +4: 네 번째 열을 기준으로 정렬합니다.

마지막으로 tail -5 명령어는 정렬된 출력에서 마지막 5개의 프로세스를 출력합니다. 즉, 메모리 사용량이 가장 많은 5개의 프로세스를 보여줍니다.

실시간으로 파일 추적하기

tail 명령어를 사용하면 파일(일반적으로 로그 파일)에 추가되는 새로운 내용을 실시간으로 추적할 수 있습니다. 명령줄에 파일 이름을 입력하고 -f 옵션(follow)을 사용하면 됩니다.

tail -f geek-1.log

로그 파일에 새로운 내용이 추가될 때마다, tail 명령어는 터미널 창에 그 내용을 실시간으로 업데이트하여 보여줍니다.

출력되는 내용을 필터링하여 특정 키워드가 포함된 줄만 표시할 수도 있습니다. 다음 예시에서는 grep 명령어를 사용하여 “average” 단어가 포함된 줄만 보여줍니다.

tail -f geek-1.log | grep average

여러 파일의 변경 사항을 추적하려면, 명령줄에 여러 파일 이름을 입력합니다.

tail -f -n 5 geek-1.log geek-2.log

각 항목은 텍스트의 출처를 알려주는 헤더와 함께 출력됩니다.

새로운 내용이 파일에 추가될 때마다 화면이 업데이트됩니다. 업데이트 간격을 지정하려면 -s 옵션(sleep interval)을 사용합니다. 다음 예시에서는 tail 명령어가 파일 검사 사이에 5초를 기다리도록 설정했습니다.

tail -f -s 5 geek-1.log

화면에는 보이지 않지만, 파일은 2초마다 업데이트되고 있으며, 새로운 내용은 5초마다 터미널 창에 표시됩니다.

여러 파일에 추가되는 텍스트를 추적할 때, 어떤 로그 파일에서 왔는지 나타내는 헤더를 표시하지 않을 수 있습니다. -q 옵션(quiet)을 사용하면 됩니다.

tail -f -q geek-1.log geek-2.log

출력 결과는 각 항목이 어떤 로그 파일에서 왔는지 구분 없이 연속적인 텍스트 흐름으로 표시됩니다.

tail 명령어의 가치

시스템 로그 파일 접근은 이제 journalctl이 담당하지만, tail 명령어는 여전히 다양한 용도로 활용할 가치가 있습니다. 특히, 다른 명령어와 함께 파이프를 사용하여 다양하게 응용할 수 있다는 장점이 있습니다.

systemd가 많은 변화를 가져왔지만, 한 가지 작업을 잘 수행하는 UNIX 철학을 따르는 전통적인 유틸리티들은 여전히 그 가치를 유지하고 있습니다.