grep 仅在特定时间生成的文件

问题描述

我正在尝试在如下文件夹下的文件集中搜索某种模式 我必须在输出的何处执行剩余操作。 输出 main.log 是如此之大,几乎有 50k 行,因为以 server02.log 开头的文件数量上几乎是 30 到 40。基于此输出的脚本需要永远完成。 有没有办法我只能取以 server02.log 开头的文件名。并在时间之间生成 20:00:00 和 21:00:00

ls -lrth server02.log.*
-rw-r--r-- 1 user user  1.9M Apr 15 20:20 server02.log.2020
-rw-r--r-- 1 user user  1.7M Apr 15 20:30 server02.log.2030
-rw-r--r-- 1 user user  1.6M Apr 15 20:41 server02.log.2041
-rw-r--r-- 1 user user  1.9M Apr 15 20:50 server02.log.2050
-rw-r--r-- 1 user user  2.1M Apr 15 21:00 server02.log.2100
-rw-r--r-- 1 user user  1.4M Apr 15 21:10 server02.log.2110
-rw-r--r-- 1 user user  1.9M Apr 15 21:20 server02.log.2120
-rw-r--r-- 1 user user  656K Apr 15 21:29 server02.log.2129
-rw-r--r-- 1 user user  4.6M Apr 15 21:40 server02.log.2140
-rw-r--r-- 1 user user  1.9M Apr 15 21:50 server02.log.2150
-rw-r--r-- 1 user user  1.7M Apr 15 21:59 server02.log.2159
-rw-r--r-- 1 user user  724K Apr 15 22:09 server02.log.2209
-rw-r--r-- 1 user user  1.3M Apr 15 22:20 server02.log.2220
-rw-r--r-- 1 user user  1.1M Apr 15 22:29 server02.log.2229
-rw-r--r-- 1 user user  1.7M Apr 15 22:41 server02.log.2241
-rw-r--r-- 1 user user  1.5M Apr 15 22:49 server02.log.2249
-rw-r--r-- 1 user user  2.4M Apr 15 23:01 server02.log.2301
-rw-r--r-- 1 user user  1.4M Apr 15 23:10 server02.log.2310
-rw-r--r-- 1 user user  585K Apr 15 23:19 server02.log.2319
-rw-r--r-- 1 user user  858K Apr 15 23:30 server02.log.2330
-rw-r--r-- 1 user user  892K Apr 15 23:40 server02.log.2340
-rw-r--r-- 1 user user  698K Apr 15 23:49 server02.log.2349

grep -E "###Update |###Initiate |###Re-Initiate " server02.log.* >> main.log

评论中我对代码进行了如下更改

#!/bin/bash

DIR="."
d=$(date +%Y-%m-%d);
log_dir="logs/$d"
PREFIX="$log_dir/srv_02.log"
#PREFIX="srv_02.log"
echo "prefix value is $PREFIX"

START_HOUR="06"

for F in "$( find "$DIR" -name "${PREFIX}*" -printf '%Tc %p\n' | grep "\ ${START_HOUR}:" )"; do
  echo "F value is $F"
grep -E "###Update |###Initiate |###Re-Initiate" "$F" >> main.log

done

error:

prefix value is logs/2021-04-16/srv_02.log

find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name `logs/2021-04-16/srv_02.log*'' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful,or perhaps '-samefile'.  Alternatively,if you are using GNU grep,you Could use 'find ... -print0 | grep -FzZ `logs/2021-04-16/osbpd_srv_02.log*''.
F value is
grep: : No such file or directory



解决方法

此解决方案在给定目录中查找在指定时间创建且名称与给定前缀匹配的文件。

#!/bin/bash

d=$(date +%Y-%m-%d)
DIR="logs/$d/$log_dir"
PREFIX="srv_02.log"
#PREFIX=server02.log
echo "prefix value is $PREFIX"

START_HOUR="06"
for F in "$( find "$DIR" -name "${PREFIX}*" -printf '%TY-%Tm-%Td\n' | grep "\ ${START_HOUR}:" )"; do
  echo "$F"
  # grep -E "###Update |###Initiate |###Re-Initiate Assignment Milestone|###Complete Assignment Milestone|###Cancel Assignment Milestone|###Suspend Assignment Milestone|###Resume Assignment Milestone" "$F" >> main.log
done