如何在 grep 中仅获取数字?

如何在 grep 中仅获取数字?

我有这样的文件:

 other lines . . .    
 blah blah blah (:34)

我希望找到上述文件中数字的出现情况。我想到了:

grep [0-9] filename

但这是打印全部:

blah blah blah (:34)

我只想要34。有什么办法吗?

答案1

您可以使用grep -E访问扩展的正则表达式语法(与egrep

我创建了一个包含以下内容的测试文件:

>cat testfile
this is some text
with some random lines

again some text
ok now going for numbers (:32)
ok now going for numbers (:12)
ok now going for numbers (:132)
ok now going for numbers (:1324)

现在要从文本中单独获取数字,你可以使用

>grep -Eo '[0-9]{1,4}' testfile
32
12
132
1324

将被输出。

这里“-o”用于仅输出行的匹配部分,而不是该行的全部内容。

花括号(例如 { 和 })表示匹配的实例数。{1,4} 要求前一个字符或字符类必须出现至少一次,但不能超过四次。

希望这可以帮助

答案2

[:digit:]您可以使用9.3.5 节指定的RE 括号表达式POSIX 标准,与-o标志结合仅打印匹配的“单词”

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123

答案3

您也可以使用 Perl 风格的正则表达式

grep -Po "\\d+" filename

-P将 PATTERNS 解释为 Perl 兼容正则表达式 (PCRE)。

-o仅打印匹配行中匹配的(非空)部分,每个部分位于单独的输出行上。

答案4

我将使用 curl 在本地或远程访问您的文件,然后我将使用 grep 来查找用 (:) 括起来的数字的行,然后剪切这些部分并写入文件

接受的答案忽略了文件前几行中可能存在的数字,它对于示例数据确实有效,但如果文件是远程的呢?

当地的

curl file:///home/$USER/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

在此示例中output.txt,您的当前文件夹将被覆盖,我们input.txt从您的公共文件夹访问。

偏僻的

curl https://yoursite.com/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

在此示例中output.txt,您的当前文件夹将被覆盖,我们input.txt从中访问https://yoursite.com/Public/

相关内容