问题描述
文件中有一个字符串,该字符串以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