2017-03-27 1 views
0

날짜를 "실제"보다 작은 문자열 만 파일을 삭제하고 다른 파일에 삭제하려면 2 시간 30 분 전 (150 분). 나는 절대 값 "2017-03-21 04:36:19"와 같은 것을 찾을 수있는 명령을 필요로하지 않는다 - 그리고 전에 모든 라인들을 삭제한다. 줄이 존재하지 않을 가능성이 크고 (초, 분,이 필터는 삭제하지 않고 모든 파일을 제공합니다).최근 로그 파일 로그 시간

2017-03-18 01:27:12 bla bla 
2017-03-18 02:14:11 bla bla 
2017-03-20 04:37:14 bla bla 
2017-03-21 02:25:59 bla bla 
2017-03-22 05:12:43 bla bla 

시간 형식 : % Y- % M- % D % H : %의 M :

내가 구글에서 검색 %의 S, 시도 모든

나는 다음 형식의 데이터가 많은 검색어로 첫 페이지에 AWK에서

+3

참조 : [시간 범위의 예에서 로그 파일에 항목을 찾을 수 있습니다. 지난 시간] (http://stackoverflow.com/q/7706095/3776858) – Cyrus

+0

무엇이 문제입니까? 정상적인 날짜 형식을 사용하므로 단순히 문자열 비교를 사용할 수 있습니다. –

+0

* 작게 지금은 지금 2 시간 30 분 (150 분) * - 좋아, 오늘은 '2017-03-27'라고 말할 수 있습니다. 그들은 모두 작습니다 – RomanPerekhrest

답변

1

:

awk ' 
BEGIN{ now=systime() }  # now in seconds 
{ 
    then=$1 " " $2   # then might not be a good var name though :) 
    gsub(/[-:]/," ",then) # making mktime fit variable out of then 
    then=mktime(then)  # then then to seconds 
    if(then < now-604800) # compare, 604800 is 7 days in seconds 
     print    # output older than that 
}' file 
2017-03-18 01:27:12 bla bla 
2017-03-18 02:14:11 bla bla 
2017-03-20 04:37:14 bla bla 
+0

고마워요! 그것의 작품들도 (내 목표가 아님). 7 일이 지난 날을 알려주세요. 너무 좋은 것. 어쩌면 'sed'에서와 같이 awk에 대한 "inverse"옵션이 존재할 수 있으므로 단 7 일 또는 150 분이 걸릴 수 있습니다. – Amaroc

+0

@Amaroc 코드에서 604800을 원하는 시간 (초 단위)으로 변경하기 만하면 데이터가 그런 값 이었으므로 사용해야했습니다. 150 분이 넘는 경우 :'if (then> now-9000)'. –

+0

다시 한 번 도움을 주셔서 감사합니다.이 내용은 사용하기 쉽습니다. ( awk -vdate = $ (날짜 -d "150 분전" '+ % Y- % m- % d % H : % M : % S ') \ '$ 1 $ 2> = date {print} '로그 당신의 방법 또한 훌륭하고 또 다른 날짜 형식 [- :] /, ""너무 귀엽다! – Amaroc

2
awk -vdate=$(date -d "150 minutes ago" '+%Y-%m-%d%H:%M:%S') \ 
    '$1$2 >= date { print }' log 
+0

OMG, 천재인가, 나는 같은 "syntax"와 동일한 "명령"을 사용하지만 작동하지 않는다. 고마워요! – Amaroc

+0

@Amaroc 환영합니다. –