>

질문 을했지만 유용한 답변을 얻었지만 아직 필요한 정보가 없습니다. 내가 지금까지 가지고있는 것 :

#!/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 readfor 를 추천하지만, 큰 문제는 아니지만 여전히 작동합니다.  더 루프처럼 :

    for file in ./* ;
    
    

    이것은 같은 파일을 반복하지만 조금 더 직설적입니다. 또한 ls  명령은 파일 이름이 아닌 출력을 반환 할 수 있습니다 ( ls  디렉토리/실행 파일에 대해 다른 글꼴 색을 사용합니까?) 다른 명령이 슬플 수 있습니다.

    명령 : egrep "ERROR|FAIL|WARN" > ../errors-$file   egrep 하려고합니다   ERROR|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
    
    

관련 자료

  • 이전 터미널 출력 잘림 문제를 진단하는 방법
  • 다음 permissions - 여러 사람을위한 웹 서버 보안?