我在搜索日誌文件以查看它是否包含兩個不同時間之間的某個字符串。即如果在以2016-11-10 06:45:00
和2016-11-10 10:45:00
的時間戳開始的行之間存在foo
,則threshold
變量設置之間的時間,例如240將是4小時。使用Awk和Grep查找日誌文件中兩次之間的行
current="$(date "+%Y-%m-%d %H:%M:%S")"
threshold=240
dt_format="+%Y-%m-%d %H:%M:%S"
from="$(date -d "$threshold minutes ago" "$dt_format")"
if awk '$0 >= "$from" && $0 <= "$current"' /path/file.log | grep "foo"
then
exit 0
else
exit 1
fi
但是我不知道爲什麼,但是當我在if
聲明傳遞命令行$from
和$current
,它實際上沒有閱讀它。這是因爲如果我路過垃圾所以它不是比較日期權,將返回所有的行並退出0
但如果我手動放在日期在if
聲明,即2016-11-10 06:45:00
爲from
和2016-11-10 10:45:00
爲current
然後它返回這兩個日期之間的正確行,然後我可以使用grep來檢查這些行是否包含foo
。
我真的不明白爲什麼我的代碼不能正常工作,而且由於我需要通過更改threshold
變量來根據需要在兩個不同時間之間檢查日期,因此無法手動輸入日期。
2016-11-10 06:45:00
是如何在我的日誌中格式化時間戳,從每行的開始處開始。
感謝。
這可能有助於:[Schwartzian變換](https://en.wikipedia.org/wiki/Schwartzian_transform) – Cyrus
你不需要'if ...;然後退出0;其他出口1; fi'構造:如果你不這麼做,你的腳本將以grep的退出狀態退出。 –