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"
' "$filename" >&2
exit 1 # or continue or break
esac
"$g" 'Cannot .*TLS' "$filename"
done
每个压缩工具都带有相应的grep工具.对于gzip,bzip2和xz分别称为zgrep,bzgrep和xzgrep.通过使用这些,无需显式解压缩和重新压缩文件.
上面的脚本根据文件后缀选择正确的grep.可以说可以使用普通grep来表示任何未知的后缀.请参阅下文,了解如何在不查看文件名后缀的情况下执行此操作(使用文件工具).
注意我们不需要使用ls循环遍历文件集,并且变量扩展需要双引号.
我忽略了你的代码中的sed调用,因为我不知道这些调用的目的是什么.我还删除了代码末尾的出口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"
' "$filename" >&2
exit 1 # or continue or break
esac
"$g" 'Cannot .*TLS' "$filename"
done
这将正确选择正确的grep工具,无论文件名后缀是什么(只要该文件是受支持的文件类型之一).我还为普通文本文件添加了普通grep.
有关: