Ich habe derzeit eine Protokolldatei und muss die Informationen filtern, um mit dem Befehl "grep" das längste Wort zu erhalten, das in mehreren Zeichen endet.

Zum Beispiel muss ich die Wörter finden, die mit "abc" enden.

Und ich habe die folgende Datei:

XXXXXabc
YYabc
ZZZdef
XXabc

Die richtige Ausgabe sollte sein:

XXXXXabc

Bis jetzt hatte ich Folgendes versucht:

grep -E '\abc' log.txt | wc -L

Dies gibt jedoch die maximale Länge zurück, ohne das Wort anzuzeigen. Wie kann ich das Wort auf dem Bildschirm drucken lassen?

Vielen Dank!

0
FJ Garrido 19 Jän. 2019 im 13:14

4 Antworten

Beste Antwort
grep -E \abc log.txt | awk '{print length($1) " " $1}' | sort -n |  tail -1 | awk '{print $2}'

Die Idee: Finde die Länge, sortiere als Zahl und drucke dann von der letzten Zeile nur das 2. Element.

1
Marcel Preda 19 Jän. 2019 im 13:00

Mit einem einzigen awk-Befehl können Sie es erhalten:

awk 'BEGIN {global_max = 0} /abc$/ {cur_max=length($0); if (cur_max > global_max) {global_max=cur_max; word=$0}} END {print word}' log.txt

Verwenden Sie eine Variable global_max, die das am längsten gesehene Wort verfolgt (im Block BEGIN auf Null initialisieren).

Ermitteln Sie dann für jede Zeile, die mit "abc" endet, die Länge und vergleichen Sie sie mit der maximalen globalen Länge. Wenn dies größer ist, ersetzen Sie die neuen durch die alten Werte.

Drucken Sie abschließend das gefundene Wort.

0
Poshi 19 Jän. 2019 im 10:37

Die Verwendung von sort wird langsamer ausgeführt (Komplexität O(n log n)). Sie sollten jedes Element nur einmal wie folgt besuchen (Komplexität O(n):

maxSize=0; maxWord=""; while read -r LINE; do if [[ ${#LINE} -gt $maxSize ]]; then maxSize=${#LINE}; maxWord="${LINE}"; fi; done < input.txt; echo "$maxWord"
0
Robert Seaman 19 Jän. 2019 im 10:42

Grep kann das nicht alleine machen, aber mit awk:

awk '/abc$/{m=length($0)>length(m)?$0:m}END{print m}' infile
0
ctac_ 19 Jän. 2019 im 19:52