반응형

1. 숫자 4개로 시작하는 줄 뽑아내기

grep ^[0-9][0-9][0-9][0-9] textfile
grep -E "^[0-9]{4}" textfile

  하지만 이 조건만으로는 4자리로 시작하기만 하면 무조건 걸려나옵니다. } 문자 뒤에 공백을 하나 넣어서 처리할 수 있지만 좀 더   좋은 방법은 "단어 단위" 기능(<와 >)을 사용하는 것입니다.

$ grep '\<[0-9]\{4\}\>' textfile
2010
2013 is turning out to be a better year

  다만 이 방법을 사용할 때 주의할 점이 있습니다. 아래를 보시죠.

$ grep '\<[0-9]\{3,5\}\>' textfile
2010
2013 is turning out to be a better year
12345 Taylor Avenue
127.0.0.1

  다른 건 괜찮았는데 마지막에 IP 주소가 걸려 나왔습니다. 숫자 뒤에 문자가 나오는 경우도 "단어의 끝"으로 취급하기 때문입니다. 단어 단위로 걸러낼 때는 이런 사항도 고려해야 합니다.

2. IP 주소 뽑아내기
  IP 주소를 검출하는 게 은근히 생각보다 까다롭습니다. 먼저 특정 IP를 찾는 것부터 시작하겠습니다. 생각없이 그냥 지르면 이런 모습이 나옵니다.

$ grep 12.45.78.0 text
1234567890
12.45.78.0

  정규 표현식에서 점(.)은 하나의 문자를 뜻하니까요. 이럴 땐 -F 옵션(fixed string)을 사용하거나, fgrep 명령어를 사용하거나, 이스케이프 문자를 사용해야 합니다. 처음 두 방법은 사실상 같은 거나 다름없습니다.

$ grep -F 12.45.78.0 text
12.45.78.0
$ fgrep 12.45.78.0 text
12.45.78.0 
$ grep "10\.20\.30\.40" textfile
Don't use the 10.20.30.40 address unless you first talk to Pete.

  이제 IPv4 주소 형식을 띈 문자열을 잡아내는 패턴의 예를 보겠습니다.

$ grep -w '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' textfile
127.0.0.1
Don't use the 10.20.30.40 address unless you first talk to Pete.
Refer to Section 11.2.3.4.20 for the process guidelines.

  마지막에 엉뚱한 게 나왔듯이 위의 방법도 완벽하진 않습니다만 여기서 더 발전시켰다간 필요 이상으로 복잡해지기 때문에 이 정도로 끝내는 게 적절할 것 같습니다.

반응형
반응형

Grep의 사용방법에 대해서 알아보는 시간을 갖도록 하겠습니다.

 

grep은 리눅스/유닉스 환경에서 문자열을 파싱할 수 있는 명령어 입니다. 이것을 잘활용하면 많은 효과를 볼 수 있는데 이에 대해 알아보는 시간을 갖도록 하겠습니다.

 

기본 옵션

1. -n : 파일 안에서의 패턴에 발견된 라인 및 라인 번호

2. -v : 패턴이 발견되지 않은 라인을 출력

3. -i : 대소문자 무시 (ignore)

4. -l : 패턴이 들어 있는 파일 이름만 출력

5. -c : 패턴이 들어있는 라인 번호의 개수

 

<옵션 분석>

1. grep 

root@ubuntu:~# grep root /etc/group
root:x:0:

2. grep -v : 해당 패턴을 제외한 결과 행을 출력

root@ubuntu:~# grep -v root /etc/group
daemon:x:1:
bin:x:2:
sys:x:3:

 

3. grep -c : 해당 패턴이 들어간 행의 개수를 카운트하여 출력
root@ubuntu:~# grep -c root /etc/group
1

4. grep -l : 해당 패턴을 대상 파일에 존재하는지를 판단하고 존재한다면 대상 파일명을 출력

root@ubuntu:~# grep -l root /etc/group /etc/hosts /etc/passwd
/etc/group
/etc/passwd

