從文件中提取從一個日期到另一個日期的條目

從文件中提取從一個日期到另一個日期的條目

有一個文件,其中第一個和第二個欄位的條目為日期和時間,方式如下:2015/10/14 00:33:37

該文件有 100,000 多行,並且不斷更新。文件中的條目需要選擇最早的星期一 00:00:00 到星期日 23:59:59。

2015/10/11 23:55:37 abc1 def1 2015/10/11 23:55:39 abc2 def2 2015/10/11 23:56:19 abc3 def3 2015/10/11 23:56:46 abc4 def4 2015/10/11 23:57:46 abc5 def5 2015/10/12 0:04:25 abc6 def6 2015/10/12 0:04:44 abc7 def7 2015/10/12 0:04:44 abc8 def8 2015/10/12 0:04:44 abc9 def9 2015/10/12 0:04:44 abc10 def10 2015/10/12 0:04:44 abc11 def11 2015/10/12 0:04:44 abc12 def12 2015/10/12 0:04:44 abc13 def13 2015/10/12 0:04:44 abc14 def14 2015/10/12 0:04:44 abc15 def15 2015/10/12 0:04:48 abc16 def16 2015/10/12 0:04:48 abc17 def17 2015/10/12 0:04:48 abc18 def18 2015/10/12 0:04:48 abc19 def19 2015/10/12 0:04:49 abc20 def20 2015/10/12 0:04:49 abc21 def21 2015/10/12 0:08:36 abc22 def22 2015/10/12 0:08:36 abc23 def23 2015/10/12 0:08:36 abc24 def24 2015/10/12 0:08:36 abc25 def25 2015/10/12 0:08:36 abc26 def26 2015/10/12 0:08:36 abc27 def27 2015/10/12 0:08:36 abc28 def28 2015/10/12 0:08:37 abc29 def29 2015/10/12 0:08:37 abc30 def30

答案1

此 shell 腳本片段建立了一個擴展正規表示式(帶有/適當轉義的字元),其中包含從上週一到下週日的所有日期的YYYY/MM/DD格式。然後它使用它來grep搜尋日誌檔案。

DAYS=$(for D in {0..6} ; do 
           date -d "last monday + $D days" +'%Y\\/%m\\/%d'
       done | xargs | 
       sed -e 's/ /|/g'
      )

REGEX="^($DAYS) "

grep -E "$REGEX" logfile.txt

如果您喜歡使用基本正規表示式,請將最後幾行變更為:

REGEX="^\($DAYS\) "
REGEX=$(printf "%s" "$REGEX" | sed -e 's/\([|]\)/\\\1/g')

grep "$REGEX" logfile.txt

另一個選擇是使用grep's -F(fixed-string) 和-f(file) 選項以及 shell 的進程替換功能<( ... ),如下所示:

DAYS=$(for D in {0..6} ; do 
           date -d "last monday + $D days" +'%Y/%m/%d'
       done )

grep -F -f <(echo "$DAYS") logfile.txt

甚至

grep -F -f <( for D in {0..6} ; do 
              date -d "last monday + $D days" +'%Y/%m/%d'
              done ) logfile.txt

注意:最後兩個版本將在該行中任何位置的該格式的日期上匹配,而不僅僅是在行的開頭。根據您提供的範例,這不太可能成為問題。

相關內容