Necesito agrupar un término en miles de archivos en S3 y enumerar esos nombres de archivo en algún archivo de salida. Soy bastante nuevo en el uso de cli, por lo que he estado probando tanto en mi local como en un pequeño subconjunto en s3.
Hasta ahora tengo esto:
aws s3 cp s3://mybucket/path/to/file.csv - | grep -iln searchterm > output.txtEl problema con esto es con el guión. Como estoy copiando a la salida estándar, el interruptor -l en grep regresa (entrada estándar) en lugar de file.csv
Mi resultado deseado es
file.csvEventualmente, tendré que iterar esto en todo el depósito, y luego en todos los depósitos, para obtener
file1.csv file2.csv file3.csvPero primero tengo que superar este obstáculo. ¡Gracias!
Debido a que imprime el archivo en STDOUT y lo canaliza a grep STDIN, grep no tiene idea de que el archivo original era file.csv . Si tienes una larga lista de archivos, yo haría:
while read -r file; do aws s3 cp s3://mybucket/path/to/${file} - | grep -q searchterm && { echo ${file} >> output.txt; }; done < files_list.txt No puedo probarlo, porque no tengo acceso a una instancia de AWS S3, pero el truco es usar grep silenciosamente ( -q ), devolverá verdadero si encuentra al menos una coincidencia, falso de lo contrario; Luego puede imprimir el nombre del archivo.
files_list.txtaws imprimirá este archivo en stdoutstdout a grep en modo silencioso ( -q ), que actúa como un comparador de patrones, devolviendo verdadero si se encuentra una coincidencia, falso en caso contrario.${file} ) a nuestro archivo de salida. while read -r file; do aws s3 cp s3://mybucket/path/to/${file} - | sed -n /searchpattern/{F;q} >> output.txt; done < files_list.txtLos pasos 1 y 2 son iguales, entonces:
stdout se redirige a sed, que buscará en el archivo línea por línea hasta que encuentre el primer stream pattern , y luego saldrá ( q ), imprimiendo el nombre del archivo ( F ) en el archivo de salida.