[Centos 7] String Process(문자열 프로세스) - Grep, Egrep, Fgrep, Awk

2022. 11. 16. 14:55리눅스(Linux)

What is grep?
 - 파일 전체를 뒤져 정규 표현식에 대응하는 모든 행들을 출력

# grep <word> <filename>

Grep option
Grep option

$ grep 사용예제

# grep root /etc/passwd
   -  /etc/passwd 파일 에서 root 라는 패턴을 찾음
# ps -ef | grep root 
    - Ps 명령어의 출력 결과에서 root 를 포함하는 모든 행들이 화면에 출력됨
# grep -n '^root' /etc/passwd 
   - root 로 시작하는 행과 행 번호(n) 를 출력
# grep '.bak$'FILE
   - bak 로 끝나는 행을 출력, 작은 따옴표는 달러 기호가 해석되는 것을막는다
# grep '[A-Z]…[0-9]'FILE 
   - 대문자로 시작하고 숫자로 끝나는 다섯 문자의 열이 포함된 행을 출력
# ps -ef | grep "^ *user1" 
   - User1 으로 시작하는 행을 검색하며, 문자열 앞에 0개 혹은 임의 개수의 공백이 와도 무관하다

  
$ grep with option

# grep -n '^south' datafile
   - (-n) 옵션은 패턴이 찾아진 행 번호를 함께 출력
# grep -v 'root'datafile > temp 
# mv temp datafile
   - (-v) 옵션은 해당 패턴이 포함되지 않은 모든 행을 출력하며,파일에서 특정 내용의 이력을 삭제하는데 쓰이기도 한다
# grep -i 'pat' datafile
   - (-i) 옵션은 대소문자를 구별하지 않음. 그러므로 문자열 pat가 어떠한
      대소문자 조합으로 이루어져 있더라도 무관
 # grep -l 'SE' * 
   datafile 
   databook 
   - (-l) 옵션은 패턴이 찾아진 파일의 행 번호 대신, 단지 파일 이름만 출력
# grep –c 'west' datafile 
  3
   - (-c) 옵션은 패턴이 찾아진 행의 총 수를 출력, 패턴이 발견된 횟수가 아니라 '행의 수' 가 출력
# grep -w 'north' datafile 
  north NO Margot Weber 4.5 5 
   - (-w) 옵션은 패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾음

$ grep with Regular Expression

 

# grep '[a-z]\{9\}' datafile 
   - 소문자가 적어도 아홉 개가 연속적으로 나오는 문자열을 포함한 모든 행을 출력
# grep '\<[a-z].*h\>' datafile
   - 소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력

(.*) 기호는 공백을 포함한 임의의 문자들을 의미

 

 

What is egrep?
   - Grep에서 제공하지 않는 확장된 정규표현식 메타문자를 사용할 수 있음

# egrep <word> <filename>

Egrep이 지원하는 확장 Metacharacters

 

$ egrep 사용예제

# egrep 'NW|EA' datafile 
   - 정규표현식 NW나 EA가 포함된 행을 출력
# egrep '3+' datafile 
   - 숫자 3이 한 번 이상 등장하는 행을 출력
# egrep '2\.?[0-9]' datafile
   - 숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자 하나가 오는 행을 출력
# egrep '(no)+' datafile
   - 패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.
# egrep 'S[h|u]' datafile 
   - 문자 S 다음에 h나 u가 나오는 행을 출력
# egrep 'Sh|u' datafile
   - 패턴 Sh 나 u를 포함한 행을 출력

What is fgrep?

   - Fgrep은 grep 명령어와 동일하게 동작, 하지만 정규표현식 메타 문자들을 특별히 취급하지 않음

# fgrep '문자열' <filename>
# fgrep '[A-Z]…[0-9]' <filename>
   - [A-Z]…[0-9] 를 정규표현식 메타문자로 특별히 취급하지 않고 문자열 자체로 인식
   - [A-Z]…[0-9] 자체를 포함하는 문자열을 찾는다.

 

What is Awk?

   - 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어
   - 입력 데이터로는 표준 입력이나 여러 개의 파일 또는 다른 프로세스의 결과를 사용할 수 있다.
   - 사용자가 지정한 패턴 검색이나 특별한 작업을 수행하기 위해 파일을 행 단위로 조사

# awk 'pattern'filename 
# awk '{action}'filename 
# awk 'pattern {action}'filename
   - 기본형식

$ awk 사용예제

# awk '{print $1}'datafile 
   - 파일의 첫 번째 필드를 출력한다, 첫 번째 필드는 각 행의 맨 왼쪽 경계에서 시작하고 공백 문자로 구분되는 영역을 의미한다
# awk '/root/{print $1, $2}'datafile 
   - 파일에서 root 를 포함하는 행들의 첫 번째와 두 번째 필드를 출력한다
# df | awk '$2 > 80000' 
   - df 명령어를 통해 출력되는 내용 중 두 번째 필드가 80000 보다 큰 행이 출력이 된다
# date | awk '{print “Month :”$2 “\nYear:”$6}' 
   - date 명령을 통해 출력되는 두 번째 필드(month) 와 여섯 번째 필드 (year)를 print 함수를 이용하여 출력
# awk '{print NR, $1,$3}'datafile 
   - NR 변수(하나의 레코드를 처리한 후 1이 증가하는 변수) 를 사용하여 레코드의 번호와 함께 파일의 내용대로 출력
# awk '{print $1, $3, NF}'datafile 
   - NF 변수(필드의 개수를 출력라는 변수) 를 사용하여 레코드의 번호와 함께 각 행의 필드의 개수도 함께 출력
# awk -F : '/root/{print $0}'/etc/passwd 
   - “:”구분자를 기준으로 필드를 나누며 root 를 포함하는 행을 출력
# awk -F : '/^[ns]/{print $1}'datafile 
   - n 이나 s 로 시작하는 행의 첫 번째 필드를 출력
# awk -F '[\t]''{print $1, $2, $3}'employees 
   - TAB 으로 필드를 구분하여 나누며 첫 번째, 두 번째, 세 번째 필드를 출력한다. 
   - 작은 따옴표로 묶은 이유는 쉘이 대괄호를 해석해 버리는것을 방지하기 위해서이다
# awk '$1 ~ /[bB]ill/'employees 
   - Match 연산자(~, tilde)는 특정 레코드나 필드 내에서 일치하는 정규 표현식 패턴이 존재 하는지 검사하는 데 쓰인다
# awk '$1 !~ /ly$/'employees 
   - 첫 번째 필드가 ly 로 끝나지 않는 행들을 출력한다
# awk '$4 ~ /Chin$/{print “The price is $”$8 “.”}'FILE 
   - 네 번째 필드가 Chin 으로 끝나면 문자열 The price is $와 여덟번째 필드($8) 및 마침표를 함께 출력한다