EASY7

리눅스 find, grep, awk 사용하기 본문

보안 공부/리눅스

리눅스 find, grep, awk 사용하기

E.asiest 2019. 10. 21. 00:15

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 지정한 아이노드 번호와 파일을 찾는다.
-print 표준 출력으로 검색된 파일명을 출력한다.
-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
Comments