Grep

列出儲存在具有特定時間戳的文本文件中的文件名

  • December 19, 2019

我已經將幾個文件名儲存在我的主目錄中名為new1.txt的文本文件中,現在我正在使用循環列出它們所在目錄中的所有文件。我可以編寫命令執行此操作 while read in; do ls -lrt /newusr/home/logs/"$in"; done < new1.txt

這些日誌是昨天生成的,我想要找到昨天下午 2 點之後生成的所有文件,我嘗試插入 grep 語句,但我認為我寫錯了

while read in; do ls -lrt /prdusr/rhd/prdoper/opLogDir/"$in"; done < new1.txt | grep "Dec 18 {14-23}"。語法或任何其他我可以實現的方式有什麼問題嗎?

用於grep過濾一系列接受時間的時間戳並不容易,因為正則表達式是為文本模式設計的,而不是數字比較(參見例如這個和其他類似的問題)。

在您的特定情況下,您可以修改語句,如

grep -E "Dec 18 (1[4-9]|2[0123])"

但請注意,這需要 GNUgrep和“擴展正則表達式”語法。您使用的語法會搜尋出現在輸出行中的文字字元串。 {14-23}``ls

此外,作為一般說明,強烈不建議解析 的輸出,因為如果您的文件名包含不尋常的字元或您的語言環境設置導致不同的時間戳格式等,則會有很多陷阱。您選擇的方法,例如完全依賴於ls顯示的習慣過去 1/2 年左右發生的修改時間的時間戳。它使用起來更安全,例如使用選項(可能與 一起)代替。ls``Mon DD HH:MM``find``-mtime``-daystart

首先創建一個具有正確mtime時間戳的參考時間戳文件:

touch -d 2019-12-18T14:00 timestamp

然後解析您的文件並為每個文件測試該文件是否比timestamp我們剛剛創建的文件新:

while IFS= read -r name; do
   if [[ /prdusr/rhd/prdoper/opLogDir/$name -nt timestamp ]]; then
       printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
   fi
done <new1.txt

這使用-nt文件 test inbash來檢查修改時間戳(請注意,bash不會以亞秒精度執行此測試)。

使用 POSIX 工具:

touch -d 2019-12-18T14:00 timestamp

while IFS= read -r name; do
   if [ -n "$( find "/prdusr/rhd/prdoper/opLogDir/$name" -newer timestamp )" ]
   then
       printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
   fi
done <new1.txt

這將使用find代替進行測試,如果手頭的文件在文件之後被修改,它將輸出找到的路徑timestamp,並且 shell 會將輸出檢測為非空字元串並呼叫printf.

引用自:https://unix.stackexchange.com/questions/558024