Bir sütundaki zaman damgalarını tarihe nasıl dönüştürebilirim?


15

Bunu içeren bir dosya var:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Zaman damgasını şu biçimde bir tarihe dönüştürmek istiyorum:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Bunu nasıl yapabilirim?

Bu çalışır biliyorum: perl -pe 's/(\d+)/localtime($1)/e'( bu sorudan ) ama çıktı biçimi Mon Nov 10 02:00:03 2014.

Bu komut benim istenen çıkış içine damgaları dönüştürebilirsiniz biliyorum: date -d@1415602803 +"%F %H:%M:%S"ama bunun çalışmak gelemedi awkkullanarak system("cmd")çünkü bütün alıntılar ve etajer.

Yanıtlar:


6

Bunun gibi belki

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 

17

Burada bir şey buldum : Stackoverflow - Komut satırında unixtime dönüştürün .

Bu kadar geldi:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","alan ayırıcısını kullanmak ,,
  • OFS=",";çıktı alanları da a ile ayrılır ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);ilk alanın değerini $1belirtilen biçime değiştirmek için ve
  • print $0; tüm satırı yazdırmak için.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'awk: line 2: function strftime never definedburada verir . Lütfen HER AWK DEĞİLDİR strftime()! Çoğu (tümü?) AWK'da çalışan bir çözüm için, datetaşınabilir kalmak için lütfen harici komutu kullanın.

2
@yeti, datetarihleri ​​bir uzantı olarak biçimler arasında dönüştürebilen birkaç uygulama vardır, ancak bunun nasıl yapıldığı uygulamalar arasında tamamen değişir. Örneğin, Costas tarafından verilen çözüm, GNU'ya özgü bir sözdizimi kullanır date. Taşınabilirlik istiyorsanız, kullanın perl.
Stéphane Chazelas

4

İsterseniz herhangi bir tarih biçimiyle awkharici komut kullanabilirsinizdate

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'

Kullanmadığınız için +1 strftime()!

4
Harici bir komut kullanmanın, özellikle binlerce satır işleniyorsa dikkat çeken ciddi bir performans isabetine neden olacağını unutmayın
Jose Gómez

2

Ayrıca deneyebilirsiniz:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash

2

9 ay önce bunun bir kopyası olduğunu belirten bir soru sordum. Sadece şimdi bu soruya benim için çalışan cevabı göndermek için bir talep gördüm. İşte bu soru ve cevap için bir bağlantı.

/unix//a/304009/172916

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.