개발 도구

개발 생산성을 극대화하는 CLI 유틸리티: fzf, bat, exa, jq 마스터 가이드

강코의 코딩 일기 2026. 3. 19. 20:08

개발자라면 꼭 알아야 할 필수 CLI 유틸리티 fzf, bat, exa, jq를 활용하여 터미널 작업 효율을 혁신적으로 높이는 실전 가이드를 만나보세요. 생산성 향상의 비밀이 여기에 있습니다.

혹시 아직도 터미널에서 lscat만 사용하고 계신가요? 물론 이 두 명령어는 매우 강력하고 기본적인 유틸리티지만, 터미널 작업의 생산성을 한 단계 더 끌어올릴 수 있는 숨겨진 보석 같은 도구들이 많이 있답니다.

개발자에게 터미널은 단순한 명령 실행 창이 아니라, 코드를 탐색하고, 데이터를 처리하며, 시스템과 상호작용하는 핵심 작업 공간이잖아요? 이 공간을 얼마나 효율적으로 활용하느냐에 따라 하루에도 몇 시간씩 작업 시간이 달라질 수 있다는 사실, 알고 계셨나요?

이 글에서는 여러분의 터미널 환경을 혁신적으로 바꿔줄 필수 CLI 유틸리티 4가지를 소개하고, 실전에서 어떻게 활용할 수 있는지 자세히 알려드릴 거예요. 바로 fzf, bat, exa, jq인데요. 이 도구들을 마스터하면 파일 찾기부터 코드 보기, JSON 데이터 처리까지, 터미널 작업이 훨씬 더 빠르고 즐거워질 거예요. 자, 그럼 당신의 개발 생산성을 극대화할 준비 되셨나요?

📑 목차

개발 생산성을 높이는 필수 CLI 유틸리티: fzf, bat, exa, jq 활용 실전 가이드 - penknife, pocket knife, blade, serrated, folding, locking, cutting, sharp, cut, weapon, pocketknife, camping, slice, dangerous, spyderco, blue camping, penknife, penknife, penknife, pocket knife, pocket knife, pocket knife, pocket knife, pocket knife, blade, pocketknife, pocketknife, camping, camping, camping, spyderco, spyderco

Image by stevepb on Pixabay

fzf: 터미널 검색의 혁신, Fuzzy Finder

파일 찾기, 명령어 히스토리 검색, Git 브랜치 전환... 이 모든 작업을 번개처럼 빠르게 할 수 있다면 어떨까요? 바로 fzf (fuzzy finder)가 그 해답입니다. fzf는 퍼지 매칭(fuzzy matching) 기반의 인터랙티브 필터로, 몇 글자만 입력해도 원하는 항목을 찾아주는 마법 같은 도구예요.

기존의 grep 명령어가 정규표현식을 통해 정적인 텍스트 검색을 수행한다면, fzf는 대화형으로 실시간 필터링을 제공한다는 점에서 차이가 커요. 수많은 파일이나 긴 히스토리 목록 속에서 원하는 것을 즉시 찾아낼 수 있죠.

fzf 기본 활용법: 원하는 것을 빠르게 찾아내세요

fzf는 주로 다른 명령어의 출력과 파이프(|)로 연결하여 사용합니다. 몇 가지 예시를 살펴볼까요?

  • 파일/디렉토리 검색: 현재 디렉토리의 모든 파일과 디렉토리 중에서 원하는 것을 찾을 때 가장 유용해요.
ls -la | fzf
# 또는 재귀적으로 모든 파일을 찾고 싶다면
find . -type f | fzf

fzf를 실행하면 새로운 터미널 화면이 뜨면서 목록이 나타나고, 키보드 입력에 따라 실시간으로 목록이 필터링됩니다. 위아래 화살표 키로 선택하고 Enter를 누르면 선택한 항목이 터미널로 출력되죠.

  • 명령어 히스토리 검색: 이전에 실행했던 복잡한 명령어를 다시 찾을 때 유용합니다.
history | fzf

대부분의 쉘(bash, zsh 등)에서는 fzf를 설치하면 Ctrl+R 단축키가 fzf 기반의 히스토리 검색으로 자동 변경되어 더 편리하게 사용할 수 있을 거예요.

  • Git 브랜치 전환: 많은 브랜치가 있을 때 빠르게 전환할 수 있습니다.
