Как мне получить только цифры в grep?

58

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

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

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

grep [0-9] filename

Но это печать всего:

blah blah blah (:34)

Скорее хочу только 34. Есть ли способ сделать это?

муравьев
источник
В будущем также ознакомьтесь со справочной страницей для grep (или любой другой программы). Страница man подробно описывает параметры, необходимые для многих распространенных применений программы. напр.man grep
хнасарат
Вы можете попробовать это> grep -o '[0-9] [0-9] *' testfile

Ответы:

76

Вы можете использовать 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} требует, чтобы предыдущий символ или класс символов встречался хотя бы один раз, но не более четырех раз.

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

devav2
источник
3
Приятно. Кроме того, чтобы соответствовать более 4 или произвольному количеству цифр, используйте grep -Eo '[0-9]{1,}' testfile
FractalSpace
9

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

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123
Сергей Колодяжный
источник
5

grep -oбудет печатать только соответствующую часть строки. В противном случае grep напечатает любые строки с шаблоном.

roadmr
источник
1

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

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

Местный

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

Stef
источник
1
Зачем использовать, curlкогда простое catбудет делать?
PerlDuck
В вопросе четко не указано, что файл является локальным. этот ответ учитывает оба.
Стеф