한 번의 작업을 위해 폴더 내에 5개의 파일 이름을 만들었습니다. 파일 이름은 다음 형식을 따릅니다.
ES_currentdate_currenttime_processid_uniqueid.log
해당 경로에서 최근 생성된 파일의 상태를 읽고 싶습니다.
쉘 스크립트에서 파일 이름을 구성하는 방법은 다음과 같습니다.
$ filename=ES_*_uniqueid.log
$ echo grep "##status##XRB##" $HOME/log/$filename | sort -u` "
grep
5개 파일 모두의 상태를 읽고 에코할 때 . grep
최근에 생성된 파일에서만 문자열을 가져오길 원합니다 .
누구든지 솔루션을 제공할 수 있나요?
답변1
파일 이름은 시간순으로 작성하면 문제가 되지 않습니다. 이것을 사용하여 tail -1
파일 목록의 마지막 파일을 가져옵니다. 이 파일은 항상 최신 파일이어야 합니다.
$ filename=ES_*_uniqueid.log
$ grep "##status##XRB##" $(ls -tr $filename | tail -1)
ls -tr $filename | tail -1
그러면 단일 결과인 최신 파일을 반환하는 하위 명령이 실행됩니다 . 그러면 일치하는 문자열을 찾기 위해 파일이 검색됩니다 ##status##XRB##
.
답변2
zsh에서 (설명하다:
grep "##status##XRB##" ~/log/ES_*.log(om[1])
날짜가 적절한 형식(YYYYmmdd_HHMMSS)인 경우 파일 이름의 사전순 순서는 시간순과 일치합니다. 따라서 ksh 또는 bash에서는 일치하는 파일의 이름을 배열에 넣습니다. 현재 있는 파일이 마지막 배열 요소가 됩니다.
logs=(~/log/ES_*.log)
grep "##status##XRB##" "${logs[${#logs}-1]}"
POSIX 셸(예 /bin/sh
: )을 사용하는 경우에만 위치 매개변수를 사용할 수 있습니다.
grep_last_match () {
eval set -- \"\${$#}\"
grep "##status##XRB##" "$1"
}
grep_last_match ~/logs/ES_*.log