반달가면 이글루에서 백업 - 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"
'bash script' 카테고리의 다른 글
[bash: sort, awk] 중복되는 행 제거하기 (0) | 2021.07.20 |
---|---|
[bash: head] 여러개의 파일 내용을 출력하면서 파일명 함께 출력하기 (0) | 2021.07.13 |
[bash: stat, date] 현재 파일이 전송되고 있는 중인지 판단하기 (0) | 2021.06.28 |
[bash: if, test] 파일 또는 디렉토리 존재 유무 확인 (0) | 2021.06.08 |
[bash: grep] 문자열 검색과 파일명 확인의 조합 (0) | 2021.05.10 |