EASY7
리눅스 find, grep, awk 사용하기 본문
1. find 명령어
: 주어진 조건을 검색하여 파일 찾기
find [패스] [옵션] [작업]
find /
find .
옵션
-name name | 지정된 이름의 파일 찾기. 와일드 문자 사용 시, " 쓰기. |
-user name | user 소유의 파일을 찾기. |
-type [bcdfls] | 지정된 형식의 파일을 찾기. b:블록파일 c:문자 d:디렉터리 f:파일 l:링크파일 s:소켓 |
-size [+/-]n[bckw] | 지정된 크기의 파일을 찾기 +n:n보다 크다 -n:n보다 작다 n:n이다. b:512byte k:kilobytes w:2byte k G M -size +10M |
-inum number | 지정한 아이노드 번호와 파일을 찾는다. |
표준 출력으로 검색된 파일명을 출력한다. | |
-exec command{} \; | 찾은 각 파일에 대해 지정된 명령을 실행한다. 명령은 \;로 끝나야한다. |
-ok command {} \; | 실행 여부를 사용자에게 확인한 후 명령을 실행한다. |
-mtime(mmin) | 파일의 데이터 수정(modify) 시각을 기준으로 파일 검색한다. -mtime -60 변경된지 60일 이전 -mtime 60 변경된지 60일 -mtime +60 변경된지 60일 이후 |
-atime(amin) | 파일 접근(access) 시각을 기준으로 파일 검색한다. |
-ctime(cmin) | 파일 내용 및 속성 변경(change) 시각을 기준으로 파일 검색한다. |
-user (-nouser) -group (-nogroup) |
-user root 소유자가 root인 파일을 찾아라. |
-perm | -perm 644 권한이 644인 파일을 찾아라. (-/+ 차이는 hack-cracker.tistory.com/79 블로그 참고) |
예시)
1) root디렉터리에서 passwd를 검색해보자.
find /root -name passwd
2) 현재 디렉터리에 있는 모든 파일명 나열하기
find . -print
3) 현재 디렉터리에 있는 디렉터리 나열하기
find . -type d -print
4) 현재 디렉터리에서 파일 이름에 공백 문자가 들어간 모든 파일 삭제하기
find . -name "* *" -exec rm -f {} \;
6) 24시간 동안 변경된 디렉터리 목록을 changelist 파일로 만들기
find / -mtime -1 \! -type d -print > changelist
7) 시스템에서 최근 5분간 변경된 모든 파일을 목록으로 만들기
find / -mmin -5 -print > changelist
8) rm명령으로 지워지지 않는 파일을 find명령으로 inode 지정하여 삭제하기
find . -inum 855552 -exec rm -rf {} \;
2. grep
패턴에 매칭되는 라인을 보여준다.
grep [옵션] 패턴 [파일..]
-A num | 일치하는 줄 다음에(after) 지정한 줄 수(num)만큼의 내용을 더 보여준다. |
-b | 일치하는 줄을 출력하는 내용의 맨앞에 바이트 오프셋을 보여준다. |
-B num | 일치하는 줄의 위(before)에 지정한 줄 수만큼의 내용을 더 보여준다. |
-c | 일치하는 줄의 수를 보여준다. |
-d action | 읽고자 지정한 파일이 디렉터리일 경우 지정한 값을 실행한다. 기본값은 read이다. read: 디렉터리를 보통 파일처럼 읽는다. skip: 디렉터리는 건너뛴다. recurse: 디렉터리를 포함하여 하위 디렉터리의 모든 파일을 읽는다. |
-e pattern | 하나 이상의 탐색 패턴을 지정한다 |
-f file | 패턴을 지정한 파일에서 가져온다. |
-h | 패턴의 결과 목록만 보여주고 지정한 파일명은 출력하지 않는다. |
-i | 대소문자를 구별하지 않는다(ignore) |
-l(엘) | 일치하는 줄의 파일명만 보여주고 줄의 내용은 출력하지 않는다. |
-n | 일치하는 줄의 내용과 해당 줄의 위치를 출력한다.(line number) |
-q | 결과를 출력하지 않는다(quiet) |
-r | 각 디렉터리의 하위에 존재하는 파일들을 읽는다(-d recurse 옵션과 동일) |
-s | 존재하지 않거나 읽을 수 없는 파일의 결과로 에러를 출력하지 않는다. |
-v | 지정한 패턴과 일치하지 않는 내용을 보여준다.(revert-match) |
-w | 지정한 패턴과 워드 단위로 일치하는 결과만을 보여준다. |
-x | 패턴과 읽치하는 전체 줄 수를 보여준다. |
egrep, fgrep, rgrep, agrep
zgrep, zegrep, zfgrep, zigrep : 압축된 파일에서 사용하지만 일반 파일에 대해서도 작동한다. 다만 grep, egrep, fgrep보다 실행속도가 약간 느리다. bzgrep을 이용하면 bzip압축된 파일을 검색할 수 있다.
예시)
현재 디렉터리에서 하위 디렉터리까지 모두 검색하고(-r), 대소문자를 구분하지않고(-i), 검색키워드를 갖는 파일들을 보여준다.에러는 출력하지 않는다. (-s)
grep -ris "gnome"
문자열 str 찾기
find . -name "*" -exec grep -Hni "str" 2>/dev/null {} \;
find . -print | xargs grep "str"
find str ./* (같은 디렉터리의 경우)
3. awk
문서에서 패턴을 검사해 원하는 값을 얻는다.
awk [옵션] -F 구분자 [변수=값] [파일]
awk [옵션] -f 스크립트파일 [변수=값] [파일]
2) 5번째 열이 4000이상인 것을 출력하라. **조건과 프린트 구문을 전체 '(quote)해주기.
ls -al | awk ' $5 > 4000 {print $5, $9}'
3) 파일에서 특정 문자열을 포함하는 줄 출력하기
awk /문자열/ PATH
4) awk 스크립트 구성
시작(begin) : 시작단계로 전체 스크립트를 위한 정의 단계
실행(routin):실행단계로 이 스크립트를 수행하는 단계
끝(end) : 마무리 단계로 결과를 출력한다.
word.awk
#!/bin/awk BEGIN{ word=0; } {word+=NF;} #NF: 각 라인마다의 필드 수, awk 시스템 변수, 구분자 정의가 없으면 공백을 사용, 마지막 라인의 단어 수까지 더해줌. END{ print "Word Cound:" word; (End)} |
awk -f word.awk(스크립트 파일) test.txt(대상파일)
<awk 시스템 변수>
$0 | 입력 라인 모두 |
$n | 입력 라인에서 n번째 필드값 |
ARGC | 명령 라인 인자수를 갖는 변수 |
ARGV | 명령 라인의 인자를 포함하는 배열 |
ENVIRON | 환경 변수들을 모아둔 관계형 배열 |
FILENAME | 현재 파일명 |
FS | 구분자 정의, 공백을 디폴트로 사용 |
FNR | 입력 팡리의 레코드 총수 |
NF | 현재 레코드 필드 수 |
NR | 현재 레코드 번호 |
OFMT | 숫자에 대한 출력 포맷 |
OFS | 출력 필드 구분, 빈 라인을 기본으로 사용 |
ORS | 출력 레코드 구분(newline을 기본으로 사용) |
FLENGTH | 지정한 패턴으로 검색되어 나온 문자열의 길이 |
RS | 입력 레코드 구분(newline을 기본으로 사용) |
RSTART | 지정한 패턴으로 검색되어 나온 문자열의 가장 앞부분 |
'보안 공부 > 리눅스' 카테고리의 다른 글
[리눅스] traceroute 명령어 (0) | 2019.10.26 |
---|---|
리눅스 rm 명령어 (0) | 2019.10.23 |
쉘 스크립트(프로그래밍) (0) | 2019.10.16 |
vmware workstation vmware tool [Kali] (0) | 2019.10.14 |
tcpdump (0) | 2019.10.12 |