it-swarm.com.de

Wie rufe ich nur Zahlen in grep ab?

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)

Vielmehr möchte ich nur 34. Gibt es eine Möglichkeit dazu?

55
Ant's

Sie können grep -E verwenden, um 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 verzerrten 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

72
devav2

Sie können den in Abschnitt 9.3.5 von POSIX-Standard angegebenen RE-Klammerausdruck [:digit:] in Kombination mit dem Flag -o verwenden, um nur übereinstimmende "Wörter" zu drucken.

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

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

5
roadmr

Ich würde curl verwenden, um lokal oder per Fernzugriff auf Ihre Datei zuzugreifen. Dann würde ich Zeilen mit eingewickelten Zahlen (:) abschneiden und in die 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.txt in Ihrem aktuellen Ordner überschrieben. Wir greifen auf input.txt in Ihrem öffentlichen Ordner zu.

Remote

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

In diesem Beispiel wird output.txt in Ihrem aktuellen Ordner überschrieben. Wir greifen über input.txt auf https://yoursite.com/Public/ zu.

0
Stef