grep , sed, awk 정규식

OS/리눅스 & 유닉스 2012. 1. 5. 08:33
정규식이란 무엇인가 ? 
어떤 문자열의 집합을 묘사하는데 사용되는 텍스트 스트링 
정해진 구문 규칙에 따른다 
Editor, Utillity, Programming 언어에서 텍스트 패턴을 기준으로 검색, 혹은 조작하는데 사용된다 
보통 사람들이 쓰는 표현 중에도 그대로 문장을 해석하면 안 되는 관용구나, 숙어 같은 것 이 있듯이 컴퓨터도 동일하게 해석 하면 안되는 구문이 있는데, 이것을 정규식이라 한다

문자

의미

^

줄의 시작을 나타내지만 문맥에 따라서는 정규 표현식에서는 문자 집합의 의미를 반대로 해석해준다 
ex) ^root 행의 제일 처음이 root 
                [^a-z] : 소문자 제외 
           [^a-z A-Z] : 알파벳 제외

*

바로 앞의 문자열이나 정규 표현식에서 0개 이상 반복되는 문자를 나타낸다 
ex) 1133* : 113(o), stuadun(x), studenttttt(o), studenttyt(x) 
        / 1* : 아무 것도 없거나, 1이 하나 이거나, 1이 반복되거나 
find ./test* :test로 시작하는 모든 것 
            * : 전부 다 
          [ ]* : 집합 포함하고

.

새로운 라인을 제외한 오직 한 개의 글자와 일치 (space, tab 포함)
ex) st.den : .에는 아무 글자나 와도 된다 
        a..b : a로 시작하고 b로 끝나는 5글자

$

줄의 끝과 일치하며, ^$의 경우 빈 줄과 일치함

[…]

문자들을 집합으로 묶어 줌(한 음절씩 매칭)
ex) [a-z] : 소문자 중 하나라도 일치 
[a-z A-Z] : 소문자나 대문자

\

다음 사용을 위해 태그를 붙인다. (최대 9개)
ex) \$ : 정규 표현시에서 줄의 끝을 나타내는 의미대신 문자 그대로

\(……\)

다음 사용을 위해 태그를 붙인다. (최대 9개)
ex) \(pquhg\) .. .. .. .. .. \(aough\)
\1 \2

\<

단어의 시작 지시자

\>

단어의 끝 지시자

X\{n\}

문자 X를 n번 반복

X\{n,\}

문자 X를 적어도 n번 반복

X\{m,n\}

문자 X를 m번에서 n번 반복 
ex) \<[a-z]\{4,5\}\> : 소문자를 4번에서 5번 반복하는 거

GREP 
파일 전체를 뒤져 정교 표현식에 대응하는 모든 행들을 출력 
기본 형식 : grep 'word' [filename] 
ex) env | grep 'HOSTNAME' : 환경 변수 중에서 HOSTNAME을 찾음 
Grep root /etc/shadow : /etc/shadow 파일에서 root라는 단어를 찾음

문자

의미

-b

검색 결과의 행 앞에 검색된 위치의 블록 번호 표시 
검색내용이 디스크의 어디 쯤 있는지 위치를 알아내는데 유용

-c

검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력 
ex) grep -c 'woo' file : woo라는 단어가 포함된 행의 총수를 출력

-h

파일 이름을 출력하지 않음

-i

대소문자를 구분하지 않음 (동일 취급)
ex) grep -i | 'sexy' file : 문자열 sexy가 어떠한 대소문자 조합으로 이루어져 있더라도 찾는다

-l

패턴이 존재하는 파일의 이름만 출력 
ex) grep -l 'FU' * : 모든 검색 범위안에서 'FU'라는 단어가 들어가 있는 파일의 이름만 출력

-n

파일 내에서 행, 번호 출력 
ex) grep -n '^hole' file : 파일에서 시작이 hole로 시작하는 행, 번호 출력 
grep -n '^root' /etc/shadow : 루트로 시작하는 행, 번호 출력

-v

패턴이 존재하지 않는 행만 출력 
ex) grep -v 'root' file > temp 
Mv temp file : root가 포함되지 않는 모든 행 출력 (특정 내용 삭제하는데 좋다)

-w

패턴 표현식을 하나의 단어로 취급하여 검색 
ex) grep -w 'me' file : 딱 me라는 단어가 있는 경우에만 찾음

grep + 정규식 
ex) grep '[a-z]\{9\}' file : 소문자가 적어도 9개 이상 연속적으로 나오는 문자열을 포함한 모든 행을 출력 
grep '\<a-z].*h\>' file : 소문자 하나로 시작하고, 이어서 임의의 수 여러문자가 나오며 h로 끝나는 단어가 포함된 모든 행 출력 
grep '\.bak$' file : .bak으로 끝나는 행을 출력 . 작은 따음표는 $의 해석을 막는다 
grep '[A-Z]…[0-9]' file : 대문자로 시작하고 숫자로 끝나는 다섯문자의 열이 포함된 행을 출력 
ps -ef | grep "^"denodo" : user1로 시작하는 행을 검색하며 denodo앞에 0개 혹은 임의의 수 공백이 와도 상관 없다   

EGREP 
Grep에서 제공하지 않는 확장된 정규 표현식 메타 문자 사용 
기본 형식 : egrep 'word' [filename]

문자

의미

+

선행 문자와 같은 문자의 1개 혹은 임의 개수와 대응 (1개 이상)
ex) egrep '1+' file : 숫자 1이 한번 이상 등장하는 행을 출력 
Egrep 'yes+' file : yes가 한번 이상 연속해서 나오는 행 출력

?

