如何在避免“太多论点”的同时进行 grep

Jus*_*n S 6 linux bash grep

我试图清除一些垃圾邮件,但遇到了一个问题。队列中的文件数量太大,我通常的命令无法处理。它会给我一个关于太多参数的错误。

我通常这样做

grep -i user@domain.com 1US* | awk -F: '{print $1}' | xargs rm
Run Code Online (Sandbox Code Playgroud)

1US* 可以是 1US[a-zA-Z] 之间的任何值。我唯一能做的就是运行这个可怕的装置。它的一个文件,包含 1USa、1USA、1USb 等,贯穿整个字母表。我知道他们必须是一种更有效地运行它的方法。

grep -s $SPAMMER /var/mailcleaner/spool/exim_stage1/input/1USa* | awk -F: '{print $1}' | xargs rm
grep -s $SPAMMER /var/mailcleaner/spool/exim_stage1/input/1USA* | awk -F: '{print $1}' | xargs rm
Run Code Online (Sandbox Code Playgroud)

Gui*_*ido 2

运行多个 grep 实例。代替

grep -i user@domain.com 1US* | awk '{...}' | xargs rm
Run Code Online (Sandbox Code Playgroud)

(for i in 1US*; do grep -li user@domain "$i"; done) | xargs rm
Run Code Online (Sandbox Code Playgroud)

请注意 -l 标志,因为我们只需要匹配的文件名。这将加快 grep 的速度(在第一次匹配时终止)并使您的 awk 脚本不再需要。这可以通过检查 grep 的返回状态并调用 rm 来改进,而不是使用 xargs (xargs 非常脆弱,IMO)。如果您要求,我会给您更好的版本。

希望能帮助到你。