如何解决需要一种方法来检查文件内容时间数据是否超过5分钟
我正在创建一个脚本,以提取服务器上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 $9 }'`
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更有效。再说一遍,您可以使用:(这是数字1,而不是字母“ l”)来改进您的行
var10=$(ls -1rt /projects/Informatica/INFA_ADMIN/LogFiles/myfile.txt)
从第2行开始,我假设原始文件是用空格分隔的。实际上,您可以利用它来发挥自己的优势,而不用添加逗号。同样,与“ while”循环一起使用for循环和“ cat”的性能要差一些。为了进行时间比较,我将使用一些技巧。转换您的阈值并阅读(自纪元以来的第二秒),然后进行了比较。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。