파일의 Grep 문자열

파일의 Grep 문자열

한 번의 작업을 위해 폴더 내에 5개의 파일 이름을 만들었습니다. 파일 이름은 다음 형식을 따릅니다.

ES_currentdate_currenttime_processid_uniqueid.log

해당 경로에서 최근 생성된 파일의 상태를 읽고 싶습니다.

쉘 스크립트에서 파일 이름을 구성하는 방법은 다음과 같습니다.

$ filename=ES_*_uniqueid.log
$ echo grep "##status##XRB##" $HOME/log/$filename | sort -u` "

grep5개 파일 모두의 상태를 읽고 에코할 때 . 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

관련 정보