Wie rufe ich nur Zahlen in grep ab?


57

Ich habe folgende Datei:

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

Ich möchte das Vorkommen von Zahlen in der obigen Datei finden. Ich hatte die Idee dass:

grep [0-9] filename

Aber das druckt das Ganze:

blah blah blah (:34)

Eher will ich nur 34. Gibt es eine Möglichkeit dazu?


In Zukunft sollten Sie auch die Manpage für grep (oder ein anderes Programm) lesen. Auf der Manpage sind die Optionen aufgeführt, die für viele häufige Verwendungszwecke des Programms erforderlich sind. egman grep
hnasarat

Sie können dies versuchen> grep -o '[0-9] [0-9] *' testfile

Antworten:


75

Sie können verwenden, grep -Eum auf die erweiterte Syntax für reguläre Ausdrücke zuzugreifen (wie egrep ).

Ich habe eine Testdatei mit folgendem Inhalt erstellt:

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

Nun können Sie die Zahlen allein aus dem Text herauslesen

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

wird ausgegeben.

Hier wird "-o" verwendet, um nur das übereinstimmende Segment der Zeile und nicht den vollständigen Inhalt der Zeile auszugeben.

Die eckigen Klammern (z. B. {und}) geben die Anzahl der Übereinstimmungen an. {1,4} erfordert, dass das vorherige Zeichen oder die Zeichenklasse mindestens einmal, jedoch nicht mehr als viermal vorkommt.

Hoffe das hilft


3
Nett. Verwenden Siegrep -Eo '[0-9]{1,}' testfile
FractalSpace

8

Sie können den in [:digit:]Abschnitt 9.3.5 des POSIX-Standards angegebenen Ausdruck für RE-Klammern in Kombination mit dem -oFlag verwenden, um nur übereinstimmende "Wörter" zu drucken.

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

5

grep -odruckt nur den passenden Teil der Zeile. Andernfalls druckt grep alle Zeilen mit dem Muster.


1

Ich würde curl verwenden, um lokal oder per Fernzugriff auf Ihre Datei zuzugreifen, dann würde ich Zeilen mit eingewickelten Zahlen (:) durchgehen, diese Teile abschneiden und in eine Datei schreiben

Wenn die akzeptierte Antwort ignoriert wird, dass in den vorherigen Zeilen der Datei möglicherweise Zahlen stehen, funktioniert dies für die Beispieldaten, aber was ist, wenn die Datei remote ist?

Lokal

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

In diesem Beispiel wird output.txtIhr aktueller Ordner überschrieben, auf den wir input.txtvon Ihrem öffentlichen Ordner aus zugreifen .

Fernbedienung

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

In diesem Beispiel output.txtin der aktuellen Ordner überschrieben werden, zugreifen wir input.txtaus https://yoursite.com/Public/.


1
Warum verwenden, curlwenn ein einfaches cattun würde?
PerlDuck

Die Frage besagt nicht eindeutig, dass die Datei lokal ist. Diese Antwort erlaubt beides.
Stef
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.