Cómo cortar todo hasta una palabra específica/después de una búsqueda en un script

Cómo cortar todo hasta una palabra específica/después de una búsqueda en un script

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 basenameherramienta 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 1indica xargsque se use exactamente un argumento para el nombre base. Entonces, si recibe más, generará un basenameproceso por argumento. Esto es necesario ya que basenamesolo 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.logestá 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 grepsalida, por ejemplo, sedpara 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

información relacionada