pesquisa ack/grep e classificação por data de modificação

pesquisa ack/grep e classificação por data de modificação

Existe alguma maneira de terackclassificar os resultados encontrados por data de modificação? (de preferência mostrando a data ao lado do resultado?). Não parece ackter opção de data, mas apenas por precaução.

Se isso não for possível com ack, que tal grepusar uma combinação de ferramentas?

Responder1

Nem tem noção das datas de modificação de um arquivo ack. grepPara isso, você precisará gerar primeiro a lista de arquivos e depois classificá-los com base nela.

Você pode usar xargspara executar a saída de um ackou grepoutro comando que fornecerá as datas de modificação. Para as datas de modificação, você pode usar statpara 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:Este método mostrará apenas os nomes dos arquivos que correspondem à sua consulta junto com a data de modificação.

Responder2

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 é usado awkpara separar o nome do arquivo da grepsaída normal e awkchama datepara recuperar a data do arquivo. greptem a -Hopção de garantir que um nome de arquivo seja mostrado na saída, mesmo que apenas um apareça na linha de comando.

Como exemplo de 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 awkcomandos

  • -F:

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

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

    Isso é executado 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

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

informação relacionada