使用 grep 查找结果并写入文件

Find results with grep and write to file

我想从我计算机上的一个文件中获取 grepegrep 的所有结果。

刚发现找字符串的正则表达式

'+33. ... ... ..' 由以下正则表达式

\+33.[0-9].[0-9].[0-9].[0-9].' 或者这不正确?

我的grep命令是:

grep '\+31.[0-9].[0.9].[0.9].[0-9]' Samsung\ GT-i9400\ Galaxy\ S\ II.xry  >> resultaten.txt

输出文件只给我如下信息:

"Binary file Samsung GT-i9400 .xry matches"

..... 没有给出结果。

有人可以帮我获取结果并写入文件吗?

这意味着您找到了一个匹配项,但您正在 greping 的文件不是文本文件,它是包含不可打印字节的二进制文件。如果你真的想 grep 该文件,请尝试:

strings Samsung\ GT-i9400\ Galaxy\ S\ II.xry | grep '+31.[0-9].[0.9].[0.9].[0-9]' >> resultaten.txt

首先,grep 的默认行为是打印包含匹配项的 。因为二进制文件不包含行,所以它只会在二进制文件中找到匹配项时打印一条消息。但是,这可以用 -a 标志覆盖。

但是,你最终会遇到这样的问题,即它打印的 "lines" 没有用。您可能想添加 -o 选项以仅打印实际匹配的子字符串。

最后,您的正则表达式根本不正确。单独的点 . 是一个元字符,它匹配任何字符,包括控制字符或其他非文本字符。鉴于您的正则表达式的长度,您不太可能捕获误报,但您可能想要解释您希望点匹配的内容。我用 [ ._-] 替换了它,它匹配 space 和一些在 phone 数字中常见的标点符号。可能会扩展或更改它,具体取决于您在 phone 号码中期望的标点符号。

在常规 grep 中,加号仅匹配自身。使用 grep -E 语法会发生变化,您需要反斜杠加号;但是在没有这个选项的情况下,反斜杠是多余的(在某些方言中实际上是错误的,包括 GNU grep,其中反斜杠加号选择扩展含义,这当然是开头的语法错误string,其中没有前面的表达式重复一次或多次;但是 GNU grep 只会默默地忽略它,而不是报告错误)。

另一方面,你的号码组也是错误的。 [0-9] 匹配 单个 数字,显然其意图是匹配多个数字。为方便起见,我将使用 grep -E 扩展,它使 + 能够匹配前一个字符的一次或多次重复。然后我们还可以访问 ? 以将标点符号表达式标记为可选。

结束,试试这个:

grep -Eao '\+33[0-9]+([^ ._-]?[0-9]+){3}' \
   'Samsung GT-i9400 Galaxy S II.xry' >resultaten.txt

用人类的术语来说,这需要一个文字 +33 后跟所需的附加数字,然后是一个或多个数字的三个数字组,每个数字前面都可以选择标点符号。

这将覆盖通常您想要的 resultaten.txt;您的追加操作在许多情况下也很有意义,因此如果这确实是您想要的,请将其改回。

如果模板中的每个点 +33. ... ... .. 代表一个必需的数字,并且 space 代表必需的标点符号,则以下内容更接近您试图指定的内容:

\+33[0-9]([^ ._-][0-9]{3}){2}[^ ._-][0-9]{2}

也就是说,在 33 之后有一个必需的数字,然后是两组刚好三个数字和一组两个,每组前面有一个非可选的空格或标点符号。

(您的说明有 +33,而您的实际示例有 +31。使用正确的那个,或者也可能允许国家代码的任何数字序列。)