ack/grep 搜尋並依修改日期排序

ack/grep 搜尋並依修改日期排序

有什麼辦法可以擁有ack依修改日期對找到的結果進行排序? (最好在結果旁邊顯示日期?)。它看起來沒有ack日期選項,但以防萬一。

如果使用 不可能做到這一點,那麼使用工具組合ack呢?grep

答案1

沒有ackgrep沒有任何文件修改日期的概念。為此,您需要先產生文件列表,然後根據情況對它們進行排序。

您可以使用將或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分開,並呼叫檢索檔案日期。 提供了一個選項來確保檔案名稱顯示在輸出上,即使命令列上只出現一個檔案名稱。grepawkdategrep-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

相關內容