LainyZine: 프로그래머 가이드 🐣

[리눅스] tail 명령어: 파일의 마지막 부분 출력

리눅스에서는 파일의 내용을 출력해주는 여러가지 명령어가 있습니다. cat 명령어는 파일 내용 전체를 출력하는데 사용합니다. headtail은 각각 파일의 앞부분이나 마지막 부분 일부를 출력하는 용도로 사용합니다. tail은 특히 실시간으로 업데이트 되는 로그 파일을 보는 용도로 유용합니다. (실시간 로그 보는 방법은 -f 옵션에서 소개합니다.)

이 글에서는 파일의 마지막 부분 일부를 출력해주는 tail 명령어에 대해서 자세히 알아봅니다.

tail 명령어의 기본적인 사용법

리눅스의 출력 명령어들을 처음 사용하면 사용법이 헷갈리는 경우가 있습니다. cat과 마찬가지로 tail도 인자 없이 실행하는 경우 입력 대기 상태가 됩니다.

$ tail
<대기>

이렇게 동작하는 이유는 cat이나 tail과 같은 출력 명령어들은 어떤 입력을 받아서, 그 입력의 내용 중 특정 부분을 출력하는 명령어이기 때문입니다. 입력이 따로 지정되지 않았기 때문에, 입력을 대기하는 상태가 됩니다(이 상태에서 프로그램을 종료하려면 ^c, Control + C를 입력해주세요).

간단한 실습을 통해 tail 명령어 사용법을 알아보겠습니다.

$ tail -n 1
1
2
3^d
3

이 때 -n 1은 마지막 한 줄을 출력하는 옵션입니다. 차례대로 1, 엔터, 2, 엔터, 3을 입력하고 ^d(Control + D) 키를 입력해, 입력 내용의 종료를 전달합니다. 그럼 마지막 줄 내용인 3이 출력되고 프로그램이 종료됩니다.

하지만 커맨드라인에서 이렇게 사용하는 경우는 많지 않습니다. 일반적으로는 tail 명령어의 첫 번째 인자로 파일 이름을 지정합니다. 예를 들어 다음 내용을 가진 123.txt 파일이 있다고 가정해보겠습니다.

1
2
3

이 때 -n 1 옵션을 사용하고, 123.txt 파일을 지정하면 마지막 줄 내용인 3이 출력됩니다.

$ tail -n 1 123.txt
3

여러 파일의 마지막 내용을 한꺼번에 출력하는 것도 가능합니다. 이 때는 파일을 구분하기 위해 기본적으로 파일 이름을 출력해줍니다.

$ tail -n 1 123.txt 456.txt
==> 123.txt <==
3

==> 456.txt <==
6

간단하죠? tail의 기본 동작은 꼭 기억해두시기 바랍니다.

그럼 여기서부터는 tail의 옵션들에 대해서 좀 더 자세히 알아보겠습니다. 옵션 해설은 GUN 버전의 tail을 기준으로 합니다. macOS에 기본으로 포함된 tail 명령어는 BSD 버전으로 긴 이름의 옵션을 지원하지 않으며, 옵션도 조금 차이가 있습니다.

-n, --lines 옵션: 출력할 마지막 줄 수를 지정

tail은 기본적으로 10줄을 출력합니다. 예를 들어 1부터 20까지 한 줄 씩 적혀있는 파일을 출력하면 다음과 같이 11부터 20까지 출력됩니다.

$ tail nums.txt
11
12
13
14
15
16
17
18
19
20

-n--lines은 같은 옵션으로 출력할 마지막 줄 수를 지정합니다. 예를 들어 -n 3을 지정하면 마지막 3줄을 출력합니다.

$ tail -n 3 nums.txt
18
19
20

--lines 옵션 동작도 정확히 같습니다.

$ tail --lines 3 nums.txt
18
19
20

조금 특별한 사용법은 인자값 앞에 +를 붙이면 파일의 n번째 줄부터 끝까지 출력합니다.

$ tail -n +16 nums.txt
16
17
18
19
20

-c, --bytes 옵션: 출력할 마지막 바이트 수를 지정

-n 옵션이 출력할 줄 수를 지정한다면, -c--bytes 옵션은 출력할 바이트를 지정하는 옵셥입니다.

$ tail -c 9 nums.txt
18
19
20

--bytes 옵션의 동작도 같습니다.

$ tail --byets 9 nums.txt
18
19
20

-n 옵션과 마찬가지로 인자 앞에 +를 붙이면 특정 바이트부터 끝까지 출력합니다.

$ tail --bytes +38 nums.txt
6
17
18
19
20

