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の場合:2つのパラメーターを渡します。TimeStampの場合は "2014-05-28_15:08:"および- ジョブ名は "ジョブ"
私はリストを取得する必要があります
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: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
解決策はありますか?
以下のコードは機能しました:
for i in myjob*; do
if [[ "myjob_2014-05-28_15:08:00.log" < "$i" ]]; then
echo $i
fi
done
Perl
ソリューション:
$ Perl -nle '
BEGIN {$t = "2014-05-28_15:08:00"}
if (/_(.*?)\./) {
print if $1 gt $t;
}
' file
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
更新
単純なPerl
スクリプト:
#!/usr/bin/Perl
use strict;
use warnings;
my $t = $ARGV[0];
my $l = qr/$ARGV[1]/;
while(<DATA>) {
if (/${l}_/) {
if (/_(.*?)\./) {
print if $1 gt $t;
}
}
}
__DATA__
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
Awk(mawk 1.3.3
) 解決:
ls | awk -F'[_.]' '{printf "%s_%s\n", $2, $3}' | \
awk ' $0 > "2014-05-28_15:08:00" {print}'
与える:
2014-05-28_15:08:01
2014-05-28_15:08:09
2014-05-28_15:08:10
2014-05-28_15:08:11
2014-05-28_15:08:12
2014-05-28_15:08:13
2014-05-28_15:08:14
2014-05-28_15:08:22
sort
は、ここで作業の大部分を実行できます。
jobname=job
timestamp=2014-05-28_15:08:00
param=${jobname}_${timestamp}.log
printf %s\\n "${param}" ./* |
sort -t_ -r -k1,1 -k2,2n -k3,3n |
sed -n "\|./${jobname}_|{/${param}/q;p}"
###OUTPUT:
./job_2014-05-28_15:08:22.log
./job_2014-05-28_15:08:14.log
./job_2014-05-28_15:08:13.log
./job_2014-05-28_15:08:12.log
./job_2014-05-28_15:08:11.log
./job_2014-05-28_15:08:10.log
./job_2014-05-28_15:08:09.log
./job_2014-05-28_15:08:01.log
そして2番目の例:
jobname=job1
timestamp=2014-05-28_15:08:11
param=${jobname}_${timestamp}.log
printf %s\\n "${param}" ./* |
sort -t_ -r -k1,1 -k2,2n -k3,3n |
sed -n "\|./${jobname}_|{/${param}/q;p}"
###OUTPUT:
./job1_2014-05-28_15:08:22.log
./job1_2014-05-28_15:08:14.log
./job1_2014-05-28_15:08:13.log
./job1_2014-05-28_15:08:12.log
-cnewer
をfindで使用できます。
find /mylogdir -name "job_*" -cnewer /mylogdir/job1_2014-05-28_15:08:00.log
もちろん、これは、ファイル名に基づいていない、実際に変更されたファイル、またはjob1_2014-05-28_15:08:00.log
の後にメタデータが変更されたファイルを検索することです。あなたの場合、これはうまくいくはずです。