[Shell Script] fzf(Fuzzy finder)

fzf

fzf는 명령줄에서 빠르고 효율적으로 파일을 찾거나, 히스토리에서 명령어를 검색하거나, 프로세스를 선택하는 등

퍼지 검색 기능을 제공하는 범용적인 대화형 필터 도구입니다.


주요 특징

특징 설명
퍼지 검색 입력한 문자열이 정확히 일치하지 않더라도 유사한 패턴을 가진 결과를 찾습니다. 예를 들어, abc를 검색하면 axbyc 같은 결과도 같이 찾아줍니다!
대화형 인터페이스 fzf를 실행하면 별도의 터미널 화면이 열리고, 실시간으로 검색어를 입력하면서 결과 목록이 필터링 됩니다
확장성 사용자 정의 스크립트나 외부 명령어와 쉽게 연동하여 기능 확장이 가능합니다

fzf 작동 방식

fzf는 기본적으로 다음의 파이프라인을 통해 작동해요.

데이터 소스 | fzf [옵션] | 선택된 결과 처리
  • 데이터 소스: ls, find, history, ps 등 어떤 명령의 출력이라도 될 수 있습니다.
  • fzf: 표준 입력으로 받은 데이터를 필터링하고, 사용자에게 대화형 인터페이스를 제공하여 선택하게 합니다.
  • 선택된 결과 처리: 사용자가 Enter를 눌러 선택한 항목은 fzf의 표준 출력(stdout)으로 나옵니다. 이 출력을 다른 명령의 인수로 사용하거나 변수에 저장할 수 있어요.

설치

# Debian
sudo apt install fzf

# Arch
sudo yay -S fzf

# Rhel
sudo dnf install fzf

fzf 사용 예제

다양한 활용 예시를 통해 fzf의 기능을 살펴볼게요.


1. 기본 파일 검색

현재 디렉토리와 하위 디렉토리의 모든 파일을 검색합니다.

find . -type f | fzf

2. 디렉토리 이동

cd 명령과 함께 사용하여 디렉토리를 쉽게 이동할 수 있습니다.

fzf를 통해 디렉토리를 선택하고, 해당 디렉토리로 이동하는 함수를 ~/.bashrc 또는 ~/.zshrc에 추가하여 사용해보세요.

# ~/.bashrc 또는 ~/.zshrc 에 추가
fd() {
  local dir
  dir=$(find "${1:-.}" -type d 2> /dev/null | fzf +m)
  [ -z "$dir" ] && return
  cd "$dir"
}

위 코드를 추가한 후 터미널에 fd를 입력하면 현재 디렉토리의 하위 디렉토리를 검색하여 이동이 가능합니다.

추가로 fd ~/project와 같이 인수를 넘겨주면 해당 경로 아래에서 검색합니다.
image


fzf로 대화형 스크립트 구현하기

이번 챕터에서는 fzf를 사용하여 대화형 스크립트 예제를 몇 개 작성해볼게요.


1. 로그 파일에서 패턴 선택 후 검색

#!/usr/bin/bash

# 대규모 로그에서 흔한 패턴 추출
patterns=$(cat /var/log/pacman.log | grep -oE '\b[a-zA-Z]+\b' | sort | uniq)
pattern=$(echo "$patterns" | fzf --prompt="검색할 패턴 선택: ")

echo "선택된 패턴: $pattern"
echo "관련 로그 출력"
grep "$pattern" /var/log/pacman.log | less

image


2. 함수별 실행 메뉴 구현

#!/usr/bin/bash

add_rule() {
    echo "add_rule"
}

insert_rule() {
    echo "insert_rule"
}

main_menu() {
    options=(
        "Add Rule"
        "Insert Rule"
        "Delete Rule"
        "Set Default Policy"
        "Show Current Rules"
        "Exit"
    )
    choice=$(printf "%s\n" "${options[@]}" | fzf --prompt="옵션을 선택하세요: ")

    case "$choice" in
        "Add Rule") add_rule ;;
        "Insert Rule") insert_rule ;;
        "Exit") echo "종료할게요!"; exit 0 ;;
    esac
}

main_menu

image

관련 글

지식 공유3분 읽기

[Linux] Ubuntu 24.04 -> Rocky 10 마이그레이션

개요 기존 홈서버에서 운영 중인 Ubuntu 24.04 서버의 모든 서비스( Docker , Gatsby , 데이터 등등)를 새로운 Rocky 서버로 누락 없이 이관하기 위한 과정을 기록해보려고 합니다. 사전 준비 작업 전에, 양쪽...

리눅스
지식 공유3분 읽기

[Linux] 테스트 서버 디스크 장애 이슈

개요 OS : Rocky 8.10 디스크 구성 /dev/sda : 메인 디스크 /dev/sdb : 백업 디스크 상황 평소에 서버 로그에 READ sda .... , swap 관련 메시지가 간간히 보였음. 어느 날 I/O 관련 로그가...

리눅스
지식 공유1분 읽기

[Linux] SSH Keygen으로 원격 접속 키 생성하기

SSH Key 인증? SSH Key 인증은 비대칭 암호화라는 방식을 사용합니다. 한 쌍의 키(Key Pair)를 생성하여 하나는 내가 가지고 있고(개인 키, Private Key), 하나는 서버에 등록(공개 키, Public Key)...

리눅스