我在 linux 中有一个目录,其中包含一个日志文件列表,如果某些作业运行,则会自动生成日志文件。每个日志文件都附加时间戳,如“ JobName_TimeStamp ”
更新:
job_2014-05-28_15:05:26.log
job_2014-05-28_15:06:58.log
job_2014-05-28_15:07:02.log
job_2014-05-28_15:07:57.log
job_2014-05-28_15:08:00.log
job_2014-05-28_15:08:01.log
job_2014-05-28_15:08:09.log
job_2014-05-28_15:08:10.log
job_2014-05-28_15:08:11.log
job_2014-05-28_15:08:12.log
job_2014-05-28_15:08:13.log
job_2014-05-28_15:08:14.log
job_2014-05-28_15:08:22.log
job1_2014-05-28_15:08:11.log
job1_2014-05-28_15:08:12.log
job1_2014-05-28_15:08:13.log
job1_2014-05-28_15:08:14.log
job1_2014-05-28_15:08:22.log
我想运行一个linux命令来列出大于特定时间戳的所有文件?
对于示例1 :我将传递两个参数,如果给出的 TimeStamp 为“ 2014-05-28_15:08:00 ” 职位名称是“职位”
我应该将列表作为
job_2014-05-28_15:08:01.log
job_2014-05-28_15:08:09.log
job_2014-05-28_15:08:10.log
job_2014-05-28_15:08:11.log
job_2014-05-28_15:08:12.log
job_2014-05-28_15:08:13.log
job_2014-05-28_15:08:14.log
job_2014-05-28_15:08:22.log
示例2 :我将传递两个参数,如果 TimeStamp 给定为“2014-05-28_15:08:11
”且作业名称为“的 JOB1 “
我应该将列表作为
job1_2014-05-28_15:08:12.log
job1_2014-05-28_15:08:13.log
job1_2014-05-28_15:08:14.log
job1_2014-05-28_15:08:22.log
任何解决方案?
感谢。
答案 0 :(得分:1)
只需比较名称即可完成工作:
ls | sort | awk '{if ($0 > "job_2014-05-28_15:08:00.log") {print}}'
可能不需要 sort
,但我把它放在这里以确保名称按字母顺序排序。
修改强>
上述命令不适用于具有不同前缀或后缀的文件名。但是如果你能确保1.文件名中没有空格2.日期格式部分是相同的。你可以写这样的代码:
ls | sort \
| sed 's/\(^.*$\)/& &/' \
| sed 's/.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).* \(.*\)/\1 \2/' \
| awk '{if ($1 > "2014-05-28_15:08:00") {print $2}}'
它看起来很脏,不可能是最好的,但应该有效。你可以根据这个想法写下自己的基础。
答案 1 :(得分:1)
使用这个简单的bash脚本并获取输出
#!/bin/bash
pattern1=`echo $1 | sed 's/_/ /'`;
pattern2=`date -d "$pattern1" "+%s"`
for file in `ls *.log`
do
job=`echo "$file" | sed -r 's/([^_]+).*/\1/g'`
time=`echo "$file" | sed -r 's/([^_]+_)(.*)_(.*)\..*/\2 \3/g'`
pattern3=`date -d "$time" "+%s"`
if [ $2 == $job ] && [ $pattern3 -gt $pattern2 ] ; then
echo "$file"
fi
done
你必须运行这个方法
$bash script_file.sh <timestamp> <job>
像
$bash script_file.sh 2014-05-28_15:08:00 job
而不是pattern1 = echo $1 | sed 's/_/ /'
您将以下行放在该位置。
job1=`echo $1 | sed -r 's/([^_]+).*/\1/g'`;
pattern1=`echo $1 | sed -r 's/([^_]+_)(.*)_(.*)\..*/\2 \3/g'`
而不是if语句上的$ 2,你需要把$ job1。