Estoy intentando obtener el resultado de los archivos de hoy que contienen "ERROR"
.
Utilizo esto para encontrar los archivos que quiero:
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" +
Salida actual (si se encuentra ERROR):
/home/user/logfilesError/gandalf_123.log
Pero el resultado que quiero es sólo el nombre del archivo de registro:
gandalf_123.log
Información: El camino cambia a menudo por lo que no puedo simplemente cortar las letras antes.
¡Gracias por tu ayuda!
Respuesta1
La basename
herramienta puede eliminar la ruta antes del nombre del archivo.
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 basename
le dará el resultado deseado.
-n 1
indica xargs
que se use exactamente un argumento para el nombre base. Entonces, si recibe más, generará un basename
proceso por argumento. Esto es necesario ya que basename
solo toma un nombre de archivo como argumento.
Este comando NO funcionará si los nombres de sus archivos contienen espacios. En este caso, como sugiere @HaukeLaging, utilice:
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -n 1 -d \\n basename
Sin embargo, esto no funcionará si los nombres de sus archivos contienen nuevas líneas.
Respuesta2
Si ./gandalf_123.log
está bien para usted, entonces puede usar
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gandalf_*"\
-daystart -mtime -1 -execdir grep -rl "ERROR" "{}" +
De lo contrario, canalizaría la grep
salida, por ejemplo, sed
para eliminar la parte no deseada:
> echo /home/user/logfilesError/gandalf_123.log |
sed 's+.*/++'
gandalf_123.log
Respuesta3
Puedes usar sed
:
... | sed -e 's=.*/=='
Lo que le dice que reemplace cualquier cosa hasta a /
con nada.
También puedes usar cut
, pero no se puede contar desde la derecha, por lo que debes combinarlo con rev
:
... | rev | cut -d/ -f1 | rev
Respuesta4
esto se puede hacer con
echo ${str##*/}
que recortará la cadena de izquierda a derecha hasta el último '/'
> str=/home/user/logfilesError/gandalf_123.log
> echo ${str##*/}
gandalf_123.log