So schneiden Sie alles bis zu einem bestimmten Wort / nach einem Fund in einem Skript aus

So schneiden Sie alles bis zu einem bestimmten Wort / nach einem Fund in einem Skript aus

Ich versuche, die Ausgabe der Dateien von heute zu erhalten, die enthalten "ERROR".

Ich verwende dies, um die gewünschten Dateien zu finden:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
   -daystart -mtime -1 -exec grep -rl "ERROR" "{}" +

Aktuelle Ausgabe (wenn ein FEHLER gefunden wurde):

/home/user/logfilesError/gandalf_123.log

Die gewünschte Ausgabe ist jedoch nur der Name der Protokolldatei:

gandalf_123.log

Info: Der Pfad ändert sich oft, daher kann ich die Buchstaben nicht einfach vorher ausschneiden.

Vielen Dank für Ihre Hilfe!

Antwort1

Das basenameTool kann den Pfad vor dem Dateinamen entfernen.

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 basename

gibt Ihnen das gewünschte Ergebnis.

-n 1weist an, xargsgenau ein Argument für den Basisnamen zu verwenden. Wenn also mehr Argumente empfangen werden, wird ein basenameProzess pro Argument gestartet. Dies ist erforderlich, da basenamenur ein Dateiname als Argument verwendet wird.

Dieser Befehl funktioniert NICHT, wenn Ihre Dateinamen Leerzeichen enthalten. Verwenden Sie in diesem Fall, wie von @HaukeLaging vorgeschlagen, Folgendes:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 -d \\n basename

Dies funktioniert jedoch nicht, wenn Ihre Dateinamen Zeilenumbrüche enthalten.

Antwort2

Wenn ./gandalf_123.loges für Sie in Ordnung ist, können Sie verwenden

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
  -daystart -mtime -1 -execdir grep -rl "ERROR" "{}" +

Andernfalls würde ich die grepAusgabe zB weiterleiten sed, um den unerwünschten Teil zu löschen:

> echo /home/user/logfilesError/gandalf_123.log |
  sed 's+.*/++'
gandalf_123.log

Antwort3

Sie können Folgendes verwenden sed:

... | sed -e 's=.*/=='

Dadurch wird alles bis zu a /durch nichts ersetzt.

Sie können auch verwenden cut, aber es kann nicht von rechts zählen, also müssen Sie es mit kombinieren rev:

... | rev | cut -d/ -f1 | rev

Antwort4

Dies kann mit

 echo ${str##*/}

Dadurch wird die Zeichenfolge von links nach rechts bis zum letzten '/' gekürzt.

> str=/home/user/logfilesError/gandalf_123.log
> echo ${str##*/}
gandalf_123.log

verwandte Informationen