Как я выбираю только числа в grep?

У меня есть файл как это:

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

Я хочу найти возникновение чисел в вышеупомянутом файле. Я придумал:

grep [0-9] filename

Но это печатает целое:

blah blah blah (:34)

Скорее я хочу только 34. Там какой-либо путь состоит в том, чтобы сделать так?

59
задан 6 July 2017 в 18:06

5 ответов

Можно использовать grep -E получить доступ к синтаксису расширенного регулярного выражения (То же как egrep)

Я создал testfile с ниже содержания:

>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 одни только числа из текста можно использовать

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

будет произведен.

Здесь "-o" используется, чтобы только произвести сегмент соответствия строки, а не полное содержание строки.

Волнистые скобки (например, {и}) указывают на количество экземпляров соответствия. {1,4} требует, чтобы предыдущий класс символов или класс символов произошли, по крайней мере, однажды, но не больше, чем четыре раза.

Надеюсь, это поможет

77
ответ дан 22 November 2019 в 23:39

Можно использовать выражение [:digit:] скобки РЕ, указанное разделом 9.3.5 из стандарт POSIX , в сочетании с -o флаг для печати только распознающих "слов"

$ grep -o '[[:digit:]]*' <<< No number in this line\nbut 123 here'                                                     
123
11
ответ дан 22 November 2019 в 23:39

grep -o распечатает только часть соответствия строки. Иначе grep распечатает любые строки с шаблоном.

5
ответ дан 22 November 2019 в 23:39

Я использовал бы завихрение для доступа к файлу локально или удаленно, затем я буду grep строки с числами, перенесенными в (:) затем отключите те части и запишите в файл

принятый ответ игнорирует могли быть числа в предыдущих строках файла, он действительно работает на данные в качестве примера, но что, если файл был удаленным?

Локальный

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

В этом примере output.txt в Вашей текущей папке будет переписан, мы получаем доступ input.txt от Вашей папки Public.

Удаленный

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/.

1
ответ дан 22 November 2019 в 23:39

Вы также можете использовать регулярные выражения в стиле Perl

grep -Po "\\d+" filename

-P Интерпретировать ШАБЛОНЫ как Perl-совместимые регулярные выражения (PCRE).

-o Печатать только совпадающие (непустые) части совпадающей строки, причем каждая такая часть находится в отдельной строке вывода.

8
ответ дан 2 November 2020 в 08:13

Другие вопросы по тегам:

Похожие вопросы: