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工具。对于gzipbzip2和,它们分别xz称为zgrepbzgrepxzgrep。通过使用这些,无需显式解压缩和重新压缩文件。

上面的脚本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 。

有关的:

相关内容