So geben Sie einen Teil oder eine Zahl aus einem Mataching in grep oder ack aus

873
Billy Chan

Ich habe eine Textdatei demo.txtwie unten.

This is a line with id (9) This (8) is another line with id (10) This is a line with id too 11 This line does nothing 

Die Datei hat einige Zeilen, deren ID zufällig verstreut ist. Das ID-Muster ist eine Zahl mit Klammern.

Meine Aufgabe ist es, die größte ID in dieser Datei zu finden, damit ich weiß, wie die nächste ID aussieht, wenn eine neue Zeile hinzugefügt wird.

Meine bisherige Arbeit

ack-grep demo.txt -o --match '\(\d+\)' | sort -r | head -n 1 

Das Ergebnis entspricht (9)aber nicht (10)meiner Erwartung. Ich denke, der Grund ist, dass sortdie Ausgabe als Text betrachtet wird, weil sie Klammern hat.

Die Frage ist: Wie kann ich nur die Nummer aus ackoder grepfür die spätere Sortierung ausgeben, aber noch mit dem Muster übereinstimmen (Klammer in meinem Beispiel)?

Danke vielmals!

2
Hmm, kein 'ack' auf meinem System zum Testen. Ist es dieses Programm? http://betterthangrep.com/install/ Hennes vor 11 Jahren 0
@Hennes, ja, es ist dieses Programm. Und in Ubuntu ist der Name "act-grep". Es gibt ein Paket `apt-get install ack-grep`. Ich selbst fand "act" stabiler als "grep". Billy Chan vor 11 Jahren 0
@BillyChan: Du meinst "ack-grep" und "ack", nicht "act-grep" und "act". Und wie heißt das, dass ack stabiler ist als grep? Ich bin der Autor von ack und würde diese Behauptung sicherlich nicht machen. Andy Lester vor 11 Jahren 0
@AndyLester, danke für deine nette Arbeit an `ack`. Ich habe vorher "grep" verwendet, aber manchmal bin ich auf seltsame Fehler gestoßen, dann habe ich auf "ack" gewechselt und solche Fehler sind verschwunden. Ich fügte eine solche Behauptung in meinen Notizen hinzu, konnte mich aber wirklich nicht an die Fehlerfälle erinnern. Billy Chan vor 11 Jahren 0
ack und grep verhalten sich anders. Zum einen wird ack nicht in Binärdateien suchen, es sei denn, Sie werden ausdrücklich dazu aufgefordert. Die Fehler, die Sie erhalten haben, waren Warnungen über das Durchsuchen binärer Daten. Andy Lester vor 11 Jahren 0

1 Antwort auf die Frage

4
slhck

grep kann nicht zur Ausgabe von Teilen eines Matches verwendet werden, aber warum werden die Klammern nicht entfernt?

Das funktioniert für GNU grep:

grep -P '\(\d+\)' -o demo.txt | sed 's/[()]//g' | sort -nr | head -n1 

Folgendes funktioniert auch für BSD grep, das Sie beispielsweise unter OS X verwenden können:

grep -E '\([[:digit:]]+\)' -o demo.txt | …  grep -E '\([0-9]+\)' -o demo.txt | … 

Um das gewünschte Ergebnis zu erhalten, fügen wir das -nArgument hinzu sort, um numerisch zu sortieren 10. Dies gibt Ihnen das erste Ergebnis.

Der Vollständigkeit halber (obwohl ich standardmäßig installierte Pakete den extra installierten Perl-Skripts vorziehen möchte): `./ack-grep demo.txt -o --match '\ (\ d + \)' | sed 's / [()] // g' | sort -nr | head -n 1` (unter Verwendung von slhks Sorte und sed). Hennes vor 11 Jahren 1
Ja, ich dachte mir, ich würde die Standardeinstellung "grep" verwenden, da nicht jeder über "ack-grep" verfügt, aber der erste Befehl kann natürlich leicht ersetzt werden. slhck vor 11 Jahren 0
slhck, die Antwort funktioniert perfekt. Der sed-Befehl ist so schlau. Danke vielmals! @Hennes, danke auch! Billy Chan vor 11 Jahren 0