find grep 스크립트 ffgrep
본문 바로가기
Linux/Shell Script

find grep 스크립트 ffgrep

by bsp-martin 2021. 12. 24.

 

find 에 대한 옵션은 다음과 같다.

TAG: find option find usage find 옵션

find [OPTION...] [PATH] [EXPRESSION...]
  OPTION
    -P        : 심볼릭 링크를 따라가지 않고, 심볼릭 링크 자체 정보 사용.
    -L        : 심볼릭 링크에 연결된 파일 정보 사용.
    -H        : 심볼릭 링크를 따라가지 않으나, Command Line Argument를 처리할 땐 예외.
    -D        : 디버그 메시지 출력.
  EXPRESSION
    -name     : 지정된 문자열 패턴에 해당하는 파일 검색.
    -empty    : 빈 디렉토리 또는 크기가 0인 파일 검색.
    -delete   : 검색된 파일 또는 디렉토리 삭제.
    -exec     : 검색된 파일에 대해 지정된 명령 실행.
    -path     : 지정된 문자열 패턴에 해당하는 경로에서 검색.
    -print    : 검색 결과를 출력. 검색 항목은 newline으로 구분. (기본 값)
    -print0   : 검색 결과를 출력. 검색 항목은 null로 구분.
    -size     : 파일 크기를 사용하여 파일 검색.
    -type     : 지정된 파일 타입에 해당하는 파일 검색.
    -mindepth : 검색을 시작할 하위 디렉토리 최소 깊이 지정.
    -maxdepth : 검색할 하위 디렉토리의 최대 깊이 지정.
    -atime    : 파일 접근(access) 시각을 기준으로 파일 검색.
    -ctime    : 파일 내용 및 속성 변경(change) 시각을 기준으로 파일 검색.
    -mtime    : 파일의 데이터 수정(modify) 시각을 기준으로 파일 검색.

 

grep 

  grep [OPTION...] PATTERN [FILE...]
    -E  : PATTERN을 확장 정규 표현식(Extended RegEx)으로 해석.
    -F  : PATTERN을 정규 표현식(RegEx)이 아닌 일반 문자열로 해석.
    -G  : PATTERN을 기본 정규 표현식(Basic RegEx)으로 해석.
    -P  : PATTERN을 Perl 정규 표현식(Perl RegEx)으로 해석.
    -e  : 매칭을 위한 PATTERN 전달.
    -f  : 파일에 기록된 내용을 PATTERN으로 사용.
    -i  : 대/소문자 무시.
    -v  : 매칭되는 PATTERN이 존재하지 않는 라인 선택.
    -w  : 단어(word) 단위로 매칭.
    -x  : 라인(line) 단위로 매칭.
    -z  : 라인을 newline(\n)이 아닌 NULL(\0)로 구분.
    -m  : 최대 검색 결과 갯수 제한.
    -b  : 패턴이 매치된 각 라인(-o 사용 시 문자열)의 바이트 옵셋 출력.
    -n  : 검색 결과 출력 라인 앞에 라인 번호 출력.
    -H  : 검색 결과 출력 라인 앞에 파일 이름 표시.
    -h  : 검색 결과 출력 시, 파일 이름 무시.
    -o  : 매치되는 문자열만 표시.
    -q  : 검색 결과 출력하지 않음.
    -a  : 바이너리 파일을 텍스트 파일처럼 처리.
    -I  : 바이너리 파일은 검사하지 않음.
    -d  : 디렉토리 처리 방식 지정. (read, recurse, skip)
    -D  : 장치 파일 처리 방식 지정. (read, skip)
    -r  : 하위 디렉토리 탐색.
    -R  : 심볼릭 링크를 따라가며 모든 하위 디렉토리 탐색.
    -L  : PATTERN이 존재하지 않는 파일 이름만 표시.
    -l  : 패턴이 존재하는 파일 이름만 표시.
    -c  : 파일 당 패턴이 일치하는 라인의 갯수 출력.

 

Find 와 Grep 의 Combination 을 소개한다.

> find로 찾은 파일들에 대해서만 grep 을 수행하기 위한 방법 소개

 

1. 표준 입력을 이용하는 방법

find . -name "[FILE]" | xargs grep --color=auto -En "[PATTERN]"

2. find 의 exec 옵션을 이용하는 방법

find . -name "[FILE]" -exec grep "[PATTERN]" '{}' \;

 

 

BM이 만들어 사용하는 스크립트를 소개한다.

 

이는 .bashrc 에서 실행가능한 스크립트들을 모아둔 ~/bin 폴더에 담아두어 주로 사용하는 shell command 이다.

따라서 export PATH=~/bin:$PATH 를 .bashrc 에 적어두면 매번 사용하기 편리하다.

