디렉토리의 최신 파일에서 문자열 검색

디렉토리의 최신 파일에서 문자열 검색

grep현재 디렉터리의 최신 파일에서 문자열을 원합니다 . 다음 명령을 사용하면 최신 파일을 얻을 수 있지만 grep해당 파일 내에서만 얻을 수는 없습니다.

$ ls -lrth 

-rw-r--r--. 1 user pg_user 1712804 Jul 13 22:27 postgresql-2021-07-13_000000.log
-rw-r--r--. 1 user pg_user       0 Jul 14 00:00 postgresql-2021-07-14_000000.log

$ ls -lt postgresql-*.log | head -n 1 
-rw-r--r--. 1 user pg_user       0 Jul 14 00:00 postgresql-2021-07-14_000000.log

이제 나는 grep문자열을 원한다postgresql-2021-07-14_000000.log

echo두 가지 명령을 하나의 명령으로 결합하여 화면에 출력하려면 어떻게 해야 합니까 ? 그것은 마치

$ls -lt postgresql-*.log | head -n 1 | grep "system is ready" 

(여기서 뭔가가 빠졌다는 것을 나만 알고 있습니다.)

답변1

zsh쉘 사용 :

grep -F 'system is ready' postgresql-*.log(.om[1])

패턴은 postgresql-*.log(.om[1])현재 디렉터리에서 선택한 파일과 일치하는 일반 와일드카드 패턴( )과 postgresql-*.log와일드카드 패턴의 동작을 수정하는 와일드카드 한정자( (.om[1])) 로 구성됩니다. 와일드카드 한정자는 zsh셸 에만 적용됩니다 .

여기에 사용된 globbing 한정자는 일반 파일( .)만 일치시키고 일치로 생성된 이름 목록이 om수정 타임스탬프( )별로 정렬되도록 보장합니다. 그런 다음 정렬된 일치 항목 목록에서 를 사용하여 첫 번째 일치 항목만 추출하여 [1]가장 최근에 수정된 와일드카드 패턴과 일치하는 파일 이름을 제공합니다.

대화형 셸이 아닌 경우 에도 다음과 같이 할 zsh수 있습니다 .zsh

zsh -c 'grep -F "system is ready" postgresql-*.log(.om[1])'

네가 물어본 이후로스크립트이것을하기 위해:

#!/bin/zsh

grep -F 'system is ready' postgresql-*.log(.om[1])

관련된:

답변2

xargs당신이 놓친 것은 명령 인 것 같습니다 . 귀하의 예를 들어 다음을 사용할 수 있습니다

ls -t postgresql-*.log | head -n 1 | xargs grep "system is ready" 

xargs명령은 표준 입력에서 명령줄을 실행하는 데 사용됩니다. 이 경우 명령 grep에 의한 파일 출력이 됩니다 head.

이것이 올바르게 작동하려면 -l원본 파일에 이 플래그를 포함 하지 마십시오 ls. 따라서 head 명령의 결과는 추가 정보가 인쇄되지 않고 파일 이름만 됩니다 -l.

익숙하지 않다면 xargs인터넷에서 빠르게 검색하여 사용 방법에 대한 훌륭한 튜토리얼을 많이 찾아보세요.

관련 정보