반응형

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은 해당 열에 찾고 싶은 문자열이 있는지를 찾는 명령어 입니다.

 

<sample.txt>

root@ubuntu:/shell# cat sample.txt
I am a boy
I am a girl

<grep.sh>

root@ubuntu:/shell# cat grep.sh
#!/bin/bash

cat $1 |grep boy

root@ubuntu:/shell# ./grep.sh sample.txt
I am a boy

보시는 바와 같이 grep을 사용하면 boy가 있는 문자열을 찾게 됩니다.

 

다음은 cut입니다. cut을 활용하게 되면 구분자(char)를 이용하여 문자열을 추출하게 됩니다. 다시말하면 열로서 구분을 한다는 의미입니다. 여기서 중요한 점은 구분자 한글자이여야만 됩니다. 예를 들면 csv 파일 같은 형식에 적합하겠습니다.

 

<sample.csv>

root@ubuntu:/shell# cat sample.csv
name,category,score
choi,math,90
park,english,80
kim,korean,100

<cut.sh>

root@ubuntu:/shell# cat cut.sh
#!/bin/bash

cat $1 |cut -d',' -f1

root@ubuntu:/shell# ./cut.sh sample.csv
name
choi
park
kim

 

마지막으로는 awk 입니다. cut과는 다르게 파라미터 단위로 파싱을 하게 됩니다. 예제 파일을 통해 확인 해보겠습니다

<sample1.csv>

root@ubuntu:/shell# cat sample1.csv
name       category               score
choi   math             90
park         english           80
kim    korean          100

<cut.sh>

root@ubuntu:/shell# cat awk.sh
#!/bin/bash

cat $1 |awk '{print $1}'

root@ubuntu:/shell# ./awk.sh sample.csv
name
choi
park
kim

보시는 바와 같이 불규칙한 공백이 있는 파일에서 공백을 기준으로 파라미터화 해서 원하는 출력을 뽑아내는 모습을 확인 할 수 있습니다.

 

반응형

+ Recent posts