ack / grep procura e ordena por data de modificação

7

Existe alguma maneira de ack classificar os resultados encontrados por data de modificação? (idealmente mostrando a data ao lado do resultado?). Não parece que ack tenha uma opção de data, mas apenas no caso.

Se isso não for possível com ack , e quanto a grep ou usando uma combinação de ferramentas?

    
por Josh 11.10.2014 / 02:49

2 respostas

6

Nem ack nem grep têm qualquer noção de datas de modificação de um arquivo. Para isso, você precisará gerar a lista de arquivos primeiro e depois classificá-los depois.

Você pode usar xargs para executar a saída de ack ou grep em outro comando que fornecerá as datas de modificação. Para as datas de modificação, você pode usar stat para fazer isso.

Exemplo

$ 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

OBSERVAÇÃO: Esse método mostrará apenas os nomes dos arquivos que corresponderam à sua consulta, juntamente com a data de modificação.

    
por 11.10.2014 / 03:37
3

Com ferramentas GNU:

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

Ou

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

Isso usa awk para separar o nome do arquivo do usual grep output e awk calls date para recuperar a data dos arquivos. grep recebe a opção -H para assegurar que um nome de arquivo seja mostrado na saída, mesmo que apenas um apareça na linha de comando.

Como exemplo da saída:

$ 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

Explicação dos comandos awk

  • -F:

    Isso define o separador de campo como : para que o primeiro campo seja o nome do arquivo. (Temos que esperar que o próprio nome do arquivo não contenha dois pontos).

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

    Isso executa date -r filename +"%F %R" para obter a data de modificação do arquivo em um formato adequado para classificação. A data é armazenada na variável d .

  • print d,$0

    Isto imprime os dados seguidos pela linha de saída de grep .

por 11.10.2014 / 03:37

Tags