需要一种方法来检查文件内容(时间数据)是否超过 5 分钟

Need a way to check content of file (time data) is more than 5 minutes or not

我正在创建一个脚本来提取服务器上 cpu 消耗最高的作业列表。我正在采用以下格式将进程转储到平面文件中:

202009080230,4.1,218579,padaemon,02:30,00:00:01,SD_RCC_FRU:wf_rcc_ds_CRS_FactSuspendedGdc_d.s_m_rcc_ds_Staging_Dimension_FactSuspendedGdc_ipi_d

第二个数据点 (4.1) 是我的 cpu 利用率,而第六个数据点是所用时间 (00:00:01)。

我打算仅过滤掉此文件中大于 75% 且 运行 超过 00:05:00 的条目,即 5 分钟。我写了一个 if 逻辑,如下所示:

var10=`ls -lrt /projects/Informatica/INFA_ADMIN/LogFiles/myfile.txt |awk '{ print  }'`
sed -i 's/ /,/g' $var10
for i in `cat $var10`
do
var12=`echo $i |cut -d',' -f2`
var16=`echo $i |cut -d',' -f6`
if [ $var12 -ge 75.0 ] && ("$var16" > "00:05:00");
then
<logic>
fi
done

该脚本能够识别占用超过 75.0 cpu 但在第二种情况下失败的进程。

[136-ge 75.0] 00:20:26 1> 00:05:00 cpu_report_email_prateek_test.sh[63]: 00:20:26: 未找到 [没有那个文件或目录] 您能否指导如何解决此问题?

您的 && 表达式的 RHS 将扩展 $var16 并尝试执行结果,将输出重定向到文件 00:05:00。替换为 [ $x -gt $y ]。对于数字比较,您需要直接数字(没有“:”字符)。您可以将 hh:mm:ss 修改为总秒数,然后进行比较。

首先,我了解到您在第 1 行尝试获取最新文件。我宁愿创建的文件始终使用相同的名称,然后在脚本的末尾,在处理它之后,将 mv 更改为另一个名称(如 myfile.txt.20200101)。因此,您将始终知道 myfile.txt 是最新的。比执行 ls 更有效。再一次,你可以改进你的线路:(它是第一,而不是字母“l”)

var10=$(ls -1rt /projects/Informatica/INFA_ADMIN/LogFiles/myfile.txt)

根据你的第 2 行,我假设原始文件是 space 分隔的。实际上,您可能会利用它来发挥自己的优势,而不是添加逗号。此外,使用带有“cat”的 for 循环的性能低于使用 while 循环。对于时间比较,我会使用一个小技巧。转换你的阈值和阅读量,第二个纪元然后比较它们。

MyTreshold=$(date -d 00:05:00 +"%s")    
while read -r line; do
        MyArray=( $line )
        MyReading=$(date -d ${MyArray[5]} +"%s")
        #the array starts a index 0
        if [[ ${MyArray[1]} -ge 75 && $MyReading -gt $MyThreshold ]]; then
           <LOGIC>
        fi
done <$var10