estoy usando grep para extraer líneas a través de un conjunto de archivos:grep últimos n partidos a través de archivos
grep somestring * .log
¿Es posible limitar el número máximo de partidos por archivo a la ¿La última n coincide con cada archivo?
estoy usando grep para extraer líneas a través de un conjunto de archivos:grep últimos n partidos a través de archivos
grep somestring * .log
¿Es posible limitar el número máximo de partidos por archivo a la ¿La última n coincide con cada archivo?
Bueno, creo que no es compatible con grep para limitar N coincide con el final del archivo así que esto es lo que tiene que hacer
ls *.log | while read fn; do grep -iH create "$fn" | tail -1; done
Reemplazar tail -1
-1 con N. (opciones -H es imprimir la nombre del archivo de lo contrario no se imprimirá si está grep en un solo archivo y eso es exactamente lo que estamos haciendo arriba)
NOTA: La solución anterior funcionará bien con nombres de archivos con espacios.
Para N partidos desde el inicio del archivo
grep -i -m1 create *.log
Reemplazar -m1
1 con N.
Tipo de fuera de la manga aquí, pero lea esto How to do something to every file in a directory using bash? como punto de partida. Aquí está mi opinión, asumiendo solo las últimas 20 coincidencias de cada archivo.
for i in *
do
if test -f "$i"
then
grep somestring $i | tail -n 20
fi
done
podría no ser del todo correcta, no tienen archivos en frente de mí comprobar con, pero debe ser un punto de partida.
for file in /path/to/logs/*.log
do
tail <(grep -H 'pattern' "$file")
done
Esto mostrará una lista últimos 10 partidos como tail
por listas predeterminadas últimas 10 líneas.Si desea obtener un número diferente, entonces la siguiente ayudaría -
for file in /path/to/logs/*.log
do
tail -n number <(grep -H 'pattern' "$file")
done
donde number
puede ser su número de líneas
Última ocurrencia de patrón de búsqueda en todos los archivos de registro en el directorio actual:
find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"
Primera ocurrencia de búsqueda Patte rn en cada archivo de registro en el directorio actual:
find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | head -n1"
reemplazar 1
en -n1
con número de ocurrencias desea
Alternativamente, puede utilizar find
's -exec
opción en lugar de xargs
find . -name \*log\* -exec sh -c "grep --color=always -iH pattern {} | tail -n1" \;
Puede utilizar -mtime
con find
para limitar su búsqueda de archivos de registro a, digamos 5 días
find . -mtime -5 -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"
usando 'ls' como esa puede ser una muy mala idea. Aquí está [por qué] (http://mywiki.wooledge.org/ParsingLs)? –
@Jaypal 'muy mala idea' y si los archivos de registro en el caso anterior son creados por fuentes conocidas entonces no tiene sentido sobre-diseñar la solución. Y si no lo son, entonces puedo entender la complejidad añadida. – havexz
'archivo de patrón grep | cola -1' hará – Azi