ack/grep buscar y ordenar por fecha de modificación

ack/grep buscar y ordenar por fecha de modificación

¿Hay alguna manera de tenerack¿Ordenar los resultados encontrados por fecha de modificación? (¿Lo ideal sería mostrar la fecha al lado del resultado?). No parece que acktenga opción de fecha, pero por si acaso.

Si esto no es posible con ack, ¿qué tal grepsi utilizamos una combinación de herramientas?

Respuesta1

Ninguno ackde los dos greptiene noción de las fechas de modificación de un archivo. Para eso, primero deberá generar la lista de archivos y luego ordenarlos según posteriormente.

Puede utilizar xargspara ejecutar la salida de cualquiera de los dos comandos acko grepde otro que proporcionará las fechas de modificación. Para las fechas de modificación puede utilizar statpara hacer eso.

Ejemplo

$ grep -Rl awk * | xargs -n 1 stat --printf "%y ------ %n\n"
2013-11-12 10:06:16.000000000 -0500 ------ 100855/tst_ccmds.bash
2013-11-13 00:32:11.000000000 -0500 ------ 100911/cmd.bash
2013-11-23 03:16:17.000000000 -0500 ------ 102298/cmd.bash
2013-12-14 20:06:04.467708173 -0500 ------ 105159/cmd.txt
2013-12-16 03:20:48.166016538 -0500 ------ 105328/cmds.txt
2013-01-14 14:17:39.000000000 -0500 ------ 106932/red5-1.0.1.tar.gz

NOTA:Este método solo le mostrará los nombres de los archivos que coincidieron con su consulta junto con la fecha de modificación.

Respuesta2

Con herramientas GNU:

grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n

O,

ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n

Esto se utiliza awkpara separar el nombre del archivo de la grepsalida habitual y awkllama datepara recuperar la fecha del archivo. greptiene la -Hopción de garantizar que se muestre un nombre de archivo en la salida incluso si solo aparece uno en la línea de comando.

Como ejemplo del resultado:

$ grep setupcon /etc/init.d/* | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
2011-12-05 12:05 /etc/init.d/keymap.sh:# If setupcon is present, then we've been superseded by console-setup.
2011-12-05 12:05 /etc/init.d/keymap.sh:if type setupcon >/dev/null 2>&1; then
2011-12-08 18:00 /etc/init.d/console-setup:     if setupcon --save; then
2011-12-08 18:00 /etc/init.d/console-setup:test -f /bin/setupcon || exit 0
2012-04-28 02:41 /etc/init.d/kbd:if which setupcon >/dev/null
2012-09-30 18:02 /etc/init.d/keyboard-setup:    if setupcon -k 2>/dev/null; then
2012-09-30 18:02 /etc/init.d/keyboard-setup:test -f /bin/setupcon || exit 0

Explicación de awkcomandos.

  • -F:

    Esto establece el separador de campos para :que el primer campo sea el nombre del archivo. (Tenemos que esperar que el nombre del archivo en sí no contenga dos puntos).

  • "date -r \""$1"\" +\"%F %R\"" | getline d

    Esto se ejecuta date -r filename +"%F %R"para obtener la fecha de modificación del archivo en un formato adecuado para su clasificación. La fecha se almacena en la variable d.

  • print d,$0

    Esto imprime los datos seguidos de la línea de salida de grep.

información relacionada