성행 문자와 같은 문자의 0개 혹은 1개와 대응 
ex) egrep '2\.?[0-9]' file : 숫자 2 다음에 마침표가 없거나 한번 나오고, 다시 숫자 하나가 오는 행을 출력

a | b

a혹은 b와 대응 
ex) egrep 'WM|M' file : WM나 M이 포함된 행을 출력 
Egrep 'S[s|x]' file : 문자 S다음에 s나 x가 오는 행 출력

( )

정규 표현식을 묶어준다

FGREP 
fgrep은 grep명령어와 도일하게 동작하지만 정규표현식 메타문자들을 특별히 취급하지 않는다 
기본형식 : fgrep '문자열' [filename] 
ex) fgrep '[A-Z] … [0-9]' filename : 문자 [A-Z] … [0-9] 자체를 포함하는 문자열을 찾는다

AWK 
기본형식 : awk 'patten' filename 조건 
awk '{action}' filename 몇번째 필드 
awk 'pattern {action}' filename 무슨 조건에 몇 번째 필드 
1 (필드) 개행으로 구분한다 
2 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어 
3 입력 데이터로는 표준 입력, 여러 개의 파일 또는 다른 프로세스의 결과를 사용 할 수 있다 
4 사용자가 지정한 패턴 검색이나 특별한 작업수행 위해 파일을 행 단위로 조사한다 
5 $0은 모든 필드

awk '{print $1}' file

파일의 첫 번째 필드를 출력한다, 첫 번째 필드는

각 행의 맨 왼쪽 경계에서 시작 공백문자로 구분

awk '/BRAVE/{printf $1, $2}' file

파일에서 BRAVE를 포함하는 행들의 첫 번째와 두 번째 필드를 출력

df | awk '$2 > 5000 '

df ( 현재 디바이스 정보 ) 명령어를 통해 출력되는 내용 중 두 번째 필드가 5000보다 큰행을 출력

date | awk '{print "Month : $2\n Year"$6}'

date 명령어를 통해 출력되는 두 번째 필드와 여섯번 째 필드를 서로 개행 하여 출력

awk '{print NR, $1, $3|' file

NR(하나의 레코드를 처리한 뒤 1 이 증가하는 변수)을 사용하여 레코드 번호와 함께 파일의 내용대로 출력

awk -F : '/root/{print $0}' /etc/passwd

" : " 구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력

awk -F : '\^[ns]\{print $1}' file

N이나 s로 시작하는 행의 첫 번째 필드를 출력

awk -F '[\t]' '{print $1, $2, $3}' employees

Tab 으로 필드를 구분하며 첫 번째, 두 번째, 세 번째, 필드를 출력한다 (작은 따옴표는 쉘이 대괄호를 해석 할까봐)

awk '$1 ~ /[bB]ill/' employees

~는 특정 레코드나 필드 내에서 일치하는 정규 표현식 패턴이 존재하는지 검사 위해 쓰인다

awk '$1 !~ /ly$' employees

첫 번째 필드가 ly로 끝나지 않는 행들을 출력

awk '$4 ~ /Chin$/{print "The price is $"$8"."}' file

네 번째 필드가 Chin으로 끝나는 문자열 The price is$와 여덟 번째 필드 및 마침표를 함께 출력 한다

SED 
기본 형식 : sed 'comman; filename(s) 
(p : 출력, d : 삭제, r : 파일로부터 사용자 지정행만 읽음, w : 사용자가 선택한 행을 파일에 저장, -n : 변경된 행만, 
a : 내용 추가, i : 내용 삽입) 
1 대화형 기능이 없는 편집기 
2 쉘 리다이렉션을 이용하여 편집 결과를 저장하기 전 까지는 파일에 아무런 변경도 하지 않는다 
3 쉘 스크립트를 작성할 때 유용하다 
4 pattern space라는 임시 버퍼를 사용한다

sed '1,2p' file

file의 1행에서 2행까지 출력

sed -n '/root/p' /etc/passwd

기본적으로는 모든 행을 출력, root에 있는게 다시 출력되므로, -n을 통해 기본적으로 출력되는 행을 막는다

sed '3d' file

3번째 행을 삭제하여 출력한다 ( 기본적 출력에서 3개 없애는 것이므로, -n 없어야 됌 )

sed 'bash/d' /etc/passwd

bash를 포함하는 모든 행 삭제하고, 나머지 행들을 출력

sed -n 's/bash/nologin/gp' etc/passwd

bash가 nologin으로 치환되며, -n과 p로 변경된 행만 출력, g로 전역치환

sed -e '5.40d' e 's/root/chgroot/g' /file

-e 옵션이 sed 명령어 하나로 다중 편집을 가능하게 해준다 ( 결과 : 1~4만 출력)

sed '/sexy/r newfile' file

r 명령어는 파일로부터 사용자가 지정한 행을 읽어온다. 
newfile 내용은 file에서 패턴을 찾은 곳에 삽입 된다 (file에서 sexy밑에 newfile 삽입)

sed -n '/central/w outfile' file

w 명령어는 사용자가 선택한 행들을 파일에 저장한다 (file에서 central이 있으면 output에 저장된다)

sed /note/a\ > hi' file

a 명령어는 내용을 덧붙일 때, 사용한다 (append)

sed '/note/i\ > woo'file

i 명령어는 삽입 명령어임. 지정한 문장을 매칭되는 행 위에 삽입한다

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

vi 에디터 문자열 치환  (0) 2012.01.09
sed 편집기  (0) 2012.01.05
SED 스트림 에디터  (0) 2012.01.04
Bash 스크립팅 가이드  (0) 2012.01.04
유닉스 itoa 구현  (0) 2011.12.30
: