다음 입력이 포함된 파일이 있습니다.
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 -l
POSIX 로케일로 보고된 것처럼 보입니다. 휴대성이 뛰어나 적응 가능이 기능은 다른 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을 제공합니다.