WAS Engineer - Linux 6번째

이정빈·2022년 9월 20일
0

리눅스 복습

목록 보기
6/11
post-thumbnail

grep 명령어와 정규 표현식

grep은 문자열을 검색하는 명령어로 활용도가 무척 높다.

  • 문자열 검색

grep [옵션] <검색 패턴> <파일 이름>

grep은 <파일 이름>에서 <검색 패턴>에 일치하는 행을 출력한다.

  • grep에 있는 다양한 옵션 중 많이 사용되는 대표적인 세 가지 옵션

-n은 행 번호를 출력한다.
-i는 대소문자를 구별하지 않고 검색한다.
-v는 검색할 문자열이 나타나지 않는 행을 출력한다.

  1. 정규 표현식이란

grep에서는 일반적인 문자열 외에도 정규 표현식이라는 검색 패턴을 지정할 수 있다. 정규 표현식을 사용하면 조건에 일치하는 문자열 집합을 표현할 수 있다. 예를 들어 cron이라는 문자열로 시작하거나 숫자 없이 알파벳으로만 구성된 문자열 등을 표현할 수 있다.

  • 정규 표현식 ^을 사용하여 cron으로 시작하는 행만 출력

$ ls /etc | grep '^cron'

정규 표현식을 '로 감싼 이유는 정규표현식이 확장하지 않도록 하기 위해서이다.

정규 표현식에서는 *, {, }, $등의 기호가 특별한 의미로 사용된다. 이러한 문자를 메타 문자라 부르며 메타 문자의 대부분은 셸에서도 특별한 의미를 가진다.

따라서 grep에서 정규 표현식을 사용하고 싶을 때는 'ab*'처럼 작은 따옴표로 감싸줘야 한다.

임의의 문자를 지정하는 메타 문자

사용빈도가 높은 메타 문자 .(점). .은 임의의 문자 하나를 의미한다.

메타 문자 .은 알파벳과 숫자뿐만 아니라 기호도 포함한다.

임의의 문자가 아니라 점이라는 기호 자체를 검색하고 싶을 때는 \.라고 표시해야 한다. 메타 문자 앞에 \를 붙이면 메타 문자로 인식되지 않는다.

이렇게 메타 문자 앞에 \를 붙여서 메타 문자로 인식하지 않게 하는 것을 '이스케이프'라 한다.

  1. 특정 문자를 지정하는 메타 문자

임의의 문자가 아니라 여러 문자 중 하나를 지정하고 싶다면 메타 문자 [ ]를 사용해야 한다. 이 메타 문자는 괄호 안에 있는 문자 중 하나를 의미한다.

문자의 범위를 표현하는 하이픈을 사용하여 범위를 지정한다. [a-k]등과 같이 표현한다.

지정한 문자 외에 문자도 찾을 수 있다. 괄호 안에 첫 글자로 ^를 지정하면 된다. 예를 들어 mail[^13]의 경우 mail 뒤에 1과 3 이외의 문자를 의미하여 mail1과 mail3은 검색에서 제외된다.

  • 문자에 대한 메타 문자
메타 문자의미
.임의의 문자 하나
[ ][ ] 안에 포함된 임의의 문자 하나
[^][ ]안에 포함되지 않는 문자
\\다음의 문자를 메타 문자로 인식하지 않는다

위치를 지정하는 메타 문자

위치를 지정하는 메타 문자는 다른 메타 문자와 조합하여 위치를 지정할 때 사용된다.

행의 첫부분을 의미하는 ^으로 시작하는 문자열만 검색하거나 마지막을 의미하는 $을 사용하여 끝나는 행을 검색할 수 있다.

^$을 같이 사용하면 빈 행을 의미한다.

반복을 지정하는 메타 문자

반복을 의미하는 메타문자는 다른 정규 표현식의 뒤에서 사용되어 직전의 정규 표현식이 일정 횟수만큼 반복되는 것을 의미한다. 이 메타 문자는 단독으로 사용되지 않는다.

*은 0회이상의 반복을 의미한다. 0회가 의미하는 것은 직전의 문자가 나타나지 않는 것도 포함한다는 뜻이다.

는 일반 문자뿐만 아니라 메타 문자 뒤에도 사용할 수 있다. 다음과 같이 [ea]라고 쓰면 ea가 0번 이상 반복되는 Beer, Bear, Bar, Br등이 검색된다.

그리고 임의의 문자를 나타내는 .과 함께 .*같은 정규 표현식이 많이 사용된다. 이는 임의의 문자가 0회 이상 반복되는 것을 의미하므로 결국 모든 문자열을 의미한다.

