grep 查找文件中的多个字符串,然后按大小顺序列出文件

grep 查找文件中的多个字符串,然后按大小顺序列出文件

我在一个有很多.txt文件的文件夹中,我想找到同时包含 和 的所有文件stringAstringB不一定在同一行),然后按大小顺序列出这些文件(从小到大)

我已经尝试过以下方法,但它不起作用:

ls -lS | for f in *; do grep -q stringA $f && grep -l stringB $f; done

有人有好主意吗?

答案1

您可以使用GNU find

find . -maxdepth 1 -exec grep -q stringA {} \; -exec grep -q stringB {} \; \
        -printf '%10s %p\n' | 
    sort -n

答案2

使用(可移植且文件名中没有空格问题):

perl -Mautodie -wle '
    for (<"*.txt">) {
        open my $fh, "<", $_;
        my @list = <$fh>;
        close $fh;
        if (grep { /stringA/ } @list and grep { /stringB/ } @list) {
            $h->{$_}->{size} = (stat($_))[8];
        }
    }
    END{
        print join "\n", sort { $h->{$a}->{size} <=> $h->{$b}->{size} } keys %$h;
    }
'

答案3

使用zshGNU 工具:

grep -lZ -- stringA *.txt(oL) | xargs -r0 grep -l -- stringB

答案4

 egrep -l '(stringA|stringB)' * | xargs ls -1S

egrep允许使用正则表达式,因此上面将在所有文件中搜索 stringA 或 stringB,该-l选项告诉egrep只输出匹配的文件(并抑制匹配行的输出)。通过管道将其传递到xargs ls -1S会将所有匹配的文件传递到ls -1S.-1告诉 ls 每行列出一个文件,并-S告诉 ls 按文件大小而不是名称排序。

编辑哎呀,这是一个 OR(误读了问题)。

在这种情况下,对 sputnick 的解决方案进行修改以使用两个 grep

grep -l stringA * | xargs grep -l stringB | xargs -ls -1S

(至少绕了一圈dusort少了一个过程:)

相关内容