로그를 스캔하고, 특정 데이터를 추출하고, 출력 디렉터리를 생성하는 스크립트

로그를 스캔하고, 특정 데이터를 추출하고, 출력 디렉터리를 생성하는 스크립트

내가 한번 물어본 적이 있다.질문로그 파일에서 특정 정보를 추출하는 방법에 대해 얼마 전에 게시하여 유용한 답변을 얻었지만 필요한 정보를 얻지 못했습니다. 내가 지금까지 가지고 있는 것:

#!/bin/bash


mkdir result

cd $1
ls | while read -r file;
do
egrep "ERROR|FAIL|WARN" > ../errors-$file
done
cd ..

mv errors-* result

이것이 내가 원하는 것입니다. 로그 디렉터리를 스캔하고 ERROR|FAIL|WARN이 포함된 텍스트의 모든 줄(일부는 여러 줄)을 캡처한 다음 이를 각 개별 파일과 함께 "result"라는 이름의 디렉터리에 출력하는 스크립트입니다. 소스 파일에 따라.

대상 로그 디렉터리에 텍스트 파일이 하나만 있을 때는 작동하지만 대상 디렉터리에 다른 수준의 디렉터리와 로그 파일이 포함되어 있으면 작동하지 않습니다. 나는 이것이 스크립트의 "../errors-$file" 비트 때문이라는 것을 알고 있지만 이를 변경하는 방법을 모릅니다.

어떤 도움이라도 좋을 것입니다. 부적절하게 표현된 경우 미리 사과드립니다.

답변1

나는 귀하의 루프 자체를 조사하고 그것이 실제로 무엇을 하고 있는지 이해한 다음 원하는 것을 달성하는 방법을 알아보려고 노력할 것입니다.

루프를 시작하는 방법이 너무 복잡합니다 ls | while read -r file;. 결과를 ls당신의 것으로 파이프하면 while read큰 문제는 아니지만 여전히 작동하지만 for다음과 같은 루프를 권장합니다.

for file in ./* ;

이는 동일한 파일을 반복하지만 좀 더 간단합니다. 또한 이 ls명령은 파일 이름 이상의 출력을 반환할 수 있으므로( ls디렉터리/실행 파일의 글꼴 색상이 다른 것을 본 적이 있습니까?) 이로 인해 다른 명령에 문제가 발생할 수 있습니다.

귀하의 명령은 아무것도 하지 egrep "ERROR|FAIL|WARN" > ../errors-$file않고 출력을 .egrepERROR|FAIL|WARN../errors-$file

구문은 다음 egrep과 같습니다.

egrep [search pattern] [location]

egrep그래서 보아야 할 점을 놓쳤습니다. $file패턴 뒤에 추가하여 이 문제를 해결할 수 있습니다 .

#!/bin/bash


mkdir result

cd $1
for file in $(find ./ -type f)
do
egrep "ERROR|FAIL|WARN" $file > ../result/errors-$(basename $file)
echo "-------------------------------" >> ../result/errors-$(basename $file)
egrep "denied" -B 1 $file >> ../result/errors-$(basename $file)
done

관련 정보