如何使用上一个输出的下一个参数对字符串进行grep?

问题描述

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

输入:

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

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

解决方法

您的命令在原则上似乎还不错,即它应为grep返回的每个文件正确执行find命令。但是,我不认为您的正则表达式(分别称为grep的方式)对于您想要实现的目标是正确的。

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

第二,您的正则表达式将返回包含以“ 4bceb”开头的序列的完整行,这些序列的长度至少为 32个字符,但可能更长。例如,如果您的./test.txt文件内容是

4bcebUUUUUUUUUUUUUUUUUUUUUUUU31
4bcebVVVVVVVVVVVVVVVVVVVVVVVVV32
4bcebWWWWWWWWWWWWWWWWWWWWWWWWWW33
sometext4bcebYYYYYYYYYYYYYYYYYYYYYYYYY32somemoretext
othertext 4bcebZZZZZZZZZZZZZZZZZZZZZZZZZ32 evenmoretext

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

第三,如果您只想要匹配项,而不想要周围的文本,则grep标志-o会做到这一点。

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

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

将递归(-r)扫描从/开始的所有文件,并仅返回包含匹配词的文件以及匹配项(以及在其中找到的行号) -n的标志):

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