#!/bin/bash

source ~/bin/print.sh
USE_TIME=false

function usage {
  echo " /**"
  echo "  * ffgrep"
  echo "  **/                           made by Martin Hyun"
  echo "";
  echo "   Usage: need two args, always '*' added prefix";
  echo "   bp)  ffgrep [file pattern] [grep pattern]";
  echo "   ex)  ffgrep .mk CONFIG_I2C";
  echo "   mean)=> ffgrep '*.mk' CONFIG_I2C (see '*'added)";
  echo "";
  exit
}

if [ -z $1 ];
then
  usage
elif [ -z $2 ];
then
  usage
else
  CMD="find . -name '*${1}' | xargs grep --color=auto -En '${2}'"
  echo $CMD
  eval $CMD
  #find . -name '${1}' | xargs grep --color=auto -n "${2}"
fi

사용방법은 ffgrep 을 쳐보면 바로 나온다

martin@VMI:~/bin$ ffgrep
 /**
  * ffgrep
  **/                           made by Martin Hyun

   Usage: need two args, always '*' added prefix
   bp)  ffgrep [file pattern] [grep pattern]
   ex)  ffgrep .mk CONFIG_I2C
   mean)=> ffgrep '*.mk' CONFIG_I2C (see '*'added)

 

수많은 Makefile 중에서 LD 라는 항목을 찾는다고 예를들면 다음과 같이 입력하면 된다.

ffgrep Makefile LD

<ffgrep 결과예시>

./u-boot-2014.07/board/sandburst/metrobox/Makefile:12:ccflags-y += -DBUILDUSER='"$(shell whoami)"'
./u-boot-2014.07/board/sandburst/karef/Makefile:13:ccflags-y += -DBUILDUSER='"$(shell whoami)"'
./u-boot-2014.07/board/xilinx/zynq/Makefile:11:obj-$(CONFIG_SPL_BUILD) += \
./u-boot-2014.07/board/compulab/cm_t54/Makefile:10:obj-$(CONFIG_SPL_BUILD) += mux.o spl.o
./u-boot-2014.07/board/compulab/cm_t335/Makefile:10:obj-$(CONFIG_SPL_BUILD) += mux.o spl.o
./u-boot-2014.07/board/sandisk/sansa_fuze_plus/Makefile:8:ifndef        CONFIG_SPL_BUILD
./u-boot-2014.07/board/siemens/pxm2/Makefile:14:ifdef CONFIG_SPL_BUILD
./u-boot-2014.07/board/siemens/pxm2/Makefile:19:ifndef CONFIG_SPL_BUILD
./u-boot-2014.07/board/siemens/draco/Makefile:14:ifdef CONFIG_SPL_BUILD
./u-boot-2014.07/board/siemens/draco/Makefile:19:ifndef CONFIG_SPL_BUILD
./u-boot-2014.07/board/siemens/rut/Makefile:14:ifdef CONFIG_SPL_BUILD
./u-boot-2014.07/board/siemens/rut/Makefile:19:ifndef CONFIG_SPL_BUILD
./u-boot-2014.07/board/BuR/tseries/Makefile:10:ifeq ($(CONFIG_SPL_BUILD),y)
./u-boot-2014.07/board/BuR/kwb/Makefile:10:obj-$(CONFIG_SPL_BUILD) += mux.o
./u-boot-2014.07/board/isee/igep0033/Makefile:9:ifdef CONFIG_SPL_BUILD
./u-boot-2014.07/board/ti/sdp4430/Makefile:10:ifndef CONFIG_SPL_BUILD

 

이런분들에게 추천한다.

- 주로 사용하는 명령들이 복잡하고 일일치 typing 이 어려울때

- 자주 사용하는 명령이 외워지지 않을때

 

 

특정파일에서 패턴을 찾는 FIND | GREP 명령이 단순화되는것을 보여준다.

FIND/GREP 의 다음의 명령을 보자.

ffgrep 으로 단순화된 명령을 보자.

Linux shell 에서 find & grep 과 ffind 의 결과는 동일하다.

(1) find & grep

  ex) find . -name "*.sh" | xargs grep --color=auto -En "time"

(2) ffgrep

  ex) ffgrep .sh time

 

위처럼 Type 이 매우 줄기때문에,

직접 타이핑 하며 기쁨을 느낄수있는 사람도 있다고 생각되지만

 

혹시나 실수로 인해 개발의 지연을 야기할수있음을

그리고 단순한 command 로 시간적 효율을 취하고싶은 분들께 추천 드린다.

반응형

'Linux > Shell Script' 카테고리의 다른 글

Swap script  (0) 2021.12.24
xxd 를 이용한 grep command 만들기  (0) 2021.12.24

댓글