-v, --verbose: 파일 이름을 출력합니다

-v--verbose 옵션을 지정하면 출력하는 파일의 이름을 출력합니다.

$ tail -v -n 3 nums.txt
==> nums.txt <==
18
19
20

-q, --quiet, --silent: 파일 이름을 출력하지 않습니다

-q, --quiet, --silent 옵션을 지정하면 명시적으로 파일 이름을 출력하지 않을 수 있습니다. tail-v 옵션을 명시적으로 지정하지 않으면 기본적으로 파일 이름을 출력하지 않기 때문에 생략해도 동작은 같습니다.

## -q 옵션을 명시적으로 지정한 경우: 파일 이름 미출력
$ tail -q -n 3 nums.txt
18
19
20

## -q 옵션을 지정하지 않은 경우: 파일 이름 미출력
$ tail -n 3 nums.txt
18
19
20

## -v 옵션을 지정한 경우: 파일 이름 출력
$ tail -v -n 3 nums.txt
==> nums.txt <==
18
19
20

단, 여러 개의 파일을 한 번에 출력하는 경우에는 기본적으로 파일 이름이 출력되므로, 파일 이름을 출력하지 않으려면 명시적으로 -q 옵션을 지정해야합니다.

-f, --follow: 실시간 로그 파일 보는 방법

tail 명령어는 파일의 끝부분을 출력하기 위한 용도뿐만 아니라 실시간으로 로그 파일을 출력하는 용도로도 많이 사용합니다. 계속 업데이트 되는 로그 파일을 -f 옵션을 붙여서 출력해두면, 로그 파일 내용이 업데이트될 때마다 계속 출력해줍니다.

예를 들어 nginx 에러 로그를 감시하고 싶다면 다음 명령어를 실행합니다. (단, 로그 파일 경로는 nginx 설정에 따라 다를 수 있습니다)

$ tail -f /var/log/nginx/error.log

-f 옵션은 매우 자주 사용하는 옵션이므로 꼭 직접 실행해보는 것을 추천합니다.

-F: -f 옵션과 --retry 옵션 조합

tail 명령어는 기본적으로 출력할 파일이 없으면 에러 메시지를 출력하고, 바로 종료 됩니다. -f 옵션을 사용하는 경우도 마찬가지입니다.

$ tail -f logs.txt
tail: cannot open 'logs.txt' for reading: No such file or directory
tail: no files remaining

단, -f 옵션을 사용할 때는 --retry 옵션을 함께 사용할 수 있습니다. 이 때는 파일이 존재하지 않더라도 대기 상태로 프로그램이 종료되지 않습니다.

$ tail -f --retry logs.txt
tail: cannot open 'logs.txt' for reading: No such file or directory
<대기>

이 상태에서 logs.txt 파일이 생성되고 내용이 업데이트되면 , -f 옵션과 마찬가지로 내용을 계속 출력해줍니다.

$ tail -f --retry logs.txt
tail: cannot open 'logs.txt' for reading: No such file or directory
tail: 'logs.txt' has appeared;  following new file
logs1
logs2
...

-F 옵션은 -f --retry 옵션을 조합한 축약 옵션입니다. 로그 파일이나 추후에 생성될 파일을 감시하고자할 때 유용한 옵션입니다.

$ tail -F logs.txt

-s, --sleep-interval: 업데이트 주기 지정

-f 옵션은 특정 파일을 감시해서 업데이트할 때 마다 출력해줍니다. 앞에서는 편의상 ’실시간’이라고 표현했습니다만, 업데이트 주기 기본값은 1초입니다. -s--sleep-interval 옵션을 주면 이 업데이트 주기를 직접 지정할 수 있습니다.

--pid: 특정 프로세스가 종료되면 tail 종료

--pid 옵션도 -f 옵션과 함께 사용할 수 있는 옵션입니다. 특정 PID를 지정하면 이 프로세스가 종료될 때 tail도 함께 종료합니다. 예를 들어 nginx 에러 로그를 출력하다가, nginx가 종료될 때 tail도 종료하도록 하려면 다음과 같이 실행합니다.

$ tail -f --pid 1208 /var/log/nginx/error.log

여기서는 1208이 ngnix의 PID라고 가정하겠습니다. pid 값은 직접 찾아서 지정해주어야합니다.

추천 문서

여기까지 tail 명령어의 사용법에 대해서 알아보았습니다. 더 자세한 내용이나 모든 옵션에 대해서는 man 명령어나 온라인 매뉴얼을 통해서 확인해보시기 바랍니다.

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.