*외에도 반복을 지정하는 메타 문자가 더 있는데 이들은 확장 정규 표현식에 정의되어 있다. 따라서 먼저 확장 정규 표현식이 무엇인지부터 살펴봐야한다.

  1. 확장 정규 표현식이란

지금까지 소개한 정규 표현식은 기본 정규 표현식이라 불리는 것으로 정규 표현식을 지원하는 모든 명령어에서 사용할 수 있다. 그리고 사용할 수 있는 메타 문자가 늘어난 확장 정규 표현식도 있다. 확장 정규 표현식을 지원하지 않는 명령어도 있기 때문에 이 둘을 구별해서 사용해야 한다.

grep은 옵션을 지정하지 않으면 지정한 정규 표현식을 기본 정규 표현식으로 해석한다. 그리고 -E 옵션을 지정하면 확장 정규 표현식으로 해석한다.

리눅스의 grep(GNU grep)은 -E옵션을 붙이지 않아도 메타 문자에 \을 붙여서 일부 확장 정규 표현식을 사용하는 것이 가능하다.

하지만 GNU grep이 아닌 다른 명령어에서는 사용할 수 없기 때문에 이 방법은 추천되지 않는다.

  1. 확장 정규 표현식에서 반복 횟수를 지정

확장 정규 표현식에서 반복을 나타내는 메타 문자로 +와 ?가 있다.

+는 바로 전 문자가 1회 이상 반복되는 것을 의미한다. *와 비슷하지만 0번 나타나는 것은 포함하지 않는다는 점이 다르다. 바로 전의 문자가 최소 1번 이상 나타나는 패턴을 의미한다.

메타 문자 ?는 0회 혹은 1회를 의미한다.

  1. 반복 횟수를 지정하는 메타 문자

지금까지 소개한 *와 같은 메타 문자는 반복 횟수를 지정할 수 없었다. 따라서 반복 횟수를 지정하려면 { }를 사용한다. 이 메타 문자의 사용법은 기본 정규 표현식과 확장 정규 표현식에서 달라서 여기서는 확장 정규 표현식을 기준으로 소개한다.

{m,n}은 m회 이상 n회 이하 반복을 의미한다.

{m}은 정확히 m번 이상 반복되는 패턴을 의미한다.

{m,}은 m회 이상 반복을 의미한다.

  • 반복 횟수를 지정하는 메타 문자
기본 정규 표현식확장 정규 표현식의미
**0회 이상 반복
없음+1회 이상 반복
없음?0회 또는 1회 반복
\{m,n\}{m,n}m회 이상 n회 이하 반복
\{m\}{m}m회 반복
\{m,\}{m,}m회 이상 반복

여기서 +와 ?의 경우, GNP grep에서는 \+나 \?로 써서 기본 정규 표현식으로 사용할 수 있지만, 이는 GNP grep에서만 가능하기 때문에 없음이라고 표시하였다.

그 외의 메타 문자

메타문자 ()는 정규 표현식을 그룹화할 때 사용한다. 예를 들어 Wine이란 네 글자가 2회 이상 반복해서 나타나는 경우를 검색하고 싶을 때 Wine{2,} 같이 지정하면 Wineeeee와 같은 패턴이 검색된다. 이는 메타 문자가 바로 전 문자 하나에 대해 적용되기 때문이다. 이 때 메타 문자 ()로 Wine이라는 네 글자를 한 그룹으로 묶으며 된다. 그래서 (Wine){2,}라고 지정하면 Wine이라는 네 글자가 반복되는 패턴을 검색할 수 있다.

  • Wine이라는 단어가 2회 이상 반복되는 패턴을 검색

$ grep -E '(Wine){2,}' drink.txt
WineWine

메타 문자 | 는 복수의 정규 표현식을 OR 조건으로 연결할 때 사용한다. 예를 들어 abc|xyz는 abc 혹은 xyhz라는 문자열에 해당한다. 메타 문자 |는 보통 그룹화할 때 사용하는 ()와 함께 사용된다. 예를 들어 Vodka|)는 My Vodka 혹은 My Wine이 검색된다.

  • My Vodka 혹은 My Wine을 검색

$ grep -E 'My (Vodka|Wine)' drink.txt
My Vodka
My Wine

정규 표현식 사용하기

정규 표현식은 grep만을 위한 것이 아니다. 다른 많은 명령어와 프로그램에서도 정규 표현식을 사용할 수 있다.

예를 들어 Vim이나 less명령어에서 /를 입력하면 텍스트를 검색할 수 있는데 여기서도 정규 표현식을 사용할 수 있다.

예를 들어 Vim이나 less 명령어에서 /를 입력하면 텍스트를 검색할 수 있는데 여기서도 정규 표현식을 사용할 수 있다.

profile
WAS Engineer, Cloud Engineer(지망)

0개의 댓글