我试图在压缩文件中搜索特定字符串,但无法获得正确的“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
根据文件后缀选择正确的。可以说,可以使用 plaingrep
来表示任何未知的后缀。请参阅下文,了解如何在不查看文件名后缀的情况下执行此操作(使用该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
为普通文本文件添加了 plain 。
有关的: