제3장 grep 계열 명령어

   

3.1 grep 명령어

   

3.1.1 grep의 의미

   

grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.

egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.

fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정         규표현식의 메타문자도 일반 문자로 취급한다.

   

3.1.2 grep의 동작 방법

   

grep에서 사용하는 정규표현식 메타문자

   

메타문자

기    능

사용 예

사용 예 설명

^

행의 시작 지시자

'^love'

love로 시작하는 모든 행과 대응

$

행의 끝 지시자

'love$'

love로 끝나는 모든 행과 대응

.

하나의 문자와 대응

'l..e'

l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응

*

선행문자와 같은 문자의 0개 혹은 임의개수와 대응

' *love'

0개 혹은 임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응

[]

[] 사이의 문자 집합중 하나와 대응

'[Ll]ove'

love나 Love를 포함하는 행과 대응

[^ ]

문자집합에 속하지 않는 한 문자와 대응

'[^A-K]love'

A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응

\<

단어의 시작 지시자

'\<love'

love로 시작하는 단어를 포함하는 행과 대응(vi,grep에서 지원)

\>

단어의 끝 지시자

'love\>'

love로 끝나는 단어를 포함하는 행과 대응

(vi,grep에서 지원)

\(..\)

다음 사용을 위해 태그를 붙인다.

'\(lov\)ing'

지정된 부분을 태크1에 저장한다. 나중에 태그값을 참고하려면 \1을 쓴다. 맨 왼쪽부터 시작해 태그를 9개가지 쓸 수 있다. 왼쪽 예에서는 lov가 레지스터1에 저장되고 나중에 \1로 참고할 수 있다.

x\{m\}

문자 x를 m번 반복한다.

'o\{5\}'

문자 o가 5회 연속적으로 나오는 모든 행과 대응

x\{m,\}

적어도 m번 반복한다.

'o\{5,\}'

문자 o가 최소한 5회 반복되는 모든 행과 대응

x\{m,n\}

m회 이상 n회 이하 반복한다.

o\{5,10\}'

문자 o가 5회에서 10회 사이의 횟수로 연속적으로 나타나는 문자열과 대응

   

grep의 옵션

   

옵션

동작 설명

-b

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

-c

검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력한다.

-h

파일 이름을 출력하지 않는다.

-i

대소문자를 구분 하지 않는다.(대문자와 소문자를 동일하게 취급).

-l

패턴이 존재하는 파일의 이름만 출력한다.(개행문자로 구분)

-n

파일 내에서 행 번호를 함께 출력한다.

-s

에러 메시지 외에는 출력하지 않는다. 종료상태를 검사할 때 유용하게 쓸 수 있다.

-v

패턴이 존재하지 않는 행만 출력한다.

-w

패턴 표현식을 하나의 단어로 취급하여 검색한다.

   

# grep -n '^jack:' /etc/passwd

(/etc/passwd 파일에서 jack을 찾는다. jack이 행의 맨 앞에 있으면 행 번호를 화면으로 출력한다.)

   

3.1.3 grep과 종료 상태

grep은 파일 검색의 성공 여부를 종료 상태값으로 되돌려준다.

패턴을 찾으면 0, 패턴을 찾을 수 없으면 1, 팡리이 존재하지 않을 경우 2

sed,a자 등은 검색의 성공 여부에 대한 종료 상태값을 반환하지 않는다. 다만 구문 에러가 있을 경우에만 에러를 보고한다.

   

3.2 정규표현식을 사용하는 grep의 예제

# grep NW datafile

# grep NW d*

(d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)

# grep '^n' datafile

(n으로 시작하는 모든 행을 출력한다.)

# grep '4$' datafile

(4로 끝나는 모든 행을 출력한다.)

# grep TB Savage datafile

(TB만 인자이고 Savage와 datafile은 파일 이름이다.)

# grep 'TB Savage' datafile

(TB Savage를 포함하는 모든 행을 출력한다.)

# grep '5\.' datafile

(숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)

# grep '\.5' datafile

(.5가 나오는 모든 행을 출력한다.)

# grep '^[we]' datafile

(w나 e로 시작하는 모든 행을 출력한다.)

# grep '[^0-9]' datafile

(숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)

# grep '[A-Z][A-Z] [A-Z]' datafile

(대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)

# grep 'ss* ' datafile

(s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)

# grep '[a-z]\{9\}' datafile

(소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출

   

   

name  password    

Browser_type : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

[글쓰기] [답변하기] [수정하기] [삭제하기] [목록보기]                                      [이전] [다음]

   

- 관련글이 없습니다 -

   

<http://www.leopit.com/Leophp/board/lecture_board/view.php?id=61&board_mode=linux>에서 삽입

반응형

프로그램은 크게  instruction(명령)과 data로 구분되며, 일반적으로 4가지, 좀더 세분화 하면 5가지 정도 구분 할 수 있다.

--> 아래 그림 참조.

   

1) code 영역

- 코드 자체를 구성하는 메모리 영역으로 Hex파일이나 BIN파일 메모리다.

- 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.

   

2) data 영역

- 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.

     가) 초기화 된 데이터는 data 영역에 저장되고,

        나) 초기화 되지 않은 데이터는 BSS (Block Stated Symbol) 영역에 저장된다.

- 프로그램이 실행 될 때 생성되고 프로그램이 종료 되면 시스템에 반환 된다.

- 함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간만 할당되고, 그 함수가 실행 될 때 초기화 된다.

   

Q) data영역과 bss 영역을 구분 하는 이유?

   컴파일 해서 이미지를 올릴 때 초기화 되지 않은 데이터까지 올리게 되면 ROM 사이즈가 커지기 때문에 구분하지 않았을까? -> 혹시 정확히 아시는 분은 답변 부탁 드립니다. 

   

3) heap 영역

- 필요에 의해 동적으로 메모리를 할당 하고자 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부르며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.

- 이 영역에 데이터를 저장 하기 위해서 C는 malloc(), C++은 new() 함수를 사용한다.

   

 4) stack 영역

프로그램이 자동으로 사용하는 임시 메모리 영역이다.

- 지역(local) 변수, 매개변수(parameter), 리턴 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.

- 함수 호출 시 생성되고, 함수가 끝나면 시스템에 반환 된다.

- 스택 사이즈는 각 프로세스마다 할당 되지만 프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다.

- 명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정 한다.

   

   

   

   

   

요약)

1) code(text), data, stack 영역은 컴파일러가 알아서 메모리영역을 결정한다. 즉 컴파일 할 때 data영역과 stack영역의 크기를 계산해서 필요한 메모리 공간을 가지고 된다.  heap 영역은 개발자에 의해 프로그램 동작시 결정된다.

ex) C언어에서 배열 선언시 incomplete type으로 사용하면 컴파일 할 때 에러가 발생하게 된다.

   

2) code, data, heap 영역은 하위 메모리부터 할당되고, stack 영역은 상위 메모리부터 할당 된다.

   

3) SMA (Static Memory Allocation) : 정적 메모리, 메모리의 data 영역stack 영역을 사용한다.

     - Data 영역 : 프로그램 시작과 동시에 할당된 영역이 잡히고 끝나면 OS 에 반환한다.

     - Stack 영역 : 함수 시작과 동시에 할당된 영역이 잡히고 끝나면 OS에 반환한다.

   

4) DMA (Dynamic Memory Allocation) : 동적 메모리, 메모리의 heap 영역을 사용한다.

     - Heap 영역 : stack에서 pointer 변수를 할당하고, 그 pointer가 가리키는 heap 영역의 임의의 공간부터 원하는

                         크기 만큼 할당해 사용한다.

   

written by 브랜든 (v 1.1)

P.S 부족한 부분이나 잘못된 부분은 댓글 부탁드립니다. (by 브랜든)

   

   

   

4월26일-메모리(code,data,bss,heap,stack영역)

   

 ▶ 구체적인 메모리 영역

→ 함수안에 쓰는 변수(지역변수)로 stack영역에 들어간다.

    함수가 여러번 실행되면 HEAP, STACK가 늘어날 수 있다.

    만약 프로그램이 늘어나면 용량이 커지므로 코드영역이 늘어난다.

    변수선언시 stack이 끝번지 주소를 나타내는 것은 아니지만 마지막 영역에 해당한다.

    컴파일하면 code는 더이상 늘어나지 않는다.

   

→stack의 지역변수는 사용하고 소멸하므로 데이터 용량의 불확실성을 가지므로 밑에서부터 채워 올리고 heap은 위에서 부터 채워 내려진다. 용량의 불확실성은 컴파일러가 알아서 메모리영역을 선택(랜덤적)

   

-stack영역에서의 주소값은 시작주소는 밑에서부터(먼저선언된 순서) 그다음 주소는 순서대로 정해진다.

   

HEAP overflow-heap이 위에서부터 주소값을 채워져 내려오다가 stack영역을 침범하는 경우.

STACK overflow-stack영역이 heap을 침범.

   

-stack은 4kb를 기본으로 하는 경우가 많고 지역변수를 많이 쓰면 stack용량이 커지므로 적당히 쓰는것이 좋다. stack, heap는 기준이 없으므로 프로그램을 실행시켜봐야 알수 있다.

   

▶ex) int A선언 후 실행 

 먼저 컴파일시 생성되는 기계어가 코드위에 씌어지게 되는게 여기서는 int A 가 '4byte공간을 stack생성하라' 란 일종의 명령이 code영역에 들어간다. 이 때 실행파일을 하드디스크에서 .exe만드는데 여기에는 header(code,bss,data)가 실행파일을 만들때 앞에 함께 들어간다. 이 것을 윈도우에서는 PE (portable executive)라고 한다.

 만들어진 .exe실행파일을 실행하면 운영체제가 실행되고 실행파일을 메모리에 적재(loader)한다. 그리고 실행시에 A가 메모리에 나타난다.

   

리눅스용 프로그램을 윈도우에서 실행되지 않는 이유

(리눅스 elf, 윈도우 PE구조)이므로 앞에 내용을 붙이는 (header구조)가 다르기 때문에 실행되지 않는다.

   

   

   

ex1)

   

   

    TYPE

    Name 

  address

      int

       A

   bffff9d8

      int

       B

   bffff9d4

→A가 먼저 선언됐는데 B의 주소값이 더 빠르다.

ex2)

   

   

                                                                                      

                                      

   

1.각 변수에 출력 값을 보면 주소값이 stack영역의 주소값을 채우는 방식에 의해 아래서 부터 채워 올라가는 것을 볼수 있고 안쓰는 공간을 두는 이유는 최적화를 위해서이다.

   

*4byte 최적화 (bus에 최적화 한다는 의미)→그다음 2byte최적화가 이루어진다.

   

2.는 각 각의 함수는 code영역에 속하고 각 함수의 주소값을 출력한 것이다. 함수자체가 주소이므로 &쓸필요가 없다.

   

반응형

GDB 명령어 (급한일 생길때 보는 G!D!B! 명령어)

다시금 linux에서 gdb를 쓸 일이 생겼다. 음....어언 4?5?년 전에 g++과 gdb로 개발을 했었는데

메모리가 플래쉬다. 뭐 몇몇개 명령어 말고는 기억이 안나니...다시 정리를 해볼수 밖에.. 그대루 금방 적응된다.

역시 매력적이다 gdb...

   

gcc -g ~ 로 컴파일 해야한다는건 잊어 버려서도 안된다. 그리고 파일 사이즈를 줄여 버려서도 안된다( 디버그 정보가 필요하다는 말씀!)

   

# 진행

run r - 실행

step(s) - 함수 안으로 들어감

step n - n번 들어감

next - 다음 라인으로 넘어감( 함수 안들어감 )

next n - n번 다음라인

c - 현재 상태 확인

finish - 함수 끝으로 이동

u - loop문 바져나옴

return 함수 수행하지 않고 빠져 나옴

   

#list

list (l) - 소스 보기

list n - n라인 기준으로 봄

list func - func 함수 기준으로 봄

list - - 출력이전의 행 출력

list file:func file파일의 func를 기준으로 보여줌

set listsize n : 출력 줄 길이

   

#break

info break

break func - 함수

break n - 라인

break file:func - 파일의 함수

break n if var = 0 : n 행에 브레이크 설정 값이 var=0이면

cl 브레이크 해제

d 브레이크 전부 해제

   

#변수 정보

info f 변수 - 변수 세부 정보

info locals - 로컬 변수

info variables - 모든 전역변수

display var - 변수 값 보여줌(계속 보여줌)

undisplay n - n번째 보여주지 않음

   

#스택보기

bt 스택 보기

frame n n번 스택봄

   

#print

변수값 출력 및 설정

gdb

반응형

'Linux' 카테고리의 다른 글

[명령어]Message Queue 설정 및 확인  (8) 2011.08.11
[명령어]OS 별 CPU, Memory, 커널Bit 확인방법  (11) 2011.08.11
RAID  (3) 2011.08.11
SNMP란 무엇인가요?  (3) 2011.08.11
grep  (339) 2011.08.11

+ Recent posts