需要一种方法来检查文件内容(时间数据)是否超过 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
我正在创建一个脚本来提取服务器上 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