bash script2021. 7. 6. 17:32

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/518271

 

정규표현(regular expression)을 이용하면 grep이나 sed에서 특정한 길이의 문자열에 대한 작업을 할 수 있다. 아래의 예시를 보자. my_file.txt 파일에서 영문 소문자로만 되고 길이가 5바이트(byte)인 행만 출력하는 경우이다.

 

cat my_file.txt | grep "^[a-z]\{5\}$"

 

중괄호({}) 안에 수자를 넣어서 바로 앞 표현이 얼만큼 반복되는지 지정할 수 있다. 중괄호가 shell에서 처리되는 것을 막고 grep 명령에 온전하게 인자로 전달되도록 역슬래시(\)로 보호해 준다. 중괄호를 이용한 반복 설정은 아래와 같다.

 

{n} 바로 앞의 항목이 정확히 n번 반복되는 경우

{n,} 최소 n번 이상 반복

{,m} 최대 m번 반복

{n,m} 최소 n번 이상, 최대 m번 반복

 

예시를 하나 더 보자. my_file.txt에서 영문 대소문자로 된 5바이트 이상 10바이트 이하 문자열이 있는 행만 출력하는 경우이다.

 

cat my_file.txt | grep "[[:alpha:]]\{5,10\}"

 

이 기능을 이용해서 2개 이상의 문자열이 동시에 포함된 행을 골라낼 수도 있다. 예를 들어 한 행에 abc와 def가 모두 있으면서 abc가 나온 후에 def가 나오는 문자열이 있는 부분을 찾는 경우이다. 아래의 예시를 보자.

 

cat my_file.txt | grep "abc[[:print:]]\{0,\}def"

 

위의 예시에서 grep 명령의 인자를 해석해 보자면, 문자열 abc 이후에 출력 가능한 문자([[:print:]])가 0번 이상(\{0,\}) 나온 후에 def가 나오는 경우를 찾아서 출력하라는 것이다.

 

2개 이상의 문자열이 동시에 포함된 행을 찾는 경우는 grep 명령을 파이프(|)로 연결하여 연속해서 사용할 수도 있다.

 

cat my_file.txt | grep "abc" | grep "def"

 

그러나, -v 옵션을 통해서 2개 이상의 문자열이 동시에 포함된 행을 제외하는 경우는 중괄호를 사용해야 한다.

 

# 검색한 문자열이 포함된 행을 제외(-v 옵션)

cat my_file.txt | grep -v "abc[[:print:]]\{0,\}def"

 

 

 

728x90
Posted by 반달가면