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
인터넷에서 빠르게 검색하여 사용 방법에 대한 훌륭한 튜토리얼을 많이 찾아보세요.