본문 바로가기
IT지식/개발

[Linux] 원하는 디렉토리/파일/문자열 데이터를 추출해보자. (find | xargs grep)

by 7$ 2020. 2. 14.

access.log 파일 안에, 특정 문자열 데이터를 추출 할 것입니다. 

 

우선 파일을 찾아봅시다.

find

find는 리눅스에서 파일 및 디렉토리를 검색할 때 사용하는 명령입니다.

현재 위치에서 access.log를 파일의 이름으로 찾아보겠습니다. 이름으로 찾는 옵션은 -name 입니다.

~$ find ./ -name "a*.log"

access.log 파일만 추출 되었습니다.

이제 access.log 파일 안에 있는 내용을 살펴보겠습니다.

엄청 나게 많은 내용이 쌓여있네요. 이제 여기서 '/index.php/board' 라는 내용을 추출하겠습니다.

| (pipe)

다중 명령어인 | (pipe)를 사용하겠습니다.

 

| pipe는 두 개 이상의 명령어를 연결해 줍니다. 파이프 앞에서 실행한 명령어의 출력 결과를 파이프 뒤에 실행하는 명령어의 입력 값으로 처리합니다. 따라서 파이프를 사용하면 여러 명령어를 동시에 연결할 수 있습니다.

 

앞서 사용한 명령어 뒤에 사용해보겠습니다.

~$ find ./ -name "a*.log" | 

 

그 다음에 문자열을 추출하는 명령어를 사용하겠습니다. 문자열을 검색하는 명령어는 grep입니다.

grep

하지만 grep만 사용할 수 없습니다. 왜냐하면 find 명령어의 출력 결과가 'access.log' 이기 때문입니다.

~$ find ./ -name "a*.log" | grep "/index.php/board"

그래서 위 명령어를 날리면, 아무런 문자열을 찾지 못합니다. 출력 결과인 access.log이란 문자열에서 검색하기 때문입니다.

 

xargs를 사용하면 파일 이름을 grep의 argument로 넘겨주기 때문에 파일 안에서 문자열을 검색할 수 있을 것 입니다.

~$ find ./ -name "a*.log" | xargs grep "/index.php/board"

몇개가 나왔는지 카운트 해봅시다.

grep의 -c 옵션을 줍니다.

~$ find ./ -name "a*.log" | xargs grep-c "index.php/board"

결과는 5가 나옵니다.

 

find | xargs grep

 

현재 디렉토리의 모든 파일에 대한 grep 명령어는 * 입니다.

~$ grep "index.php/board" *

대소문자 옵션을 주어 구분없이 검색해보자. 대소문자 미구분 옵션은 -i 이다.

~$ grep -i "index.php/board" *

하위 디렉토리까지 검색하는 옵션은 -r

~$ grep -r "cron" *