git checkout $(git branch --all | fzf)

fzf 고급 활용 팁: 더 강력한 워크플로우를 구축하세요

fzf는 단순히 항목을 선택하는 것을 넘어, 다양한 옵션과 함께 사용하면 훨씬 강력해집니다.

  • 미리보기(Preview) 기능: 파일을 선택하기 전에 내용을 미리 볼 수 있어요.
find . -type f | fzf --preview 'bat --color=always {}'

여기서 bat은 잠시 후 설명할 또 다른 유틸리티인데, 파일 내용을 문법 강조(syntax highlighting)하여 예쁘게 보여주는 역할을 합니다. {}는 fzf에서 현재 선택된 파일 경로를 의미해요.

  • 여러 항목 선택: -m 옵션을 사용하면 Tab 키로 여러 항목을 선택할 수 있습니다.
find . -type f | fzf -m | xargs rm

선택한 여러 파일을 xargs를 통해 rm 명령어로 넘겨 한 번에 삭제하는 예시입니다.

  • 디렉토리 이동: Zsh 사용자의 경우, **를 입력하면 fzf가 자동으로 디렉토리를 찾아주는 기능이 내장되어 있습니다.
cd **

이처럼 fzf는 터미널에서 정보를 탐색하고 선택하는 과정을 혁신적으로 단축시켜 줍니다. 익숙해지면 터미널 작업 속도가 최소 2배 이상 빨라지는 것을 체감하실 거예요.

bat: `cat`을 넘어선 코드 하이라이팅과 페이지네이션

cat 명령어는 파일 내용을 터미널에 출력하는 데 쓰이는 기본적인 유틸리티죠. 하지만 batcat이 제공하지 못하는 아름다운 코드 하이라이팅, Git 통합, 자동 페이지네이션 등 개발자에게 필요한 훨씬 더 많은 기능을 제공하는 현대적인 대체 도구입니다.

밋밋한 텍스트 파일 대신, bat은 코드의 가독성을 극대화하여 마치 IDE에서 코드를 보는 것처럼 만들어줘요. 개발 과정에서 로그 파일이나 설정 파일을 자주 들여다보는 분들에게는 정말 필수적인 도구라고 할 수 있죠.

bat 기본 사용법: 파일 내용을 아름답게 출력하세요

  • 파일 내용 보기: 가장 기본적인 사용법입니다.
bat my_script.py
bat README.md

bat은 파일 확장자를 보고 자동으로 언어를 인식하여 문법 강조를 해줍니다. 라인 번호도 함께 출력되어 특정 라인을 참조하기 용이하죠.

  • 특정 언어 문법 강제 적용: 때로는 확장자가 없거나 bat이 잘못 인식하는 경우, 직접 언어를 지정할 수 있어요.
bat -l json config.txt
bat -l markdown notes.txt
  • 파이프와 함께 사용: 다른 명령어의 출력을 bat으로 넘겨서 예쁘게 볼 수 있습니다.
