xargs 사용법 구문

xargs 사용법 구문

압축 파일에서 특정 문자열을 검색하려고 하는데 올바른 "xargs" 구문을 찾을 수 없습니다.

파일은 올바르게 압축 해제/압축되었지만 xargs는 실제로 아무것도 검색하지 않습니다(실패한 TLS 이메일을 찾고 있습니다).

누구든지 올바른 xargs 구문에 대한 조언을 줄 수 있습니까?

for filename in $( ls -1 ${HOST}-mail-2018${1}[0-9][0-9]* )
do
  filetype=${filename##*.}
  case $filetype in
    bz2)
        unzipper="bzip2 -d "
        zipper="bzip2"
        unzfile=${filename%.${filetype}}
        ;;
    gz)
        unzipper="gzip -d "
        zipper="gzip "
        unzfile=${filename%.${filetype}}
        ;;
    xz)
        unzipper="xz -d "
        zipper="xz "
        unzfile=${filename%.${filetype}}
       ;;
    *)
        echo "Unknown compression type for file $filename"
        break
        ;;
   esac
        #  Testing:    echo $unzipper $zipper $unzfile
        echo $unzipper $zipper $filename $unzfile

   eval ${unzipper} ${filename}
   grep 'Cannot .*TLS' ${unzfile} | sed 's/^.*]: //' | sed 's/:.*//' |  xargs fgrep
   eval ${zipper} ${unzfile}
done
exit 0

답변1

for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
    case $filename in
        *.gz)  g=zgrep  ;;
        *.bz2) g=bzgrep ;;
        *.xz)  g=xzgrep ;;
        *) printf 'Unknown filetype for "%s"\n' "$filename" >&2
           exit 1   # or continue or break
    esac

    "$g" 'Cannot .*TLS' "$filename"
done

모든 압축 도구에는 해당 grep도구가 함께 제공됩니다. gzip, bzip2및 의 경우 각각 , 및 라고 xz합니다 . 이를 사용하면 파일을 명시적으로 압축 해제하고 다시 압축할 필요가 없습니다.zgrepbzgrepxzgrep

위 스크립트는 grep파일 접미사를 기반으로 올바른 것을 선택합니다. 일반은 grep알려지지 않은 접미사를 나타내는 데 사용될 수 있다고 말할 수 있습니다 . 파일 이름 접미사를 보지 않고 이 작업을 수행하는 방법(이 file도구 사용) 은 아래를 참조하세요.

우리가 어떻게아니요파일 세트에 대한 반복 에 필요하며 ls변수 확장은 큰따옴표로 묶어야 합니다.

sed이러한 호출의 목적이 무엇인지 모르기 때문에 코드의 호출을 무시하고 있습니다 . 또한 exit 0루프를 종료하는 경우 스크립트의 다른 종료 상태를 가리기 때문에 코드 끝에서 를 제거했습니다 .


파일의 MIME 유형을 사용하여 올바른 grep도구를 선택하세요.

for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
    case $( file -b -i "$filename" ) in
        text/plain*)          g=grep   ;;
        application/x-gzip*)  g=zgrep  ;;
        application/x-bzip2*) g=bzgrep ;;
        application/x-xz*)    g=xzgrep ;;
        *) printf 'Unknown filetype for "%s"\n' "$filename" >&2
           exit 1   # or continue or break
    esac

    "$g" 'Cannot .*TLS' "$filename"
done

grep그러면 파일 이름 접미사에 관계없이 올바른 도구가 올바르게 선택됩니다(파일이 지원되는 파일 형식 중 하나인 경우). grep일반 텍스트 파일에도 일반을 추가했습니다 .

관련된:

관련 정보