bash script2023. 4. 17. 16:58

 

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

 

grep 명령에 인자로 입력할 문자열을 변수에 할당해서 사용하는 경우, 해당 문자열에 '.', '[' 등 정규표현식에서 사용하는 문자가 포함되면 검색이 제대로 수행되지 않을 수 있다. 우선 아래의 예시를 보자.

# 문자열 'a.data' 검색(문제 발생)
cat my_file.txt | grep "a.data"
a.data=5
a_data=10

grep 명령에서 점(.)은 임의의 문자라는 뜻을 지니기 때문에 "a.data"라는 문자열을 그대로 grep의 인자로 주면 a와 data 사이에 점 이외의 다른 문자가 있어도 다 검색이 된다. 따라서 임의의 문자가 아니라 점으로 해석되도록 하기 위해 아래와 같이 역슬래시(\)를 이용한다.

# 문자열 'a.data' 검색
cat my_file.txt | grep "a\.data"
a.data=5

grep 명령의 인자로 지정할 문자열을 변수에 할당해야 하는 경우에는 문제가 조금 복잡하다. 예를 들어 read 명령으로 문자열을 입력 받은 후에 이것을 grep에 적용하는 상황을 생각해 보자. 예를 들어 IP주소를 입력 받아서 파일에 있는지 찾는다면 입력값에는 반드시 점(.)이 포함될 것이다.

# 키보드로 ip주소를 입력받은 후 my_file.txt에 해당 문자열이 있는지 확인
read ip_addr
cat my_file.txt | grep "$ip_addr"

위의 예시는 문제의 소지가 있다. my_file.txt 파일에서 검색할 IP주소를 read 명령을 통해 키보드로 입력을 받게 되는데, 사용자가 알아서 192\.168\.0\.1 이런 식으로 점(.)에 역슬래시를 포함해 주어야 한다. 아니면 sed 명령을 사용해서 역슬래시를 추가해 주면 되겠다. 아래의 예시를 보자.

read ip_addr
ip_addr_grep=`echo "$ip_addr" | sed 's/\./\\\./g'`
cat my_file.txt | grep "$ip_addr_grep"

사용자 입력에 사용한 ip_addr 변수를 그대로 사용하지 않고 sed 명령을 이용해서 역슬래시를 추가해 주고(. -> \.), 역슬래시가 추가된 문자열을 ip_addr_grep 변수에 할당하여 이것을 grep 명령의 인자로 사용했다.

일반적인 경우 역슬래시를 추가해야 하는 문자가 여러개 있기 때문에 sed 명령에서 여러개의 문자를 동시에 작업해 주어야 하는데, -e 옵션을 활용하면 된다. 이전 게시물을 참고하자. 여기로 

728x90
Posted by 반달가면