cat ~/.bashrc | bat
# 또는
grep "TODO" src/* | bat

bat은 출력 내용이 터미널 화면을 넘어갈 경우 자동으로 less와 같은 페이지네이션 도구를 사용하기 때문에 긴 파일도 편리하게 탐색할 수 있어요.

`cat`과의 차이점 비교

catbat의 주요 차이점을 표로 정리해봤습니다. 이 표를 보면 왜 bat이 개발자에게 더 유용한지 명확히 알 수 있을 거예요.

기능 cat bat
문법 강조 (Syntax Highlighting) 없음 지원 (자동 감지)
라인 번호 표시 없음 지원
Git 통합 없음 지원 (변경 사항 표시)
자동 페이지네이션 없음 지원 (긴 파일 자동 처리)
테마 지원 없음 지원
숨겨진 문자 표시 없음 지원 (--show-all)

특히 Git 통합 기능은 정말 유용합니다. git diff 결과를 bat으로 넘기면 변경된 라인이 시각적으로 강조되어 훨씬 더 쉽게 이해할 수 있어요.

git diff | bat --diff

bat은 단순히 파일을 보여주는 것을 넘어, 파일 내용을 분석하고 이해하는 데 드는 시간을 크게 줄여주는 고마운 도구입니다.

exa: `ls`보다 강력한 파일 목록 시각화 도구

파일 목록을 확인하는 데 사용하는 ls 명령어, 다들 익숙하실 거예요. 하지만 exals의 기능을 훨씬 뛰어넘어 더욱 풍부한 정보와 아름다운 시각화를 제공하는 현대적인 파일 리스팅 도구입니다.

exa색상 강조, Git 상태 표시, 트리 뷰, 파일 타입별 아이콘 등 다양한 기능을 통해 터미널에서 파일 시스템을 탐색하는 경험을 완전히 바꿔줍니다. 복잡한 프로젝트 구조를 파악하거나, Git으로 관리되는 디렉토리에서 변경 사항을 한눈에 보고 싶을 때 exa는 빛을 발합니다.

exa 기본 사용법: 파일 목록을 더 스마트하게 보세요

  • 기본 목록 보기: ls와 유사하지만 기본적으로 더 예쁜 색상으로 출력됩니다.
exa
  • 상세 정보 보기: -l (long) 옵션은 ls -l과 비슷하지만, 파일 타입별 색상, 권한, 수정 시간 등 더 많은 정보를 보기 쉽게 제공해요.
exa -l
  • 파일 타입 표시: -F (classify) 옵션은 파일 종류에 따라 자동으로 심볼을 붙여줍니다 (예: 실행 파일 뒤에 *, 디렉토리 뒤에 /).
exa -lF
  • 트리 뷰: 디렉토리 구조를 시각적으로 파악하는 데 가장 강력한 기능입니다. -T (tree) 옵션을 사용하고, -L 옵션으로 깊이를 조절할 수 있어요.
exa -T -L 2 # 현재 디렉토리의 2단계까지 트리 형태로 표시
exa -T -L 3 src # src 디렉토리의 3단계까지 트리 형태로 표시
  • Git 상태 표시: --git 옵션을 사용하면 각 파일의 Git 상태(수정됨, 추가됨 등)를 함께 보여줍니다.
exa -l --git

`ls`와의 차이점 비교

lsexa의 주요 차이점을 표로 비교해볼게요. exa가 얼마나 더 많은 정보를 직관적으로 보여주는지 알 수 있을 거예요.

기능 ls exa
색상 강조 제한적 (설정 필요) 기본 지원 (더 풍부한 색상)
Git 상태 표시 없음 지원 (--git)
트리 뷰 없음 (tree 별도 설치) 기본 지원 (-T)
파일 타입 아이콘 없음 지원 (-F)
정보 표시량 기본적 더 상세하고 직관적

exa는 단순히 파일 목록을 보여주는 것을 넘어, 파일 시스템을 시각적으로 탐색하고 이해하는 데 필요한 모든 정보를 제공합니다. 복잡한 프로젝트를 다루거나, Git으로 버전 관리되는 코드베이스를 탐색할 때 exa는 여러분의 눈과 시간을 아껴줄 거예요.

개발 생산성을 높이는 필수 CLI 유틸리티: fzf, bat, exa, jq 활용 실전 가이드 - hand, write, pen, notebook, journal, planner, writing, paper, pages, open notebook, notes, desk, person, work, working, writer, taking notes, write, journal, writing, writing, writing, writing, work, work, writer, writer, writer, writer, writer

Image by Pexels on Pixabay

jq: JSON 데이터, 이제 터미널에서 자유롭게 다루세요

JSON (JavaScript Object Notation)은 API 통신, 설정 파일, 데이터 교환 등 현대 웹 개발에서 빼놓을 수 없는 데이터 형식이죠. 그런데 터미널에서 JSON 데이터를 다루는 것은 종종 불편하게 느껴질 때가 많아요. 줄 바꿈 없이 한 줄로 길게 출력되거나, 필요한 정보만 쏙 빼내기가 어렵기 때문인데요.

이때 jq가 구세주처럼 등장합니다. jqJSON 데이터를 파싱하고 변환, 필터링하는 데 특화된 강력한 CLI 유틸리티입니다. 복잡한 JSON 데이터를 쉽게 읽고, 원하는 필드만 추출하며, 심지어 새로운 JSON 구조로 변환하는 것까지 가능하게 해줘요. 마치 JSON을 위한 grep이자 sed 같은 존재라고 할 수 있죠.

jq 기본 사용법: JSON 데이터를 쉽게 탐색하고 추출하세요

jq는 주로 curl이나 다른 명령어로 얻은 JSON 데이터를 파이프(|)로 넘겨서 사용합니다.

  • 예쁘게 출력하기: 가장 기본적인 사용법은 보기 좋게 JSON을 포맷팅하는 것입니다.
echo '{"name": "Alice", "age": 30}' | jq .

이렇게 하면 들여쓰기와 줄 바꿈이 적용된 형태로 JSON이 출력됩니다.

  • 특정 필드 값 추출: 객체의 특정 키에 접근하려면 .키이름을 사용합니다.
echo '{"name": "Bob", "age": 25, "city": "Seoul"}' | jq .name
# 결과: "Bob"

여러 필드를 추출하고 싶다면 쉼표로 구분할 수 있어요.

echo '{"name": "Bob", "age": 25, "city": "Seoul"}' | jq '.name, .city'
# 결과:
# "Bob"
# "Seoul"
  • 배열 처리: 배열의 모든 요소에 접근하려면 .배열이름[]을 사용합니다.
echo '[{"id": 1, "name": "A"}, {"id": 2, "name": "B"}]' | jq '.[].name'
# 결과:
# "A"
# "B"
  • 필터링: 특정 조건을 만족하는 객체만 필터링할 수 있습니다.
echo '[{"status": "active", "user": "Alice"}, {"status": "inactive", "user": "Bob"}]' | jq '.[] | select(.status == "active")'
# 결과: {"status": "active", "user": "Alice"}

복잡한 JSON 처리 예시: 데이터 변환까지 한 번에

jq는 단순히 값을 추출하는 것을 넘어, 데이터를 새로운 JSON 구조로 변환하는 데도 매우 강력합니다. 예를 들어, 특정 필드만 포함하는 새로운 객체를 만들 수 있어요.

echo '[{"id": 1, "name": "Alice", "email": "a@example.com"}, {"id": 2, "name": "Bob", "email": "b@example.com"}]' | \
jq '.[] | {userId: .id, userName: .name}'
# 결과:
# {
#   "userId": 1,
#   "userName": "Alice"
# }
# {
#   "userId": 2,
#   "userName": "Bob"
# }

이처럼 jq를 사용하면 API 응답을 디버깅하거나, 설정 파일을 편집하거나, 복잡한 데이터를 원하는 형식으로 빠르게 가공할 수 있습니다. 터미널에서 JSON 데이터를 다루는 작업이 훨씬 더 효율적이고 즐거워질 거예요.

개발 생산성을 높이는 필수 CLI 유틸리티: fzf, bat, exa, jq 활용 실전 가이드 - dandruff, tool shed, hut, agriculture, utility building, wooden boards, grasslands, dandruff, dandruff, tool shed, hut, hut, hut, hut, hut, utility building, utility building

Image by adege on Pixabay

이 모든 도구를 함께 사용한다면? 시너지 효과!

fzf, bat, exa, jq는 각자도 강력한 도구지만, 이들을 함께 사용하면 엄청난 시너지 효과를 낼 수 있습니다. Unix 철학인 '작고 강력한 도구들을 파이프(|)로 연결하여 더 큰 작업을 수행한다'는 원칙을 완벽하게 구현할 수 있죠. 몇 가지 실전 예시를 살펴볼까요?

  • 예시 1: 특정 로그 파일에서 에러 메시지를 찾고, 그 내용을 예쁘게 출력하기
find . -name "*.log" | fzf --preview 'grep -A 5 -B 5 "ERROR" {} | bat -l log --theme="ansi-dark"'

이 명령어는 먼저 현재 디렉토리에서 모든 로그 파일을 찾고 (find . -name "*.log"), 그 목록을 fzf로 넘깁니다. fzf에서 파일을 선택할 때마다 --preview 옵션에 의해 해당 로그 파일에서 "ERROR"를 포함하는 라인 주변 10줄(위 5줄, 아래 5줄)을 grep으로 추출하고, 그 결과를 bat으로 문법 강조하여 미리 보여줍니다. 이 얼마나 강력한가요!

  • 예시 2: API 응답에서 특정 데이터를 추출하고, 관련 코드 파일 검색하기
curl -s 'https://api.github.com/users/octocat/repos' | \
jq '.[].name' | \
fzf --prompt="Select a repository: " | \
xargs -I {} exa -T -L 2 {}

GitHub API에서 특정 사용자의 모든 저장소 이름을 가져와 (curl ... | jq '.[].name'), 그 목록을 fzf로 넘겨 대화형으로 저장소를 선택합니다. 선택된 저장소 이름을 xargs를 통해 exa -T -L 2 명령어로 넘겨 해당 저장소의 디렉토리 구조를 트리 형태로 보여주는 예시입니다. API 데이터 탐색부터 코드 탐색까지, 끊김 없는 워크플로우를 만들 수 있어요.

  • 예시 3: Git 커밋 메시지에서 키워드 검색 후, 해당 커밋의 변경 사항 확인하기
git log --oneline --graph | \
fzf --preview 'git show --color $(echo {} | cut -d " " -f 1) | bat -l diff'

git log로 커밋 히스토리를 한 줄로 요약하여 가져오고, 이를 fzf로 넘깁니다. fzf에서 특정 커밋을 선택하면, 해당 커밋의 해시값(cut -d " " -f 1)을 추출하여 git show 명령어로 변경 사항을 가져온 후, bat -l diff로 문법 강조된 형태로 미리 볼 수 있게 해줍니다. 이로써 커밋 히스토리 탐색 및 변경 사항 검토가 훨씬 직관적이고 빨라지죠.

이처럼 이 도구들은 서로 유기적으로 연결되어 여러분의 터미널 작업을 차원이 다른 수준으로 끌어올려 줄 겁니다. 처음에는 각 도구의 옵션들이 복잡하게 느껴질 수도 있지만, 몇 번 사용하다 보면 금방 익숙해지고 그 편리함에 헤어 나올 수 없게 될 거예요.

마무리하며: 당신의 터미널, 이제 더 강력해질 시간

지금까지 fzf, bat, exa, jq라는 네 가지 강력한 CLI 유틸리티를 살펴보았습니다. 이 도구들은 각각 파일 검색, 파일 내용 보기, 파일 목록 시각화, JSON 데이터 처리라는 특정 영역에서 독보적인 기능을 제공하지만, 서로 파이프로 연결될 때 진정한 위력을 발휘하죠.

  • fzf로 수많은 파일과 명령어 히스토리 속에서 원하는 것을 찰나에 찾아내고,
  • bat으로 코드를 아름답게 하이라이팅하며 가독성을 높이고,
  • exals보다 더 많은 정보와 시각적인 아름다움으로 파일 시스템을 탐색하고,
  • jq로 복잡한 JSON 데이터를 자유자재로 다루는 경험은 개발 생산성을 획기적으로 향상시킬 겁니다.

처음에는 새로운 도구를 익히는 것이 번거롭게 느껴질 수도 있어요. 하지만 단언컨대, 이들 도구에 투자하는 시간은 여러분의 개발 작업 속도와 효율성으로 몇 배, 몇십 배 이상 보상받게 될 거예요. 터미널 작업에 대한 스트레스는 줄어들고, 더 즐겁고 생산적인 개발 환경을 구축할 수 있을 겁니다.

자, 이제 여러분의 터미널을 한 단계 업그레이드할 시간입니다! 지금 바로 이 유틸리티들을 설치하고, 오늘부터 여러분의 워크플로우에 적용해보세요. 분명 놀라운 변화를 경험하실 수 있을 거예요.

여러분은 어떤 CLI 유틸리티를 가장 유용하게 사용하고 계신가요? 혹은 이 외에 추천하고 싶은 멋진 도구가 있다면 댓글로 자유롭게 공유해주세요! 함께 더 강력한 개발 환경을 만들어가요!

📌 함께 읽으면 좋은 글

  • [개발 도구] 개발자 디버깅 프로파일링 도구: 성능 최적화와 문제 해결 능력 향상 전략
  • [개발 도구] 개발 생산성 극대화: Zsh, Tmux로 완성하는 나만의 터미널 작업 환경
  • [개발 도구] tmux를 활용한 터미널 기반 개발 생산성 극대화: 멀티태스킹과 효율적인 작업 환경 구축 전략

이 글이 도움이 되셨다면 공감(♥)댓글로 응원해 주세요!
궁금한 점이나 다루었으면 하는 주제가 있다면 댓글로 남겨주세요.