5. grep -i :  대소문자를 구별하지 않고 패턴에 해당하는 문자가 포함된 행을 출력

root@ubuntu:/shell# grep -i boy sample.txt
I am a boy
Boy have a robot

<특수문자>

1. 사각괄호 ([ ]) : [ ] 안에 들어 있는 검색을 모두 수행한다.

2. 마침표 ( . ) : 한 문자를 대신한다. 대신한 문자는 모든 문자로 간주 검색을 한다.

3. 괄호안의 대시 ( [ - ] ) :  - 괄호 안의 무자 잡합의 문자 범위를 지정한다.

4. 탈자기호 ( [ ^ ] ) : ^ 특정 조건에 속하지 않은 문자열을 출력한다.

5. 별표 ( * ) : * 지정한 문자열이 0, 1 , 수 차례 반복된다는 의미

6. 행시작(^)끝($) : ^ 괄호 밖의 탈자기호는 행 시작부만 검색한다는 의미이고 $는 지정한 문자열로 끝나는 행만 검색

 

<특수문자 활용>

1. 사각괄호 ([ ]) : [ ]안의 안의 문자집합을 모두 검색해 출력한다.

root@ubuntu:/shell# grep [bg] sample.txt
I am a boy
Boy have a robot
Robot is a blue
You are a girl
root@ubuntu:/shell# grep [BG] sample.txt
Boy have a robot
Girl have a doll

 

2. - 의 사용

root@ubuntu:/shell# grep [a-z]oy sample.txt
I am a boy
root@ubuntu:/shell# grep [a-z]irl sample.txt
You are a girl
root@ubuntu:/shell# grep [A-Z]irl sample.txt
Girl have a doll
root@ubuntu:/shell# grep [A-Z]oy sample.txt
Boy have a robot
root@ubuntu:/shell# grep [A-Za-z]oy sample.txt
I am a boy
Boy have a robot

 

3. . 의 사용 : . 은 한 문자를 대신하여 그에 속한 모든 문자(공백 포함)를 출력

root@ubuntu:/shell# grep b.y sample.txt
I am a boy
root@ubuntu:/shell# grep b.. sample.txt
I am a boy
Boy have a robot
Robot is a blue
root@ubuntu:/shell# grep b... sample.txt
Robot is a blue
root@ubuntu:/shell# grep b.... sample.txt
Robot is a blue
root@ubuntu:/shell# grep b.... sample.txt

4. [ ] 안의 ^의 사용 : 이것은 혼자 쓰이는 ^와는 다르다. ^은 포함하지 않는 문자열을 검색

root@ubuntu:/shell# grep b[^o]y sample.txt
root@ubuntu:/shell# grep b[^a]y sample.txt
I am a boy
root@ubuntu:/shell# grep [^b]oy sample.txt
Boy have a robot

 

5. *의 사용 : *은 반복을 나타내는 연산 중 하나이다. 파일 검색과는 조금 다르니 혼단하지 말았으면 합니다. 정규연산식에서 *은 지정한 문자열이 반복되는 반복되지 않든 모두 검색하라는 것이다.

root@ubuntu:/shell# grep b*oy sample.txt
I am a boy
Boy have a robot
root@ubuntu:/shell# grep bo*y sample.txt
I am a boy

6.  [ ] 밖의 ^사용 : ^는 지정한 검색 문자열로 시작하는 행만을 검색하여 반환합니다.

root@ubuntu:/shell# grep ^I sample.txt
I am a boy
root@ubuntu:/shell# grep ^B sample.txt
Boy have a robot
root@ubuntu:/shell# grep ^I sample.txt
I am a boy

 

7. $의 사용 : $는 지정한 검색 문자열로 끝나는 행만을 검색하여 반환

root@ubuntu:/shell# grep boy$ sample.txt
I am a boy
root@ubuntu:/shell# grep girl$ sample.txt
You are a girl


 

 

반응형

+ Recent posts