[리눅스] tail 명령어: 파일의 마지막 부분 출력
리눅스에서는 파일의 내용을 출력해주는 여러가지 명령어가 있습니다. cat
명령어는 파일 내용 전체를 출력하는데 사용합니다. head
나 tail
은 각각 파일의 앞부분이나 마지막 부분 일부를 출력하는 용도로 사용합니다. 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
명령어나 온라인 매뉴얼을 통해서 확인해보시기 바랍니다.