grep, find, awk 명령어 정리를 잘 해둔 곳이 있어
출처를 남기고 퍼옴.
https://infrajp.tistory.com/24
- grep
: 파일 내용이나 콘솔상의 출력 내용에서 특정 문자열을 찾아서 보여줍니다.
1) 파일에서 word 문자열을 찾아 출력합니다.
$ grep word test.txt
2) 현재 디렉토리상에 있는 모든 파일에서 word 문자열이 포함된 줄을 찾아 출력합니다.
$ grep word *
3) 현재 디렉토리 및 하위에 있는 모든 파일에서 word 문자열이 포함된 줄을 찾아 출력합니다.
$ grep -r word *
4) 파일에서 word 문자열을 찾아 다음 3줄을 포함해서 출력합니다.
$ grep word test.txt -A 3
5) 파일에서 word 문자열을 찾아 이전 3줄을 포함해서 출력합니다.
$ grep word test.txt -B 3
6) 파일에서 word 문자열을 찾아 줄번호를 포함해서 출력합니다.
$ grep word test.txt -n
7) 파일에서 word 문자열이 포함된 줄을 제외하고 출력합니다.
$ grep -v word test.txt
8) 파일에서 (word1 or word2) 문자열이 포함된 줄을 출력합니다. ( or 연산자 = | 는 특수기호이므로 역슬래시를 붙여줍니다. )
$ grep "word1|word2" test.txt
9) 파일에서 (word1 and word2) 문자열이 포함된 줄을 출력합니다.
$ grep word1 test.txt | grep word2
10) 옵션 혼합 가능
$ grep -rn word /home/test -B 5 -A 3
=> /home/test 폴더 하위 모든 파일에서 word 문자열을 찾아서 해당 문자열 이전 5줄, 이후 3줄에 줄번호를 포함해서 출력합니다.
11) pipe 로 다른 명령어의 표준 출력과 연계가능
$ cat /home/test/test.txt | grep word
-c 옵션으로 찾는 문자열이 포함된 라인의 개수를 함께 출력
-i 옵션으로 대소문자를 구분
-r 옵션으로 하위 dir 까지 검색 가능
- find
: 파일 및 디렉토리 등 검색할 때 사용합니다
1) /home/test 하위 파일, 디렉토리, 링크, 소켓 등등 모든 것을 출력합니다.
$ find /home/test
2) /home/test 하위 파일만 출력합니다. ( -type d = 디렉토리만 출력 )
$ find /home/test -type f
3) /home/test 하위 파일 중 크기가 5MB 이상인 파일만 출력합니다.
$ find /home/test -type f -size +5M
4) /home/test 하위 파일 중 크기가 5MB 이상이고 권한이 644인 파일만 출력합니다.
$ find /home/test -type f -size +5M -perm 644
5) /home/test 하위 파일 중 크기가 5MB 이상이고 파일이 변경된지 5일이 지난 파일만 출력합니다.
(일자 옵션 - s : 초, m : 분, h : 시, d : 일, w : 주)
$ find /home/test -type f -size +5M -mtime +5d
찾은 파일들을 일괄적으로 for문을 돌며 처리할 수 있다.
예를 들어 date 날짜로부터 3일 이후에 만들어진 파일들을 삭제하고 싶다면
find /home/test -mtime -3d -exec rm {} \;
파일들을 {} 내부에 하나씩 for문을 돌면서 넣은 후 rm 명령어를 실행시킨다.
뒤에 \; 은 exec 를 끝낸다는 의미임.
- awk
: 패턴 탐색과 처리를 위한 명령어로 간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 명령어이다.
: F 옵션을 통해 구분자를 지정할 수 있다. 콜론으로 구분하고 싶으면 -F: 플러스기호로 구분하고 싶으면 -F+
: 구분된 인자는 $1 부터 차례대로 할당된다.
기본 문법
$ awk 'pattern' filename
$ awk '{action}' filename
$ awk 'pattern' '{action}' filename
$ awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
ex) $ ls -al
total 1111
drwxr-xr-x 6 test staff 192 2 20 10:10 .
drwxr-xr-x 4 test staff 128 2 20 10:10 ..
-rwxr-xr-x 1 test staff 100 2 20 10:10 a.txt
-rwxr-xr-x 1 test staff 100 2 20 10:10 b.txt
-rw-r--r-- 1 test staff 100 2 20 10:10 c.txt
공백으로 분리하면
$1 : '-rw-r--r--'
$2 : '1'
$3 : 'test'
$4 : 'staff'
$5 : '100'
$6 : '2'
$7 : '20'
$8 : '10:10'
$9 : 'c.txt'
$ ls -al | awk -F " " '{print $9}'
.
..
a.txt
b.txt
c.txt
위에 -F " " 는 없어도 괜춘. 왜냐면 default 가 공백이니까.
$ df -Th | awk '{gsub ("%", "&"); print $4 $5 $6}'
위와 같이, awk 의 print 앞에 gsub 라는 내부 함수를 사용할 수 있다.
이 함수는 awk 의 출력값 내 앞의 파라미터 값을 뒤의 파라미터 값으로 replace 한다.
여기서는 % 를 & 로 바꾸었다.
$ awk '{ sum += $3; cnt++ } END { print sum/cnt }' mylog.log
awk 를 이용하여 평균을 구하는 방법은 위와 같다.
'Linux' 카테고리의 다른 글
[Linux] 메모리를 다 쓰면 일어나는 일 핵심 요약 (0) | 2021.06.08 |
---|---|
[Linux] 서버 환경 확인 명령어들 (0) | 2021.05.16 |
[Linux] process 한 번에 kill 하는 방법 (0) | 2021.04.13 |
[Linux] 리눅스 서버 60초안에 상황 파악하기 공부 필기 (3) | 2021.02.14 |
[Alpine Linux] Openjdk 설치하는 방법 링크 (0) | 2021.01.04 |