grep 명령어
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번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '\(3\)\.[0-9].*\1 *\1' datafile
(숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '\<north' datafile
(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '\<north\>' datafile
(north라는 단어가 포함된 모든 행을 출력한다.)
# grep '\<[a-z].*n\>' datafile
(소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)
3.3 grep에 옵션 사용
# grep -n '^south' datafile
(행번호를 함께 출력한다.)
# grep -i 'pat' datafile
(대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile
(문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
)
# grep -l 'SE' *
(패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile
(패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile
(환
경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다.
작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)
3.4 egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원 한다.
grep와 동일한 명령행 옵션을 지원한다.
egrep에서 지원하는 확장 메타문자
메타문자
|
기능
|
사용 예
|
사용 예 설명
|
+
|
선행문자와 같은 문자의 1개 혹은 임의 개수와 대응
|
'[a-z]+ove'
|
1개 이상의 소문자 뒤에 ove가 붙어있는 문자열과 대응. move,approve,love,behoove 등이 해당된다.
|
?
|
선행문자와 같은 문자의0개 혹은 1개와 대응
|
'lo?ve'
|
l 다음에 0개의 문자 혹은 하나의 문자가 o가 나오는 문자열과 대응. love,lve 등이 해당된다.
|
a|b
|
a 혹은 b와 대응
|
'love|hate'
|
love 혹은 hate와 대응.
|
()
|
정규표현식을 묶어준다
|
'love(able|ly)'
|
lovable 혹은 lovely와 대응.
|
'(ov)+'
|
ov가 한 번 이상 등장하는 문자열과 일치.
|
3.4.1 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를 포함한 행을 출력한다.)
3.5 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지
않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file
([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)
==============================================================================================
grep 명령어
◈ 기본문법
grep [-civnlw] pattern file_name1 [file_name2]
-c 패턴이 일치하는 행의 수를 출력
-i 배교시 대소문자를 구별하지 않음
-v 지정한 패턴과 일치하지 않는 행만 출력
-n 행의 번호를 함께 출력
-l 패턴이 포함된 파일의 이름을 출력
-w 패턴이 전체 단어와 일치하는 행만 출력
◈ 정규표현식 사용 예
^freeman freeman으로 시작하는 행
freeman$ freeman으로 끝나는 행
freema* freema로 시작하는 단어
f.....n f로 시작하고 n으로 끝나는 7자리 단어
[a-d] a,b,c,d로 시작하는 단어
[fF]reeman freeman또는 Freeman으로 시작하는 단어
◈ 사용 예
$ grep Sunny grep.data --> Sunny가 들어 있는 행을 출력
$ grep -n Sunny grep.data --> Sunny가 들어 있는 행을 번호와 함께 출력
$ grep '^S' grep.data --> 첫문자가 S로 시작하는 행을 출력
$ grep 'Thank you' grep.data --> 문자열 Thank you가 들어 있는 행을 출력
--------------------------------------------------------------------------------------------------------
find 명령어
◈ 기본문법
find path [expression] [action]
-name file_name 검색 대상 파일명을 입력. 파일명으로 [], ? * 의 메타문자를 사용할 수 있음.
-type [file_type] 검색 대상 파일의 종류를 지정. b(Block), c(Character), d(Directory), p(Named Pipe)
f(Regular File), l(Symbolic Link), s(Socket)
-user uname uname은 검색 파일의 소유주 또는 UID.
-group gname gname은 검색 파일의 소유그룹 또는 GID.
-size [+-]num[bck] 검색 파일의 크기를 지정. num(일치), +num(이상), -num(이하)
b(Block,512Byte), c(Byte), k(KByte)
-perm mode 주어진 접근 권한을 갖는 파일을 검색. (8진수로 기술)
-atime [+-]n 파일이 읽힌 최근 시간
-ctime [+-]n 파일의 소유주나 권한이 바뀐 최근 시간
-mtime [+-]n 파일이 수정된 최근 시간
-prune 서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색
-print 검색 후에 행할 작업 옵션 : 검색결과 출력
-exec command {}\; 검색 후에 행할 작업 옵션 : 결과에 특정 명령을 실행하도록 명령
◈ 사용 예
$ find . --> -print옵션은 일반적으로 디폴트이다. 따라서 'find . '은 'find . -print'와 같다.
$ find . -name "*.c" -print
$ find . -name "ip*.c" -print --> ip로 시작하며 확장자가 .c로 끝나는 파일 검색
$ find . -type d -print --> 현재 디렉토리 하위(서브 포함)에서 디렉토리를 찾아 표시
$ find . -name lib -type d --> 현재 디렉토리 하위(서브 포함)에서 lib라는 이름의 디렉토리 표시
$ find . -size +56 -print --> 파일 크기가 56블록보드 큰 것을 검색
$ find . -size +800c -size -900c -print --> 파일 크기가 800Byte보다 크고 900Byte보다 작은 것을 검색
$ find . -perm -1 -print --> other에 실행권한이 있는 파일 검색. 1은 '--------X'를 의미
$ find . -perm -44 -print --> group에 읽기권한, other에 읽기권한이 있는 파일 검색
$ find . -perm 664 -print --> user와 group에 읽기와 쓰기 권한, other에 읽기권한이 있는 파일 검색
$ find . -mtime +3 -print --> 수정한지 3일이 지난 파일을 검색(5일~)
$ find . -mtime 3 -print --> 수정한지 3일이 된 파일을 검색
$ find . -mtime -3 -print --> 수정한지 3일이 못된 파일을 검색(0,1,2일)
$ find . -name "*.o" -print
$ find . -name "*.o" -exec rm {} \; --> .o 파일을 찾아서 그 결과를 rm명령어 실행시 인수로 전달
$ find . -name "*.o" | wc -l --> .o 파일을 찾아서 파이프로 그 결과를 wc명령의 입력으로 전달
※ fine는 논리 연산이 가능하다
-a (And), -o (Or), ! (Not)
$ find . -name "*.log" -o -name "*.o" -print --> 확장자가 '.log'이거나 '.o'인 것을 검색
$ find . \( -name "*.log" -o -name "*.o" \) -print --> 위와 동일. '('를 사용하려면 '\'을 붙여야 함
$ find . ! \( -name "*.log" -o -name "*.o" \) -print --> 괄호 사용으로 이렇게 전체부정등이 가능
'.log'와 '.o' 이외의 파일을 검색
$ find . \( -name "*.log" -o -name "*.o" \) -exec rm {} \; --> '.log'나 '.o'인 것을 찾아 삭제
--------------------------------------------------------------------------------------------------------xargs 명령어
find . | xargs 를 하면 find명령의 결과가 한 행으로 출력된다. 즉, xargs는 여러행을 한행으로 만드는 역할을 한다.
$ find . -name "*.c" -exec grep test {} \;
$ find . -name "*.c" | xargs grep test
첫번째 명령은 find을 결과가 여러행일 때, 그 행의 수만큼 grep명령어를 실행한다.
두번째 명령은 find의 결과를 xargs가 한 행으로 만들어 grep에 전달하므로 grep는 한번만 실행된다.
◈ 사용 예
$ find . \(-name "*.log" -o -name "*.o"\) | xargs rm --> .log와 .o 파일을 찾아서 삭제
$ find . -name *.php -exec chmod 755 {} \; --> .php파일을 찾아서 접근권한을 755로 변경. chmod 매번 실행
$ find . -name *.php | xargs chmod 755 --> 위와 같음. chmod 한번 실행
$ find . | xargs grep -l "freeman" | xargs rm --> freeman이라는 문자열을 포함한 파일을 찾아서 지움
==============================================================================================
grep 명령어
◈ 기본문법
grep [-civnlw] pattern file_name1 [file_name2]
-c 패턴이 일치하는 행의 수를 출력
-i 배교시 대소문자를 구별하지 않음
-v 지정한 패턴과 일치하지 않는 행만 출력
-n 행의 번호를 함께 출력
-l 패턴이 포함된 파일의 이름을 출력
-w 패턴이 전체 단어와 일치하는 행만 출력
◈ 정규표현식 사용 예
^freeman freeman으로 시작하는 행
freeman$ freeman으로 끝나는 행
freema* freema로 시작하는 단어
f.....n f로 시작하고 n으로 끝나는 7자리 단어
[a-d] a,b,c,d로 시작하는 단어
[fF]reeman freeman또는 Freeman으로 시작하는 단어
◈ 사용 예
$ grep Sunny grep.data --> Sunny가 들어 있는 행을 출력
$ grep -n Sunny grep.data --> Sunny가 들어 있는 행을 번호와 함께 출력
$ grep '^S' grep.data --> 첫문자가 S로 시작하는 행을 출력
$ grep 'Thank you' grep.data --> 문자열 Thank you가 들어 있는 행을 출력
--------------------------------------------------------------------------------------------------------
find 명령어
◈ 기본문법
find path [expression] [action]
-name file_name 검색 대상 파일명을 입력. 파일명으로 [], ? * 의 메타문자를 사용할 수 있음.
-type [file_type] 검색 대상 파일의 종류를 지정. b(Block), c(Character), d(Directory), p(Named Pipe)
f(Regular File), l(Symbolic Link), s(Socket)
-user uname uname은 검색 파일의 소유주 또는 UID.
-group gname gname은 검색 파일의 소유그룹 또는 GID.
-size [+-]num[bck] 검색 파일의 크기를 지정. num(일치), +num(이상), -num(이하)
b(Block,512Byte), c(Byte), k(KByte)
-perm mode 주어진 접근 권한을 갖는 파일을 검색. (8진수로 기술)
-atime [+-]n 파일이 읽힌 최근 시간
-ctime [+-]n 파일의 소유주나 권한이 바뀐 최근 시간
-mtime [+-]n 파일이 수정된 최근 시간
-prune 서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색
-print 검색 후에 행할 작업 옵션 : 검색결과 출력
-exec command {}\; 검색 후에 행할 작업 옵션 : 결과에 특정 명령을 실행하도록 명령
◈ 사용 예
$ find . --> -print옵션은 일반적으로 디폴트이다. 따라서 'find . '은 'find . -print'와 같다.
$ find . -name "*.c" -print
$ find . -name "ip*.c" -print --> ip로 시작하며 확장자가 .c로 끝나는 파일 검색
$ find . -type d -print --> 현재 디렉토리 하위(서브 포함)에서 디렉토리를 찾아 표시
$ find . -name lib -type d --> 현재 디렉토리 하위(서브 포함)에서 lib라는 이름의 디렉토리 표시
$ find . -size +56 -print --> 파일 크기가 56블록보드 큰 것을 검색
$ find . -size +800c -size -900c -print --> 파일 크기가 800Byte보다 크고 900Byte보다 작은 것을 검색
$ find . -perm -1 -print --> other에 실행권한이 있는 파일 검색. 1은 '--------X'를 의미
$ find . -perm -44 -print --> group에 읽기권한, other에 읽기권한이 있는 파일 검색
$ find . -perm 664 -print --> user와 group에 읽기와 쓰기 권한, other에 읽기권한이 있는 파일 검색
$ find . -mtime +3 -print --> 수정한지 3일이 지난 파일을 검색(5일~)
$ find . -mtime 3 -print --> 수정한지 3일이 된 파일을 검색
$ find . -mtime -3 -print --> 수정한지 3일이 못된 파일을 검색(0,1,2일)
$ find . -name "*.o" -print
$ find . -name "*.o" -exec rm {} \; --> .o 파일을 찾아서 그 결과를 rm명령어 실행시 인수로 전달
$ find . -name "*.o" | wc -l --> .o 파일을 찾아서 파이프로 그 결과를 wc명령의 입력으로 전달
※ fine는 논리 연산이 가능하다
-a (And), -o (Or), ! (Not)
$ find . -name "*.log" -o -name "*.o" -print --> 확장자가 '.log'이거나 '.o'인 것을 검색
$ find . \( -name "*.log" -o -name "*.o" \) -print --> 위와 동일. '('를 사용하려면 '\'을 붙여야 함
$ find . ! \( -name "*.log" -o -name "*.o" \) -print --> 괄호 사용으로 이렇게 전체부정등이 가능
'.log'와 '.o' 이외의 파일을 검색
$ find . \( -name "*.log" -o -name "*.o" \) -exec rm {} \; --> '.log'나 '.o'인 것을 찾아 삭제
--------------------------------------------------------------------------------------------------------xargs 명령어
find . | xargs 를 하면 find명령의 결과가 한 행으로 출력된다. 즉, xargs는 여러행을 한행으로 만드는 역할을 한다.
$ find . -name "*.c" -exec grep test {} \;
$ find . -name "*.c" | xargs grep test
첫번째 명령은 find을 결과가 여러행일 때, 그 행의 수만큼 grep명령어를 실행한다.
두번째 명령은 find의 결과를 xargs가 한 행으로 만들어 grep에 전달하므로 grep는 한번만 실행된다.
◈ 사용 예
$ find . \(-name "*.log" -o -name "*.o"\) | xargs rm --> .log와 .o 파일을 찾아서 삭제
$ find . -name *.php -exec chmod 755 {} \; --> .php파일을 찾아서 접근권한을 755로 변경. chmod 매번 실행
$ find . -name *.php | xargs chmod 755 --> 위와 같음. chmod 한번 실행
$ find . | xargs grep -l "freeman" | xargs rm --> freeman이라는 문자열을 포함한 파일을 찾아서 지움
댓글 없음:
댓글 쓰기