Si uno fuera a ejecutar el siguiente comando
cat * | grep DATABASE
el shell escupiría todas las líneas en los archivos * que contenían la palabra DATABASE
en ellos. ¿Hay alguna manera de escupir también de qué archivo está separada cada línea?
Traté de usar la -H
opción para grep que según man
dice print the filename for each match
pero en mi shell solo dice
(standard input):$DATABASE_FUNCTION = dothis();
Respuestas:
No uses gato para eso. En su lugar, use
grep DATABASE *
ogrep -n DATABASE *
(si desea conocer los números de línea y los nombres de archivo) directamente.Ver uso inútil del gato .
Para aclarar un poco más: en
cat *
realidad concatena todos los archivos a medida que los alimenta para grep a través de la tubería, por lo que grep no tiene forma de saber qué contenido pertenece a qué archivo, y de hecho ni siquiera puede saber si está escaneando archivos o si solo escribiendo poderosamente rápido. Es todo un gran flujo de entrada estándar una vez que usa una tubería.Por último,
-H
es redundante casi con seguridad, ya que grep imprime el nombre de archivo por defecto cuando tiene más de un archivo para buscar. Sin embargo, podría ser útil en caso de que desee analizar la salida, ya que existe la posibilidad de que el*
globo se expanda a un solo archivo y grep en ese caso omita el nombre de archivo.fuente
Uso
grep -H DATABASE *
(nota: si hay más de un archivo en el directorio, el-H
es opcional).El problema que tiene es que con su comando,
cat *
concatena todos los archivos en un gran desorden y luego los|
envía a la entrada estándar degrep DATABASE
. Para cuando grep ve los datos, la información sobre su procedencia se habrá perdido. La solución es hacer que grep haga el trabajo de mirar a través de los archivos individuales, para que cuando encuentre una coincidencia sepa de qué archivo proviene.fuente