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 |