리눅스에서 2개의 파일에서 필요한 키워드만뽑아서 정렬 어떻게내나요.??

apple.log 
banana.log


✅최고의 답변✅

grep 은 표준입력으로부터 내용을 읽어서 원하는 검색어로 찾는 역할만 합니다.

cat input.txt | grep 'testcode' grep 'testcode' input.txt

파일명을 함께 출력하려면 다른 명령어와 함께 조합해서 써야 됩니다.

find 로 특정 파일명을 찾은 후에 grep 을 실행하는 방법이 있습니다.

다음과 같이 입력파일을 준비합니다.

-- apple.log -- 2023-11-22 23:34:32.1700663672 2023-11-22 23:34:33.1700663673 2023-11-22 23:34:33.1700663673 2023-11-22 23:34:33.1700663673 testcode 2023-11-22 23:34:34.1700663674 2023-11-22 23:34:34.1700663674 2023-11-22 23:34:34.1700663674 2023-11-22 23:34:34.1700663674 testcode 2023-11-22 23:34:35.1700663675 2023-11-22 23:34:35.1700663675
-- banana.log -- testcode 2023-11-22 23:34:32.1700663672 testcode 2023-11-22 23:34:33.1700663673 testcode 2023-11-22 23:34:34.1700663674 testcode 2023-11-22 23:34:35.1700663675

우선 find 로 *.log 패턴을 따르는 파일을 찾습니다.

find . -maxdepth 1 -type f -name '*.log' --- (실행결과 및 설명) ./mariadb-access.log ./apple.log ./banana.log 현재 경로에서 이름이 .log 로 끝나는 파일을 모두 찾음.

find 에는 -exec -ok 등 검색된 파일을 다른 명령의 입력으로 전달하는 옵션이 있습니다. 파이프연산자('|') 를 써도 되지만 좀 더 간결하게 자체 제공하는 기능이 더 유용하기도 합니다.

앞서 찾은 파일에서 testcode 가 들어 있는지 확인하기 위해서 grep 을 연결해봅니다.

find . -maxdepth 1 -type f -name '*.log' -exec grep testcode {} \+ --- (실행결과 및 설명) ./apple.log:testcode 2023-11-22 23:34:34.1700663674 ./apple.log:testcode 2023-11-22 23:34:35.1700663675 ./banana.log:testcode 2023-11-22 23:34:32.1700663672 ./banana.log:testcode 2023-11-22 23:34:33.1700663673 ./banana.log:testcode 2023-11-22 23:34:34.1700663674 ./banana.log:testcode 2023-11-22 23:34:35.1700663675

-exec 뒤에 명령어와 헤당 명령어의 옵션이 오는데 뒤에 붙는 '{}(스페이스)\+' 는 find 가 찾아낸 결과를 가리킵니다. 더 깊이 들어가면 머리아플 수 있으니까 이 부분은 find 매뉴얼을 참고하세요.

find 와 grep 을 조합한 결과에서는 순차적으로 조사하다 보니 파일명이 시간에 따라 정렬할 수 없는데 이것을 위해 이번에는 sort 명령을 조합해봅니다.

find . -maxdepth 1 -type f -name '*.log' -exec grep testcode {} \+ | sort -k 2 -k 3 -k 4 --- (실행결과 및 설명) ./banana.log:testcode 2023-11-22 23:34:32.1700663672 ./banana.log:testcode 2023-11-22 23:34:33.1700663673 ./apple.log:testcode 2023-11-22 23:34:34.1700663674 ./banana.log:testcode 2023-11-22 23:34:34.1700663674 ./apple.log:testcode 2023-11-22 23:34:35.1700663675 ./banana.log:testcode 2023-11-22 23:34:35.1700663675

sort 는 -k (정렬할 키 번호) 로 몇번째 열을 기준으로 정렬할지 정할 수 있습니다. 스페이스를 기준으로 봤을 때 파일명 + :testcode 가 1번으로 인식될 것 같고 그 다음인 날짜(2), 시각(3) 일 것 같네요.

이러면 원하는 결과가 되었을까요?

앞의 './' 는 역시나 sed 또는 awk 를 통해서 치환하면 됩니다.

find . -maxdepth 1 -type f -name '*.log' -exec grep testcode {} \+ | sort -k 2 -k 3 -k 4 | sed 's/^\.\///g' --- (실행결과 및 설명) banana.log:testcode 2023-11-22 23:34:32.1700663672 banana.log:testcode 2023-11-22 23:34:33.1700663673 apple.log:testcode 2023-11-22 23:34:34.1700663674 banana.log:testcode 2023-11-22 23:34:34.1700663674 apple.log:testcode 2023-11-22 23:34:35.1700663675 banana.log:testcode 2023-11-22 23:34:35.1700663675

(입력) | sed 's(치환)/변경할패턴/치환할패턴/g(전체적으로 적용)'

find . -maxdepth 1 -type f -name '*.log' -exec grep testcode {} \+ | sort -k 2 -k 3 -k 4 | awk -F'./' '{print $2}' --- (실행결과 및 설명) banana.log:testcode 2023-11-22 23:34:32.1700663672 banana.log:testcode 2023-11-22 23:34:33.1700663673 apple.log:testcode 2023-11-22 23:34:34.1700663674 banana.log:testcode 2023-11-22 23:34:34.1700663674 apple.log:testcode 2023-11-22 23:34:35.1700663675 banana.log:testcode 2023-11-22 23:34:35.1700663675

awk -F(구분자 문자열) '{print (구분자를 기준으로 한 전후 출력할 순번)}'

여기선 './' 앞($1)에는 아무 것도 없으므로 './' 뒤를 의미하는 $2 를 출력함.