使用 grep 查找结果并写入文件
Find results with grep and write to file
我想从我计算机上的一个文件中获取 grep
或 egrep
的所有结果。
刚发现找字符串的正则表达式
'+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"
..... 没有给出结果。
有人可以帮我获取结果并写入文件吗?
这意味着您找到了一个匹配项,但您正在 grep
ing 的文件不是文本文件,它是包含不可打印字节的二进制文件。如果你真的想 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
。使用正确的那个,或者也可能允许国家代码的任何数字序列。)
我想从我计算机上的一个文件中获取 grep
或 egrep
的所有结果。
刚发现找字符串的正则表达式
'+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"
..... 没有给出结果。
有人可以帮我获取结果并写入文件吗?
这意味着您找到了一个匹配项,但您正在 grep
ing 的文件不是文本文件,它是包含不可打印字节的二进制文件。如果你真的想 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
。使用正确的那个,或者也可能允许国家代码的任何数字序列。)