BASH에서 항공편 날짜 및 시간 변환

BASH에서 항공편 날짜 및 시간 변환

다음 입력이 포함된 파일이 있습니다.

Nov 29 15:15 ,alert_logevent
Nov 29 15:15 ,alert_webhook
Nov 29 15:15 ,appsbrowser
Oct 20 2017 ,ClearPassOnSplunk_2
Oct 10 2017 ,Dnslookup
Oct 12 2017 ,domainCategories

루프 등을 사용하지 않고 datetime을 YYYYMMDDHHMMSS로 변환하고 싶습니다.

 cat SOMEFILE_WITH_DATE_AND_DATE | awk '{print "date -d \""$1, $2, $3"\"" " +" "%Y%m%d%H%M%S" , $4 }'

출력이 다음과 같기를 원합니다

20181129151500,alert_logevent
20181129151500,alert_webhook
20181129151500,appsbrowser
20181129151500,appsbrowser

등.

awk에서 system() 함수를 시도했지만 2개 이상의 매개변수를 허용하지 않습니다.

답변1

예상되는 출력이 입력과 어떤 관련이 있는지 잘 모르겠습니다. 나는 다음을 추천합니다:

$ perl -MPOSIX -MDate::Parse -pe 's{[^,]*}{
   strftime("%Y%m%d%H%M%S", localtime str2time($&))}e' <your-file
20171129151500,alert_logevent
20171129151500,alert_webhook
20171129151500,appsbrowser
20171020000000,ClearPassOnSplunk_2
20171010000000,Dnslookup
20171012000000,domainCategories

date이러한 날짜를 구문 분석하는 GNU 기능을 사용 하고 date한 줄에 하나의 호출을 실행하지 않으려면 다음을 수행할 수 있습니다(셸이 ksh 스타일 프로세스 대체(예: ksh, bash 또는 zsh)를 지원한다고 가정).

paste -d , <(<yourfile cut -d , -f1 | date -f- +%Y%m%d%H%M%S) \
           <(<yourfile cut -d , -f2-)

그러나 다음을 제공합니다.

20181129151500,alert_logevent
20181129151500,alert_webhook
20181129151500,appsbrowser
20171020000000,ClearPassOnSplunk_2
20171010000000,Dnslookup
20171012000000,domainCategories

Nov 29 15:15이것이 귀하가 요청한 것이지만, 이러한 소리는 미래의 타임스탬프보다 2017년(작년)의 타임스탬프일 가능성이 높기 때문에 원하는 것이 아닐 것 같습니다 .

여기서 날짜는 ls -lPOSIX 로케일로 보고된 것처럼 보입니다. 휴대성이 뛰어나 적응 가능이 기능은 다른 Q&A에서 가져온 것입니다.좀 더 유용한 형식으로 변환하세요. 또는 더 유용하고 정확하며 모호하지 않은 형식을 사용하는 데 사용할 수 ls -l있는 파일 날짜를 먼저 파일에 저장하는 것보다 더 나은 방법(예: GNU find -printf, GNU date -r, zsh stat, GNU/BSD stat또는 ast ls --format...)을 사용하는 것이 좋습니다.

답변2

0이면 000000괜찮습니다 HHMMSS.시간데이터는 다음을 사용awk방법:

awk 'BEGIN{ FS = OFS = "," }
     { 
         cmd = "date -d\042" $1 "\042 +%Y%m%d%H%M%S";
         cmd | getline d; close(cmd);
         print d, $2
     }' file

산출:

20181129151500,alert_logevent
20181129151500,alert_webhook
20181129151500,appsbrowser
20171020000000,ClearPassOnSplunk_2
20171010000000,Dnslookup
20171012000000,domainCategories

답변3

내장된 시간 함수를 구현하려면 GNU awk가 필요합니다.

gawk -F, -v OFS=, '
    BEGIN {
        # assumes english month names
        split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", m, ",")
        for (idx in m) months[m[idx]] = idx
        delete m
    }
    function date2timestamp(datestamp,    tmp,now,timestamp,year,hour,minute) {
        now = systime()
        split(datestamp, tmp, " ")
        if (tmp[3] ~ /:/) {
            year = strftime("%Y", now)
            hour = substr(tmp[3], 1, 2)
            minute = substr(tmp[3], 4, 2)
        }
        else {
            year = tmp[3]
            hour = minute = 0
        }
        timestamp = mktime(year " " months[tmp[1]] " " tmp[2] " " hour " " minute " 0")
        if (timestamp > now)
            timestamp = mktime((year-1) " " months[tmp[1]] " " tmp[2] " " hour " " minute " 0")
        return strftime("%Y%m%d%H%M00", timestamp)
    }
    {
        $1 = date2timestamp($1)
        print
    }
' file

산출

20171129151500,alert_logevent
20171129151500,alert_webhook
20171129151500,appsbrowser
20171020000000,ClearPassOnSplunk_2
20171010000000,Dnslookup
20171012000000,domainCategories

입력 파일이 결과처럼 보입니다.분석하다ls -l. 해당 파일을 건너뛰고 다음과 같은 작업을 수행할 수도 있습니다.

stat -c '%Y,%n' * | gawk -F, -v OFS=, '{$1 = strftime("%Y%m%d%H%M%S", $1)}1'

이는 안전하지 않지만(개행 문자로 파일 이름을 처리한다는 의미에서) 파일의 정확한 mtime을 제공합니다.

관련 정보