grep은 .bashrc 함수에서 여러 파일을 출력합니다.

grep은 .bashrc 함수에서 여러 파일을 출력합니다.

변수(주로 디렉터리)로 전달되고 두 개의 서로 다른 프로그램을 실행하는 bash 구성 파일에 함수를 만들려고 합니다. 변수는 일반적으로 다음과 같습니다 ~/logdirectory/*.log. 내 .txt 파일에는 약 25개의 파일이 있습니다 /logdirectory/. 명령줄에서 함수의 각 줄을 실행하면 예상대로 실행됩니다.

첫 번째 줄은 명령줄에서 25개 파일 모두에 대한 결과를 반환하는 Python 스크립트를 실행하지만 함수 내에서 실행하면 1개 파일(디렉토리의 첫 번째 파일)에 대한 결과만 반환됩니다.

두 번째 줄은 동일한 로그 파일 세트를 grep /logsdirectory/하고 모든 로그 파일에 있어야 하는 값을 찾은 다음 모든 결과를 파이프하여 awk반환 값에 대한 계산을 수행해야 합니다. 그러나 첫 번째 줄과 마찬가지로 디렉터리의 첫 번째 파일에 대한 결과만 반환합니다. 내가 무엇을 놓치고 있는지 또는 무엇을 해야 하는지 아는 사람이 있나요? for/ do루프의 하위 기능을 사용하여 작동시키려고 시도 했지만 성공하지 못했습니다. 아래는 제가 사용하는 기능입니다. 어떤 지침이라도 대단히 감사하겠습니다. 감사해요!

plotstats() {
    #take log directory and run plotman analyze
    plotman analyze $1
    grep -i "total time" $1 |awk '{sum=sum+$4} {avg=sum/NR} {tday=86400/avg*6*101.366/1024} END {printf "%d K32 plots, avg %0.1f seconds, %0.2f TiB/day \n", NR, avg, tday}' 
}

답변1

"$@". 대신 사용 하고 변수(및 쉘 위치 매개변수 - 예를 들어 인용되지 않은 대신 $1사용)를 사용할 때는 큰따옴표를 사용하는 것을 기억하세요 ."$1"$1

plotstats() {
    #take log directory and run plotman analyze
    plotman analyze "$@"
    grep -h -i "total time" "$@" |
      awk '{sum=sum+$4}
           {avg=sum/NR}
           {tday=86400/avg*6*101.366/1024}
           END {printf "%d K32 plots, avg %0.1f seconds, %0.2f TiB/day \n", NR, avg, tday}' 
}

그런데 awk 스크립트의 세 블록은 {}하나로 결합될 수 있으며 줄 바꿈이나 세미콜론으로 구분될 수 있습니다. 조건이 없으면 항상 모든 입력 라인에 대해 실행되므로 별도의 블록으로 만들 필요가 없습니다.

그것이 무엇을 하는지 모르기 plotman때문에 명령줄에서 여러 파일 이름 인수를 처리한다고 가정합니다. 한 번에 하나의 파일 이름만 사용할 수 있는 경우 이 명령에서 "$@"를 사용하는 대신 for 루프로 래핑하세요. 예를 들어

for f in "$@" ; do
  plotman analyze "$f"
done

관련 정보