如何使用我的下一个参数的前一个输出来 grep 一个字符串?

How do I grep a string using the previous output for my next argument?

文件中有一个以 4bceb 开头且长度为 32 个字符的字符串。 为了找到它,我尝试了以下

输入:

find / -type f 2>/dev/null | xargs grep "4bceb\w{27}" 2>/dev/null

输入命令后,脚本似乎正在等待其他命令。

你的命令原则上似乎没问题,即它应该为每个文件 find returns 正确执行 grep 命令。但是,我不相信您的正则表达式(分别是您调用 grep 的方式)对于您想要实现的目标是正确的。

首先,为了使您的表达式起作用,您需要通过指定 -P 标志来告诉 grep 您正在使用 Perl 语法。

其次,您的正则表达式将 return 包含以“4bceb”开头的序列的完整行 至少 32 个字符长,但 也可能更长。例如,如果您的 ./test.txt 文件内容是

4bcebUUUUUUUUUUUUUUUUUUUUUUUU31
4bcebVVVVVVVVVVVVVVVVVVVVVVVVV32
4bcebWWWWWWWWWWWWWWWWWWWWWWWWWW33
sometext4bcebYYYYYYYYYYYYYYYYYYYYYYYYY32somemoretext
othertext 4bcebZZZZZZZZZZZZZZZZZZZZZZZZZ32 evenmoretext

您的输出将包括除第一行以外的所有行(其中序列短于 32 个字符)。如果您实际上想将结果限制为仅包含恰好 32 个字符长的序列的行,则可以将 -w 标志(对于 word-regexp)与 grep 一起使用,这只会 return 上例中的第 2 行和第 5 行。

第三,如果您只需要匹配而不需要周围的文本,grep 标志 -o 就可以做到这一点。

最后,您不需要将 find 输出通过管道传输到 xargs,因为 grep 可以直接执行您想要的操作:

grep -rnPow / -e "4bceb\w{27}"

将递归地 (-r) 扫描从 / 和 return 开始的所有文件,只扫描包含匹配词的文件,以及匹配项(以及它们的行号)被发现,作为标志 -n):

./test.txt:2:4bcebVVVVVVVVVVVVVVVVVVVVVVVVV32
./test.txt:5:4bcebZZZZZZZZZZZZZZZZZZZZZZZZZ32