Grep

比較使用者給定時間的日誌文件時間

  • February 12, 2014

立即為糟糕的問題和標題道歉……這些天學習 unix 及其命令,我試圖找出以下場景的解決方案:

可以說我有一個日誌文件,如下所示:

01-02-1988     12:00:00    I start 
01-02-1988     12:00:01    I start
01-02-1988     12:00:02    I start 
01-02-1988     12:00:03    I start
01-02-1988     12:00:04    I start 
01-02-1988     12:00:05    I start
01-02-1988     12:00:06    I start 
01-02-1988     12:00:07    I start
01-02-1988     12:00:08    I start 
01-02-1988     12:00:09    I start
01-02-1988     01:00:10    I start

我從他想要查看狀態的使用者那裡獲取一個時間範圍。要過濾掉所有過程,我可以這樣做:

egrep $usr_time log.txt

但是有什麼辦法我可以在特定的時間段內做同樣的事情,比如awk,可以匹配我在$2這裡的值……但是如何比較它的秒數(ss in hh:mm:ss)???

例如:假設我想要來自的記錄12:00:01 - 12:00:06,所以基本上我需要的是從:分隔符中提取第三個值並進行比較……如何實現……請幫助!!!!

如果您可以確定條目是按時間順序排列的,那麼您可以使用這兩個時間(如果兩者都存在於文件中!)作為開始和停止地址:

start cmd:> sed -n -e /12:00:03/,/12:00:09/p file
01-02-1988     12:00:03    I start
01-02-1988     12:00:04    I start 
01-02-1988     12:00:05    I start
01-02-1988     12:00:06    I start 
01-02-1988     12:00:07    I start
01-02-1988     12:00:08    I start 
01-02-1988     12:00:09    I start

如果文件中可能沒有出現開始時間和停止時間,那麼您必須進行比較(可能需要在此計算中包括日期)

awk -v starttime="12:00:03" -v stoptime="12:00:09" \
 'BEGIN {FS=":"; $0=starttime; startts=$1*3600+$2*60+$3; '\
 '$0=stoptime; stopts=$1*3600+$2*60+$3; FS=" ";}; ' \
 '{line=$0; FS=":"; $0=$2; secs=$1*3600+$2*60+$3; if (secs>stopts) exit; '\
 'if (secs>=startts) print line; FS=" ";}' file

字元串甚至可以直接比較:

awk -v starttime="12:00:03" -v stoptime="12:00:09" \
 '{line=$0; if ($2>stoptime) exit; '\
 'if ($2>=starttime) print line; FS=" ";}' file

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