Bagaimana saya bisa mengubah cap waktu di kolom menjadi tanggal?

15

Saya punya file yang mengandung ini:

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

Saya ingin mengonversi cap waktu menjadi tanggal dalam format ini:

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

Bagaimana saya bisa melakukan itu?

Saya tahu ini berfungsi: perl -pe 's/(\d+)/localtime($1)/e'(dari pertanyaan ini ) tetapi format outputnya adalah Mon Nov 10 02:00:03 2014.

Saya tahu perintah ini dapat mengubah cap waktu menjadi keluaran yang saya inginkan:, date -d@1415602803 +"%F %H:%M:%S"tetapi saya tidak dapat membuatnya bekerja dengan awkmenggunakan system("cmd")karena semua kutipan dan yang lainnya.

Alaa Ali
sumber

Jawaban:

6

Mungkin seperti ini

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

Menemukan sesuatu di sini: Stackoverflow - Konversi dari unixtime di baris perintah .

Datang dengan ini:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","untuk menggunakan pemisah bidang ,,
  • OFS=",";sehingga bidang output juga dipisahkan oleh ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);untuk mengubah nilai bidang pertama $1ke dalam format yang ditentukan, dan
  • print $0; untuk mencetak seluruh baris.
Alaa Ali
sumber
2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'berikan awk: line 2: function strftime never defineddisini. Tolong jelaskan bahwa TIDAK SETIAP AWK strftime()! Untuk solusi yang berjalan di sebagian besar (semua?) AWK, silakan gunakan dateperintah eksternal untuk tetap portabel.
2
@yeti, ada beberapa dateimplementasi yang dapat mengonversi tanggal antara format sebagai ekstensi, tetapi cara melakukannya sangat bervariasi di antara implementasi. Sebagai contoh, solusi yang diberikan oleh Costas menggunakan sintaks khusus untuk GNU date. Jika Anda ingin portabilitas, gunakan perl.
Stéphane Chazelas
4

Jika suka, awkAnda dapat menggunakan perintah eksternal datedengan format tanggal apa pun

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
Costas
sumber
+1 untuk TIDAK menggunakan strftime()!
4
Perhatikan bahwa menggunakan perintah eksternal akan menghasilkan pukulan kinerja yang parah, terutama terlihat jika ribuan baris sedang diproses
Jose Gómez
2

Anda juga dapat mencoba:

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

Saya mengajukan pertanyaan 9 bulan lalu yang ditandai sebagai duplikat dari pertanyaan ini. Saya baru saja melihat permintaan untuk mengirim jawaban yang berhasil untuk saya pada pertanyaan ini. Inilah tautan ke pertanyaan dan jawaban itu.

/unix//a/304009/172916

Emily Shaffer
sumber