File:
첫 번째 파일은 설명자로 식별되고 나머지 파일은 +
문자로 시작하는 별도의 줄에 있는 구조화된 파일 이름 목록을 포함하는 로그 파일을 얻었습니다 .
File:
일단 감지되면 일치하는 패턴을 사용하여 파일 이름을 인쇄하는 루프를 원합니다 . 그런 다음 +
처음부터 파일 이름을 계속 선택합니다 . 빈 줄에 도달하거나 다른 필드 이름(예 Package:
: ) 이 나타나면 파일 읽기가 중지됩니다.
cat /home/flora/logs/27043-T13:09:44.893003954.log
%rec: dyna
Ptrn: Gnu
File: /home/flora/dynamic.sh
+ /home/flora/comint.sh
+ /home/flora/linge/engine.sh
+ /home/flora/Opstk/playa.sh
+ /home/flora/bin/edv.sh
+ /home/flora/Opstk/bin/ling.rc
+ /home/flora/parade.rc
System: 64-Bit
read
변수를 사용하여 전체 파일 목록을 저장할 때 메모리 부족 문제를 방지하려면 간단하게 시작하세요 .
while IFS= read -rd '' fl; do
grep --color -ni -C 8 -e "$ptrn" -- "$fl"
done < "$logfl"
ptrn
각 파일에 대해 호출되는 검색 패턴을 정의합니다.
답변1
이 질문에 대한 댓글에서recutils
, 당신은 이 데이터를 GNU 도구 세트에서 읽을 수 있는 형식으로 변환했다고 언급했습니다.
다음 도구를 사용하여 경로 이름을 추출하고 다음을 호출해 보겠습니다 grep
.
recsel -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}
File
그러면 이름이 지정된 파일의 필드와 연관된 값이 선택되어 인쇄됩니다 $logfl
. 명령으로 생성된 각 줄에 대해 recsel
를 xargs
호출하여 grep
의 기본 정규식과 일치하는 줄을 추출합니다 $ptrn
.
질문 파일의 내용은 다음과 같습니다.하나의줄바꿈이 포함된 값입니다.
별도의 값을 가진 여러 필드가 포함된 레코드 파일이 있는 경우 File
다음을 사용할 수 있습니다.
recsel -C -P File -- "$logfl" | xargs -I {} grep -e "$ptrn" -- {}
답변2
프로세스 대체를 사용하고 (전체 파일 대신) 반복할 파일 이름이 있는 줄만 전달합니다.
while IFS= read -r fl; do
grep --color -ni -C 8 -e "$ptrn" -- "$fl"
done < <(grep -o '/.*' "$logfl")
또는 전체 파일을 처리하되 키워드가 나타날 때까지 한 줄씩 건너뛴 다음 키워드가 사라질 때까지 File:
문자열 조작으로 한 줄씩 처리한 다음 읽기를 중지합니다./${fl#*/}
+
# some control flags
begin=
exit=continue
while IFS= read -r fl; do
case ${fl%[[:blank:]]*} in
*File:*)
begin=start
;;
*+*)
exit=break
;;
*)
$exit
;;
esac
[ "$begin" ] && \
grep --color -ni -C 8 -e "$ptrn" -- "/${fl#*/}"
done < "$logfl"