[scrap] grep , sed, awk 정규식

** grep 한 데이터 중 3번째 항목만 가져 오고 싶을때..

grep “.xml” | awk ‘print {$3}’

정규식이란 무엇인가 ?

어떤 문자열의 집합을 묘사하는데 사용되는 텍스트 스트링

정해진 구문 규칙에 따른다

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 : $2n 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 명령어는 삽입 명령어임. 지정한 문장을 매칭되는 행 위에 삽입한다