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

Performance 仅在特定时间生成grep文件,performance,shell,time,scripting,grep,Performance,Shell,Time,Scripting,Grep,我正试图在一个文件夹下的一个文件集grep一些模式,如下所示 在输出上,我必须执行剩余的操作。 由于以server02.log开头的文件数量接近30到40个,因此输出main.log的行数非常大,几乎有50k行。基于此输出的脚本需要很长时间才能完成。 有没有一种方法可以让我只使用以server02.log开头的文件名。并在时间之间生成 20:00:00和21:00:00 ls -lrth server02.log.* -rw-r--r-- 1 user user 1.9M Apr 15 20:

我正试图在一个文件夹下的一个文件集grep一些模式,如下所示 在输出上,我必须执行剩余的操作。 由于以server02.log开头的文件数量接近30到40个,因此输出main.log的行数非常大,几乎有50k行。基于此输出的脚本需要很长时间才能完成。 有没有一种方法可以让我只使用以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=$(日期+%Y-%m-%d)
DIR=“logs/$d/$log\u DIR”
PREFIX=“srv_02.log”
#前缀=server02.log
echo“前缀值为$prefix”
开始\u HOUR=“06”
对于“$(查找“$DIR”-name“${PREFIX}*”-printf“%TY-%Tm-%Td\n”\${START\u HOUR}:”)中的F;做
回音“$F”
#grep-E“###################更新|####取消|##############暂停|##########35
完成

您不需要从
$F
中删除日期吗?这不是规范的一部分。您可能会认为天数很重要,但在某些可行的情况下,情况并非如此。将额外的复杂性读入规范可能是问题的一个重要来源。谢谢。。我试过这个。。$F的值是如何变成null的?我不这么认为。Bash不支持
null
的概念。可能是一个空字符串,但这似乎不太可能。请在您的问题后面加上您的程序现在的样子,以及确切的输出或错误。谢谢。。我试过这个。。$F的值是如何作为空前缀值出现的:logs/2021-04-16/server02.log find:警告:Unix文件名通常不包含斜杠(尽管路径名包含斜杠)。这意味着“-name
logs/2021-04-16/server02.log.log*”可能会一直计算为false。您可能会发现'-wholename'测试更有用,或者'-samefile'更有用。或者,如果您正在使用GNU grep,您可以使用“查找…”-print0 | grep-FzZ
logs/2021-04-16/server02.log.log*“”。F值是grep::没有这样的文件或目录,它的问题是名称为seemsWith GNU
find
和coreutils
stat
您可以这样做:
find“$log\u dir”-maxdepth 1-type F-name'srv\u 02.log.*'-exec sh-c'stat-c%y{}grep-q\20:'-打印| xargs grep-E'#####…'>>main.log
-假设时间间隔为[20:00:00,21:00:00]而不是[20:00:00,21:00],如果文件名已经包含时间信息,则将其添加到全局:
…log.20*