2012-09-03 3 views
2

나는 작업중인 다음 텍스트 파일을 갖고 있으며 creationdatetime이 2 일 이상 경과 할 때 개체 이름 값만 구문 분석 할 수 있어야합니다.2 일 이상 된 날짜의 텍스트 줄을 인쇄하는 방법

objectname ...........................: \Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15 
creationdatetime .....................: 01-Sep-2012 02:17:43 
objectname ...........................: \Path\to\file\hpVSS-LUN-22May12 22.24.11\hpVSS-LUN-28Aug12 22.16.19 
creationdatetime .....................: 03-Sep-2012 10:18:09 
objectname ...........................: \Path\to\file\hpVSS-LUN-22May-12 22.24.11\hpVSS-LUN-27Aug12 22.01.52 
creationdatetime .....................: 03-Sep-2012 10:18:33 

위의 명령의 출력은 다음과 같습니다

\Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15 

어떤 도움을 크게 감상 할 수 있습니다.

프렘

내가 2 단계에서 할 것

답변

2

:

1)

01-Sep-2012 02:17:43 | \Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15 
03-Sep-2012 10:18:09 | \Path\to\file\hpVSS-LUN-22May12 22.24.11\hpVSS-LUN-28Aug12 22.16.19 
03-Sep-2012 10:18:33 | \Path\to\file\hpVSS-LUN-22May-12 22.24.11\hpVSS-LUN-27Aug12 22.01.52 

2) 필터를 다루는 것입니다 당신이 입력 파일

awk '/objectname/{$1=$2="";file=$0;getline;$1=$2="";print $0" |"file}' inputfile > inputfile2 

이 방법을 포맷 날짜 :

COMPARDATE=$(($(date +%s)-2*24*3600)) # 2 days off 
IFS='|' 
while read d f 
do 
    [[ $(date -d "$d" +%s) < $COMPARDATE ]] && printf "%s\n" "$f" 
done < inputfile2 
+0

감사 스테판! awk에서 필터링을 수행 할 수있는 방법이 있습니까? gawk를 사용하는 Windows 환경에서 작업하고 있습니까? –

+0

심각한 테스트 처리를 수행하려는 경우 cygwin http://cygwin.com/을 Windows 컴퓨터에 설치하는 것이 좋습니다. 이 방법을 사용하면 유닉스 컴퓨터 에서처럼 거의 쉽게 스크립트 할 수 있습니다 –

3

awk의 날짜 구문 분석은 약간 까다 롭지 만 mktime을 사용하여 수행 할 수 있습니다. 달 이름을 숫자로 변환하려면 연관 변환 배열이 정의됩니다.

경로 이름에 공백이 있으므로 필드 구분 기호로는 : (콜론 뒤에 공백이 있음)이 가장 좋습니다. 다음은 작업 awk 스크립트는 다음과 같습니다 마지막 블록에

older_than_two_days.awk

BEGIN { 
    months2num["Jan"] = 1; months2num["Feb"] = 2; months2num["Mar"] = 3; months2num["Apr"] = 4; 
    months2num["May"] = 5; months2num["Jun"] = 6; months2num["Jul"] = 7; months2num["Aug"] = 8; 
    months2num["Sep"] = 9; months2num["Oct"] = 10; months2num["Nov"] = 11; months2num["Dec"] = 12; 

    now = systime() 
    two_days = 2 * 24 * 3600 
    FS = ": " 
} 

$1 ~ /objectname/ { 
    path = $2 
} 

$1 ~ /creationdatetime/ { 
    split($2, ds, " ") 
    split(ds[1], d, "-") 
    split(ds[2], t, ":") 
    date   = d[3] " " months2num[d[2]] " " d[1] " " t[1] " " t[2] " " t[3] 
    age_in_seconds = mktime(date) 

    if(now - age_in_seconds > two_days) 
    print path 
} 

모든 분할 날짜 비트를 선택하고 mktime이 수락하는 형식으로 변환하는 것입니다. 이 같은

실행을 :

awk -f older_than_two_days.awk infile 

출력 :

\Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15 
+0

Thor에게 많은 감사를 전합니다. 그것은 내가 필요한 것입니다. –

+0

답변으로 귀하의 질문이 만족스럽게 해결 될 경우, 투표를 통해 투표를 수락하십시오. – Thor

관련 문제