less와 more는 리눅스·유닉스에서 긴 텍스트를 화면(페이지) 단위로 나눠 보여주는 페이저다. 로그 파일이나 명령 출력이 터미널 한 화면보다 길 때, 전체를 한 번에 쏟아내는 대신 사용자가 원하는 속도로 넘겨 보고 검색할 수 있게 해준다.
이 장을 읽기 전에
선행 챕터: 이 장은 3장: cat에서 이어진다. cat은 파일 전체를 표준 출력으로 그대로 쏟아내는 명령이라, 수천 줄짜리 로그 파일을 cat으로 열면 화면이 순식간에 스크롤되어 지나가 버려 원하는 부분을 찾기 어렵다. 이 문제의식에서 자연스럽게 “화면 단위로 멈춰 가며 보는 도구"인 페이저로 넘어온다.
이 장의 깊이: 입문 난이도다. less·more의 기본 조작키와 검색, 두 명령의 실질적 차이를 다룬다. 다루지 않는 것: 페이저로 본 텍스트를 실제로 편집하는 것은 다루지 않는다(그건 vi/vim 같은 편집기의 영역이다). less의 명령줄 옵션 중 색상·마크·다중 파일 탐색처럼 고급 기능도 이 장의 범위 밖이며, 필요하면 man less로 확인한다. 파이프(|)의 작동 원리 자체는 19장: pipe에서 다룬다.
당신의 수준에 맞는 경로
| 수준 | 읽을 부분 | 핵심 목표 |
|---|---|---|
| 로그를 당장 넘겨봐야 하는 사람 | “사용법·옵션"의 조작키 표, “예시” 전체 | 스페이스로 넘기고 /로 검색하고 q로 빠져나오는 최소 조작을 바로 쓴다 |
more밖에 없는 환경을 다뤄야 하는 사람 | “개요+정신 모델”, “주의사항·함정” 전체 | more와 less의 실질적 기능 차이와, less가 없는 최소 환경에서 무엇이 달라지는지 이해한다 |
개요 + 정신 모델
cat은 파일을 열면 처음부터 끝까지 표준 출력으로 그대로 쏟아붓는다 — 파일이 10GB든 10KB든 동작 방식은 같다. 반면 페이저는 파일 전체를 한 번에 읽어 들이지 않고, 화면에 지금 보여줘야 할 부분만 그때그때 읽어서 채운다. 사용자가 스페이스를 눌러 다음 페이지를 요청하기 전까지는 그 이후 내용을 읽을 필요조차 없다. 이 “필요한 만큼만 읽는다"는 지연 평가(lazy) 방식 덕분에 less는 수 기가바이트짜리 로그 파일도 시작 부분을 곧바로 열어 보여줄 수 있다 — 파일 크기와 상관없이 첫 화면을 채우는 데 필요한 만큼만 읽으면 되기 때문이다.
이 정신 모델을 알면 less가 왜 검색(/)·되돌아가기(b)·파일 끝 추적(F)까지 지원하면서도 무거워지지 않는지 이해할 수 있다. less는 지금까지 읽은 부분을 버퍼에 유지하면서 그 범위 안에서 자유롭게 앞뒤로 움직이고, 화면 밖으로 나간 부분은 다시 요청이 오면 그때 다시 읽는다. more도 같은 페이저 계열이지만, 전통적인 구현일수록 이 버퍼링 범위와 이동 방향에 제약이 크다 — 자세한 차이는 아래 “주의사항·함정"에서 다룬다.
사용법 · 옵션
| |
파일을 생략하면 둘 다 표준 입력에서 읽으므로, ls -l | less처럼 파이프의 끝에 두어 다른 명령의 출력을 페이지 단위로 보는 용도로 가장 많이 쓰인다.
조작키 (실행 중 입력)
| 키 | 동작 | less | more |
|---|---|---|---|
Space, f | 다음 페이지(전진) | O | O |
b | 이전 페이지(후진) | O | 제한적(§주의사항 참고) |
Enter, j, ↓ | 한 줄 전진 | O | 구현에 따라 다름 |
/패턴 | 아래 방향 검색 | O | 구현에 따라 다름(POSIX 사양엔 있음) |
?패턴 | 위 방향 검색 | O | 대체로 미지원 |
n / N | 다음/이전 검색 결과로 이동 | O | 구현에 따라 다름 |
g / G | 파일 맨 앞 / 맨 뒤로 이동 | O | 제한적 |
F | 파일 끝을 계속 추적(tail -f와 유사) | O | 미지원 |
q | 종료 | O | O |
h | 도움말(명령 요약) | O | more는 대체로 h 미지원, --help 옵션 사용 |
자주 쓰는 명령줄 옵션
| 옵션 | 대상 | 설명 |
|---|---|---|
-N | less | 각 줄 앞에 줄 번호 표시 |
-i | less | 검색 시 대소문자 무시(단, 대문자를 포함해 검색하면 자동 해제) |
-S | less | 긴 줄을 접지 않고 자르기(가로 스크롤로 확인) |
-F | less | 내용이 한 화면보다 짧으면 less를 열지 않고 바로 종료(예: 짧은 git diff 출력을 그냥 흘려보내고 싶을 때) |
-X | less | 종료 시 화면을 지우지 않고 마지막 출력 유지 |
+F | less | 파일을 연 즉시 F(끝 추적) 모드로 시작 — tail -f 대체 용도 |
-d | more | 페이지 하단에 조작키 힌트를 표시(초심자용) |
-p | more | 화면을 지우고 다시 그리는 방식으로 페이지 전환(스크롤 대신) |
예시
| |
주의사항·함정
POSIX more와 GNU less는 “같은 계열의 다른 버전"이 아니라 세대가 다른 도구다. POSIX 사양은 more에 b(후진)·/(검색) 명령을 정의해 두었지만, 사양 자체에 “입력이 파이프처럼 되감을 수 없는 스트림일 때 후진 동작을 얼마나 지원할지는 구현에 따라 다르다"는 단서를 명시한다. 실제로 busybox more나 임베디드·컨테이너 최소 이미지에 딸려 오는 more는 파이프 입력에서 후진이 아예 동작하지 않거나, 정규 파일에서도 페이지를 한 번 넘기면 그 이전 내용을 다시 볼 수 없는 경우가 흔하다. less는 이런 제약이 없다 — 입력이 일반 파일이든 파이프든 지금까지 읽은 범위 안에서는 항상 자유롭게 앞뒤로 이동하고 검색할 수 있다. less라는 이름 자체가 “more가 하는 일을 더 적은 제약으로 한다(less is more)“는 농담에서 나왔을 정도로, 처음부터 more의 이 한계를 없애기 위해 만들어진 도구다.
less가 기본 설치돼 있지 않을 수 있다. Alpine 기반 컨테이너, 일부 임베디드 배포판, busybox 하나로 셸 유틸리티를 대체하는 최소 이미지에는 less가 아예 없고 more만 있는 경우가 많다. 스크립트나 매뉴얼에서 less를 전제로 안내했다가 실제 실행 환경에 less가 없어 “command not found"를 마주치는 것은 흔한 함정이다. 이런 환경을 다뤄야 한다면 apt install less(Debian/Ubuntu 계열) 또는 apk add less(Alpine)로 설치하거나, more의 제한된 기능 안에서 작업해야 한다. 참고로 git은 페이저가 지정되지 않으면 기본으로 less를 찾아 쓰므로, less가 없는 환경에서는 git log 같은 명령의 출력 방식도 달라진다.
q를 몰라서 못 빠져나오는 초심자 함정. less나 more로 파일을 열면 셸 프롬프트가 사라지고 화면이 페이저 모드로 바뀌는데, 여기서 Ctrl+C를 눌러도 대부분 아무 반응이 없거나(less는 기본적으로 Ctrl+C를 무시한다) 검색 중이던 동작만 취소된다. 종료 방법은 q 한 글자뿐이다. 이 사실을 모른 채 로그를 찾아보다가 터미널이 “멈췄다"고 착각해 터미널 창 자체를 강제로 닫아버리는 경우가 실무에서도 자주 보인다.
흔한 오개념
"less도 파일 전체를 미리 다 읽은 다음 보여주는 것”이라고 오해하기 쉽다. 실제로는 “개요 + 정신 모델"에서 설명했듯 less는 화면을 채우는 데 필요한 만큼만 그때그때 읽는다. 그래서 수 기가바이트짜리 로그 파일도 cat으로 열면 셸이 한동안 멈춘 것처럼 보이지만, less로 열면 파일 크기와 무관하게 첫 화면이 거의 즉시 뜬다 — 파일 끝까지 읽어야 알 수 있는 정보(전체 줄 수 등)를 상태 표시줄에 보여줘야 할 때만 필요한 범위를 추가로 읽는다.
다음 장에서는
다음은 5장: touch — 페이저로 파일 내용을 보는 법을 익혔으니, 이번에는 파일 자체의 타임스탬프를 만들고 바꾸는 법을 다룬다.
평가 기준
less가 파일 전체를 미리 읽지 않고 화면 단위로 필요한 부분만 읽는다는 정신 모델을 설명할 수 있다.- 스페이스(전진)·
b(후진)·/(검색)·q(종료) 등 핵심 조작키를 명령어 없이도 실행할 수 있다. - POSIX
more와 GNUless의 실질적 기능 차이(후진 스크롤, 검색, 파이프 입력 처리)를 설명할 수 있다. less가 설치돼 있지 않을 수 있는 환경을 인지하고, 그런 환경에서more로 대체하거나less를 설치하는 방법을 선택할 수 있다.
![Featured image of post [Bash Shell] 04. less, more - 페이저로 파일 보기](/post/bashshell/less-more-commands-view-large-files-linux/wordcloud_hu_3ba086147d61af39.webp)
![[Bash Shell] 02. ls - 파일 목록 출력](/post/bashshell/ls-command-list-files-directories-linux/wordcloud_hu_f0f275298232e31b.webp)
![[Bash Shell] 03. cat, head, tail - 파일 내용 출력과 일부 보기](/post/bashshell/cat-head-tail-commands-view-file-contents/wordcloud_hu_7ec28326489f97a8.webp)
![[Bash Shell] 04. less, more - 페이저로 파일 보기](/post/bashshell/less-more-commands-view-large-files-linux/wordcloud_hu_7ec28326489f97a8.webp)
![[Bash Shell] 05. touch - 파일 생성과 타임스탬프 갱신](/post/bashshell/touch-command-create-file-update-timestamp/wordcloud_hu_7ec28326489f97a8.webp)
![[Bash Shell] 06. mkdir, rmdir - 디렉터리 생성과 삭제](/post/bashshell/mkdir-rmdir-commands-create-delete-directories/wordcloud_hu_7ec28326489f97a8.webp)
![[Bash Shell] 13. grep - 패턴 검색](/post/bashshell/grep-command-search-text-pattern-linux/wordcloud_hu_7ec28326489f97a8.webp)
![[Bash Shell] 16. cut - 컬럼 추출](/post/bashshell/cut-command-extract-columns-linux/wordcloud_hu_7ec28326489f97a8.webp)
![[Bash Shell] 21. xargs - 인자 변환과 배치 실행](/post/bashshell/xargs-command-build-execute-command-lines/wordcloud_hu_7ec28326489f97a8.webp)