정의
Global Regular Expression Print의 약자
모든 명령어와 가장 조합이 잘되는 명령어 중 하나
기본 포맷
grep [OPTION...] PATTERN [FILE...]
용도
Pipes로 가장 많이 쓰는 명령어일 것이다.
명령을 실행할 때 조건을 넣어 명령을 실행할 때 많이쓴다.
-cpu model 이름 알아내기
아래 예시 결과는 같지만 방법이 다르다.
#1
cat /proc/cpuinfo | grep -i 'Model'
#2
grep -i 'Model' /proc/cpuinfo
이와 같이 명령을 조합해서 쓸 수 있다.
-패키지를 탐색하기 좋은 명령어다.
pattern에 highlight를 주게 된다면
쉽게 파악할 수 있다.
파일 명을 찾거나 파일의 일치하는 부분 찾기
#1. 출력 옵션
#해당 파일에서 word 를 포함하는 line을 출력함★★★★★
grep {word} {filename1,filename2, ...}
cat {file} | grep {word}
grep --color {word} {file}
#해당 내용이 있는 파일 명 출력
grep -H {pattern} *
#해당 파일에서 찾은 패턴 이후로 NUM 번째 라인까지 출력 (after-context)
grep -A {NUM} {pattern} *
#해당 파일에서 찾은 패턴 이전으로 NUM 번째 라인까지 출력(before-context)
grep -B {NUM} {pattern} *
#일치하는 내용이 존재하는 파일 명만 출력★★★★★
grep -l {pattern} *
#일치하는 문자들이 있을 때만 출력(only)★★★★★
grep -o {pattern} *
#search_directory 하위 파일 중에 파일 내용이 search_string 이 있는 라인 출력과 해당 파일 명 출력★★★
find search_directory -type f -exec grep search_string /dev/null {} \;
#위에서 파일 명만 출력★★★
find search_directory -type f -exec grep -l search_string /dev/null {} \;
#모든 현재 디렉토리 전체에서 해당 패턴과 일치하는 파일 명 출력★★
grep -R 'httpd' .
#해당 파일에서 해당 패턴이 몇 번이나 등장하는지 출력★★
grep -c 'nixcraft' frontpage.md
파일에서 정규표현식을 이용하여 필요한 부분 파싱 및 연산★★★★
#2. 검색 제어, 연산
#정규식 사용
#1. abc 뒤에 3자리 숫자 출력
echo "abc-123 test" | grep -E abc-[0-9]{3}
#2. ssh 접속 시도 IP 추출하여 IP 차단
# 해당 로그 : Bad protocol version identification '\003' from 141.98.81.34 port 59559 에서 IP 파싱
grep "Bad pro" /var/log/secure*|grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|grep -v '\\'|uniq > drop-ip.txt
#방화벽에서 차단
sudo bash firewallcmd-drop-client.sh -i 1.2.3.4,11.22.33.44
sudo bash firewallcmd-drop-client.sh -f drop-ip-list
정규 표현식
. | 1개의 문자 매치 (정확히 1개의 문자와 매치) |
* | 앞 문자가 0회 이상 매치 |
{n} | 앞 문자가 정확히 n회 매치 |
{n,m} | 앞 문자가 n회 이상 m회 이하 매치 |
[ ] | 대괄호에 포함된 문자 중 한개와 매치 |
[^ ] | 대괄호 안에서 ^뒤에 있는 문자들을 제외 |
[ - ] | 대괄호 안 문자 범위에 있는 문자들 매치 |
() | 표현식을 그룹화 |
^ | 문자열 라인의 처음 |
$ | 문자열 라인의 마지막 |
? | 앞 문자가 0 또는 1회 매치 (확장 정규 표현식) |
+ | 앞 문자가 1회 이상 매치 (확장 정규 표현식) |
| | 표현식 논리 OR (확장 정규 표현식) |
대상 파일에서 문자열 검색 grep "STR" [FILE]
현재 디렉토리 모든 파일에서 문자열 검색 grep "STR" *
특정 확장자를 가진 모든 파일에서 문자열 검색 grep "STR" *.ext
대소문자 구분하지 않고 문자열 검색 grep -i "STR" [FILE]
매칭되는 PATTERN이 존재하지 않는 라인 선택 grep -v "STR" [FILE]
단어(Word) 단위로 문자열 검색 grep -w "STR" [FILE]
검색된 문자열이 포함된 라인 번호 출력 grep -n "STR" [FILE]
하위 디렉토리를 포함한 모든 파일에서 문자열 검색 grep -r "STR" *
최대 검색 결과 갯수 제한 grep -m 100 "STR" FILE
검색 결과 앞에 파일 이름 표시 grep -H "STR" *
문자열 A로 시작하여 문자열 B로 끝나는 패턴 찾기 grep "A.*B" *
0-9 사이 숫자만 변경되는 패턴 찾기 grep "STR[0-9]" *
문자열 패턴 전체를 정규 표현식 메타 문자가 아닌
일반 문자로 검색하기 grep -F "*[]?..." [FILE]
정규 표현식 메타 문자를 일반 문자로 검색하기 grep "\*" [FILE]
문자열 라인 처음 시작 패턴 검색하기 grep "^STR" [FILE]
문자열 라인 마지막 종료 패턴 검색하기 grep "$STR" [FILE]
Options
엄청 많다.
사용이 그래도 되는 명령어들로 뽑자면
-E | 확장 정규표현식 사용 |
-F | 고정 패턴 매칭 |
-e | 패턴 매칭 |
-f | 파일에 기록된 내용을 PATTERN으로 사용 |
-w | 단어 단위로 매칭 |
-x | 라인 단위로 매칭 |
-h | 검색 결과 출력 시, 파일 이름 무시 |
-r | 하위 디렉토리 탐색 |
-l | 패턴이 존재하는 파일 이름만 표시 |
-c | 파일 당 패턴이 일치하는 라인의 갯수 출력 |
--color | 패턴에 매칭하는 부분 하이라이트 |
-o | 매치되는 문자열만 표시 |
-i | 대/소문자 무시 |
-n | 검색 결과 출력 라인 앞에 라인 번호 출력 |
-H | 검색 결과 출력 라인 앞에 파일 이름 표시 |
-q | 검색 결과 출력하지 않음 |
-L | 패턴이 존재하지 않은 파일 이름만 표시 |
-R | 심볼릭 링크를 따라서 모든 하위 디렉토리 탐색 |
-z | 라인을 newline이 아닌 NULL로 구분 |
-v | 매칭되는 패턴이 존재하지 않는 라인 선택 |
참고
최근에 Rust로 만들어진 ripgrep이 더 빠른 성능을 자랑한다고 함
참고링크
https://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/
https://www.lesstif.com/lpt/grep-ripgrep-119963754.html
'SRE > Linux Basics' 카테고리의 다른 글
PackageManager (0) | 2022.12.03 |
---|---|
tar (0) | 2022.12.02 |
rsync, 원격으로 동기화 (0) | 2022.12.02 |
cron, 크론탭 (0) | 2022.12.02 |
cut, 문자열 자르기 (0) | 2022.12.02 |