[유닉스] 파일 및 디렉토리 검색 ( wc, ,grep, egrep, fgrep )


wc

  • 파일의 행 수, 단어 수, 문자 수를 출력
  • 형식 : wc [옵션] 파일명
  • 옵션
    • -c : 바이트 수
    • -m : 문자 수
    • -C : -m과 동일
    • -l : 행 수
    • -w : 공백 문자나 새로운 행으로 구분된 단어의 수
  • 사용 예
    • wc –l test2
    • wc –cw test2
  • 파일의 기본 정보 보기
    • 라인 수 6, 단어 수 7, 바이트 수 61
$ vi test.c
$ cat test.c
#include <stdio.h>
main() {
printf(“Hello, World~!\n);
}
$ wc test.c
6 7 61 test.c
$
  • 파일의 바이트 수와 문자 수 보기 : -c, -m 옵션
    • 옵션을 지정하지 않으면 바이트 수가, -m 옵션을 지정하면 문자 수가 출력됨
    • 영어는 문자 수와 바이트 수가 같고, 한글은 다름
$ wc –c test.c
61 test.c
$ wc –m test.c
61 test.c
$
  • wc 명령의 옵션 중복해 사용하기
    • -l 옵션은 행 수만 알고 싶을 때 사용
    • -w 옵션은 단어 수만 알고 싶을 때 사용
$ wc –cl test.c
6 61 test.c
$ wc –mw test.c
7 61 test.c
$
  • wc 명령의 다른 사용
    • 다른 명령과 (파이프)로 연결해 사용 가능
    • who는 시스템에 접속 중인 사용자의 정보를 출력
    • who는 한 사람당 한 라인씩 정보 출력, 결과로 나온 총 라인 수로 시스템에 접속한 사용자 수를 알 수 있음
    • 현재 6명이 시스템에 접속해 있음
$ who | wc –l
6
$

grep

  • global regular expressions print, 파일에서 정규 표현식을 포함한 모든 행을 출력
  • 지정한 패턴을 포함하는 행을 찾음
  • 형식 : grep [옵션] 패턴 [파일명]
  • 옵션
    • -i : 대소문자 모두 검색
    • -l : 해당 패턴을 포함하는 파일 이름 출력
    • -n : 행 번호 출력
    • -v : 패턴을 포함하는 행을 제외한 행 출력
    • -c : 패턴을 포함하는 행 수 출력
    • -w : 패턴이 하나의 단어로 된 것만 출력
  • 사용 예
    • grep root /etc/passwd
    • grep –n unix ~/*.txt
    • grep –l hello *.c
$ vi grep.dat
$ cat grep.dat
root other sh
system admin
UNIX 123
unix 345
unix+ other
Network 10
adm syslog ksshin
disk admin
cdrom ksshin
ksshin 1000 csh
user1 1001 ksh
$
  • unix가 들어 있는 행 찾기
$ grep unix grep.dat
unix 345
unix+ other
$
  • grep은 첫 번째 인자만 제외하고 나머지를 모두 파일 이름으로 간주
  • 문자열에 공백이 포함되어 있으면 따옴표로 묶어야 함
  • 파일 이름을 지정하지 않으면 표준 입력장치에서 검색할 데이터를 읽음
    • 표준 입력 종료는 ^D
  • ‘ls –F ~‘의 실행 결과 중 /를 포함하는 내용만 출력
    • 나의 홈 디렉토리 아래에 있는 디렉토리 목록만 출력
$ ls –F ~ | grep ‘/’
Desktop/
Documents/
Music/
......
Unix/
$
  • who 명령의 실행 결과 중 나와 관련된 정보만 화면 출력
    • $LOGNAME은 나의 로그인 ID를 저장하는 환경 변수
$ who | grep $LOGNAME
ksshin tty2 2015-07-01 00:57
ksshin :0 2015-06-30 18:35 (:0)
ksshin pts/0 2015-06-30 18:45 (:0.0)
$

grep 정규 표현식 사용하기

  • grep 명령을 사용해 정규 표현식 패턴 찾기

  • 정규 표현식으로 표현된 패턴은 작은따옴표로 묶어줌

$ grep ‘^root’ grep.dat
root other sh
$ grep ‘sh$’ grep.dat
root other sh
ksshin 1000 csh
user1 1001 ksh
$ grep ‘[0-9].*’ grep.dat
UNIX 123
unix 345
Network 10
ksshin 1000 csh
user1 1001 ksh
$

egrep

  • 확장된 정규 표현식(extended regular expression)을 사용하는 grep 명령
  • grep과 사용법은 동일
  • 정규 표현식에 사용할 수 있는 특수 문자가 더 추가됨

  • +를 사용한 검색 예
$ egrep ‘[34]+’ grep.dat
UNIX 123
unix 345
$
  • l 를 사용하여 두 번 검색하던 것을 한 번으로 줄일 수 있음
$ egrep ‘csh|bash’ grep.dat
ksshin 1000 csh
$

fgrep

  • 지정한 파일에서 문자열을 찾는 명령
  • 문자열에 포함된 모든 정규식 관련 특수 문자를 일반 문자로 해석해 검색
$ fgrep unix+ grep.dat
unix+ 123
$ fgrep ‘[0-9].*’ grep.dat
$
  • grep 명령에서 사용하는 모든 특수 문자 앞에 이스케이프 문자(‘\’)를 사용하면 fgrep과 같은 효과
  • 다음 두 가지 명령의 결과는 같음
  • 결국 특수 문자를 검색할 때, fgrep을 사용하는 것이 보다 편리함
$ fgrep ‘[0-9].*’ grep.dat
$ grep\[0-9\]\.\*’ grep.dat