2014-02-09 4 views
1

grep-ing없이 모든 X 분 (예 : 5 분마다 5 분의 grep 로그)의 마지막 X 분에 대한 grep 로그를 원합니다. 이 작업을 수행하는 가장 간단한 방법은 무엇일까요?grep은 X 분마다 마지막 X 분 동안 기록합니다.

+0

포스트 당신의 일부 로그 그래서 우리는 날짜 형식을 참조 또한 당신이 시도 한 내용을 게시 – Jotne

+0

이 봐 유무 :.. HTTP : // 유래 .com/questions/21524957/parse-a-file-between-c ertain-timestamps –

답변

0

루비 1.9.3 솔루션은

필요한 두 번째 부분, 난 아직 테스트하지 않은 :(

참고 : 또한 당신이 ('루비'변경 오두막의 위치를 ​​알고있는 경우 . 스크립트의 첫 번째 줄), 보안상의 이유로

#! /usr/bin/env ruby 

require 'date' 
require 'pathname' 

if ARGV.length != 4 
     $stderr.print "usage: #{$0} -d|-h|-m|-s time expression log_file\n" 
     exit 1 
end 
begin 
     total_amount = Integer ARGV[1] 
rescue ArgumentError 
     $stderr.print "error: parameter 'time' must be an Integer\n" 
     $stderr.print "usage: #{$0} -d|-h|-m|-s time expression log_file\n" 
end 

if ARGV[0] == "-m" 
     gap = Rational(60, 86400) 
     time_str = "%b %d %H:%M" 
     until_next_search = total_amount * 60 
elsif ARGV[0] == "-s" 
     gap = Rational(1, 86400) 
     time_str = "%b %d %H:%M:%S" 
     until_next_search = total_amount 
elsif ARGV[0] == "-h" 
     gap = Rational(3600, 86400) 
     time_str = "%b %d %H" 
     until_next_search = total_amount * 3600 
elsif ARGV[0] == "-d" 
     time_str = "%b %d" 
     gap = 1 
     until_next_search = total_amount * 86400 
else 
     $stderr.print "usage: #{$0} -d|-h|-m|-s time expression log_file\n" 
     exit 1 
end 

pn = Pathname.new(ARGV[3]) 
if pn.exist? 
     log = (pn.directory?) ? ARGV[3] + "/*" : ARGV[3] 
else 
     $stderr.print "error: file '" << ARGV[3] << "' does not exist\n" 
     $stderr.print "usage: #{$0} -d|-h|-m|-s time expression log_file\n" 
end 

search_str = ARGV[2] 
now = DateTime.now 

while true 
     total_amount.times do 
       now -= gap 
       system "cat " << log << " | grep '" << now.strftime(time_str) << ".*" << search_str << "'" 
     end 
     sleep until_next_search 
end 
관련 문제