ack / grep search y orderar por date de modificación

¿Hay alguna manera de tener ack orderar los resultados encontrados por date de modificación? (¿idealmente mostrando la date al lado del resultado?). No parece que ack tenga una opción de date, pero por las dudas.

Si esto no es posible con ack , ¿qué tal grep o usando una combinación de herramientas?

Ni ack ni grep tienen ninguna noción de las dates de modificación de un file. Para eso, primero deberá generar la list de files y luego orderarlos en function de los mismos.

Puede usar xargs para ejecutar la salida de ack o grep en otro command que proporcionará las dates de modificación. Para las dates de modificación puede usar stat para 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/networking5-1.0.1.tar.gz 

NOTA: Este método solo le mostrará los nombres de los files que coinciden con su consulta junto con la date de modificación.

Con las herramientas de 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 utiliza awk para separar el nombre de file de la salida de grep habitual y la date llamadas awk para recuperar la date de los files. grep tiene la opción -H para asegurar que se muestre un nombre de file en la salida incluso si solo aparece uno en la línea de command.

Como un ejemplo de la salida:

 $ 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 los commands awk

  • -F:

    Esto establece el separador de campo en : modo que el primer campo es el nombre del file. (Tenemos que esperar que el nombre del file en sí no contenga dos puntos).

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

    Esto ejecuta la date -r filename +"%F %R" para get la date de modificación del file en una forma adecuada para la sorting. La date se almacena en la variable d .

  • print d,$0

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