ack/grep 検索と変更日による並べ替え

ack/grep 検索と変更日による並べ替え

何か方法はありますか?ack見つかった結果を変更日で並べ替えますか? (理想的には結果の横に日付を表​​示しますか?)。日付オプションはないようですackが、念のため。

でこれが不可能な場合はackgrepツールを組み合わせて使用​​するのはいかがでしょうか?

答え1

ackも にも、grepファイルの変更日に関する概念はありません。そのためには、まずファイルのリストを生成し、その後でそれらを並べ替える必要があります。

またはxargsの出力を別のコマンドに実行して、変更日を取得することができます。変更日を取得するには、 を使用します。ackgrepstat

$ 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

注記:この方法では、クエリに一致したファイルの名前と変更日のみが表示されます。

答え2

GNU ツールを使用する場合:

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

または、

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

これは、awk通常の出力からファイル名を分離しgrep、ファイルの日付を取得するための awk呼び出しに使用されます。コマンド ラインにファイル名が 1 つしか表示されていない場合でも、出力にファイル名が表示されるようにするオプションが与えられます。dategrep-H

出力の例:

$ 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

awkコマンドの説明

  • -F:

    :これにより、最初のフィールドがファイル名になるようにフィールド区切り文字が設定されます。(ファイル名自体にコロンが含まれていないことを期待する必要があります。)

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

    これは、date -r filename +"%F %R"ソートに適した形式でファイルの変更日付を取得するために実行されます。日付は変数に格納されますd

  • print d,$0

    これは、データに続いて からの出力行を出力しますgrep

関連情報