압축 파일에서 특정 문자열을 검색하려고 하는데 올바른 "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
합니다 . 이를 사용하면 파일을 명시적으로 압축 해제하고 다시 압축할 필요가 없습니다.zgrep
bzgrep
xzgrep
위 스크립트는 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
일반 텍스트 파일에도 일반을 추가했습니다 .
관련된: