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 basename
Tool 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 1
weist an, xargs
genau ein Argument für den Basisnamen zu verwenden. Wenn also mehr Argumente empfangen werden, wird ein basename
Prozess pro Argument gestartet. Dies ist erforderlich, da basename
nur 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.log
es 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 grep
Ausgabe 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