일반적으로 로그를 검색할 때 최근 이벤트를 찾습니다. 결국 bash 프롬프트에서 Tab 키를 눌러 이름을 완성했습니다.
결국 날짜 산술을 사용하여 파일 이름을 만드는 bash 별칭을 만들었습니다. 다음과 같은 것
grep <test> `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-3 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-2 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-1 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-0 days"`
이것을 최적화할 수 있는 방법이 있나요? 이상적으로는 localhost_access_log.2019-06-24.txt 또는 api-2019-06-24-1.log와 같은 가장 최근 파일 3개를 grep하기 위해 여러 개의 별칭을 만들고 싶습니다. 날짜 명령 코드. 본질적으로 내가 보낸 패턴을 기반으로 오늘의 로그 파일을 포함하여 가장 최근의 파일 이름 4개를 반환하고 grep 명령에 전달할 수 있는 bash 기능에 대한 도움말을 찾고 있습니다.
답변1
고집하지 않는다면 다음 을 사용하여 쉽게 이 작업을 수행 bash
할 수 있습니다 .zsh
setopt extendedglob
grep <test> *(ND.om[1,4])
현재 디렉터리의 최신 파일 4개를 검색합니다.
설명하다:
N
- "null glob"을 켭니다(glob 패턴이 일치하지 않으면 자동으로 모든 것을 교체합니다).D
- "GLOB_DOTS" 열기("숨겨진 파일"과도 일치).
- 일반 파일 일치om
- 수정 시간별로 정렬[1-4]
- 배열 첨자
순수한 bash 솔루션은 다음과 같습니다.
grep test $(ls -1rt | tail -n 4)
(그러나 공백이 포함된 파일 이름과 같은 이상한 파일 이름에서는 실패합니다.)
find . -maxdepth 1 -type f -name "pattern" -mtime -1 -exec grep test {} +
pattern
현재 디렉터리에서 마지막 날 수정된 이름과 일치하는 파일을 검색합니다 (4개 이상일 수도 있지만 0개일 수도 있음). 그러나 펑키한 파일 이름은 처리할 수 있습니다.
답변2
이는 bash
단순성을 기반으로 한 솔루션입니다. ls
각 로그 파일이 특정 날짜의 것이라고 가정하고 지정된 와일드카드와 일치하는 N개의 최신 파일을 나열하는 방식으로 작동합니다 .
$ grep test $(ls -tr localhost_access_log.*.txt | tail -4)
이것이 ls 출력을 구문 분석하는 데 현명하지 못한 경우로 간주되면 대신 다음을 사용하십시오.
$ grep test $(find . -name localhost_access_log.\*.txt -mtime -3d)
일반적으로 요점은 날짜 계산에 문제가 발생하지 않도록 하는 것입니다. grep
N개의 최신 파일을 실행하면 됩니다 . 다시 말하지만, 귀하의 질문에서 알 수 있듯이 이는 로그가 매일 교체된다고 가정합니다.