Jak pobrać tylko liczby w grep?

57

Mam taki plik:

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

Chcę znaleźć występowanie liczb w powyższym pliku. Wymyśliłem:

grep [0-9] filename

Ale to drukuje całość:

blah blah blah (:34)

Raczej chcę tylko 34. Czy jest na to jakiś sposób?

Mrówki
źródło
W przyszłości sprawdź także stronę man dla grep (lub innego programu). Strona podręcznika opisuje opcje wymagane do wielu typowych zastosowań programu. np.man grep
hnasarat
Możesz spróbować> grep -o '[0-9] [0-9] *'

Odpowiedzi:

75

Możesz użyć, grep -Eaby uzyskać dostęp do rozszerzonej składni wyrażeń regularnych (Taki sam jak egrep )

Utworzyłem plik testowy z poniższą zawartością:

>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)

Teraz, aby zastąpić same liczby z tekstu, którego możesz użyć

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

będzie wyjście.

W tym przypadku „-o” służy tylko do wyświetlania pasującego segmentu linii, a nie do pełnej zawartości linii.

Kwadratowe nawiasy kwadratowe (np. {I}) wskazują liczbę wystąpień dopasowania. {1,4} wymaga, aby poprzedni znak lub klasa postaci wystąpiły co najmniej raz, ale nie więcej niż cztery razy.

Mam nadzieję że to pomoże

devav2
źródło
3
Miły. Ponadto, aby dopasować więcej niż 4 lub dowolną liczbę cyfr, użyj grep -Eo '[0-9]{1,}' testfile
FractalSpace
8

Można użyć wyrażenia [:digit:]nawiasowego RE określonego w sekcji 9.3.5 standardu POSIX , w połączeniu z -oflagą, aby wydrukować tylko pasujące „słowa”

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123
Sergiy Kolodyazhnyy
źródło
5

grep -owydrukuje tylko pasującą część linii. W przeciwnym razie grep wydrukuje dowolne linie ze wzorem.

roadmr
źródło
1

Chciałbym użyć curl, aby uzyskać dostęp do twojego pliku lokalnie lub zdalnie, następnie grep linie z liczbami owiniętymi (:), a następnie odciąć te kawałki i zapisać do pliku

zaakceptowana odpowiedź ignoruje liczby w poprzednich liniach pliku, działa dla przykładowych danych, ale co jeśli plik był zdalny?

Lokalny

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

W tym przykładzie output.txtw Twoim bieżącym folderze zostanie nadpisane, do którego uzyskujemy dostęp input.txtz Twojego folderu publicznego.

Zdalny

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

W tym przykładzie output.txtw bieżącym folderze będą nadpisywane, mamy dostęp input.txtod https://yoursite.com/Public/.

Stef
źródło
1
Po co używać, curlgdy proste cat?
PerlDuck
Pytanie nie określa jasno, że plik jest lokalny. ta odpowiedź pozwala na jedno i drugie.
Stef