Bagaimana cara menyalurkan output ke date -d “value”?

13

Saya memiliki tanggal seperti "2014-01-30 05:04:27 GMT", dan jika saya menjalankan date -d "2014-01-30 05:04:27 GMT", hasilnya ada di zona waktu server saya ("Kam 30 Jan 16:04:27 EST 2014 ").

Dengan menggunakan grep and cut, saya telah mengekstrak tanggal dalam GMT dari sebuah file. Namun, saya berjuang untuk kemudian mengubahnya menjadi waktu lokal saya.

Sebagai contoh:

[user @ server log] # grep "something" logfile.txt | grep "Berhasil" | cut -f1 -d '['

Output: 2014-01-30 05:04:27 GMT

Apa yang bisa saya tambahkan di akhir, untuk meneruskan keluaran itu ke "date -d"?

Diupayakan:

  • [user @ server log] # grep "something" logfile.txt | grep "Berhasil" | cut -f1 -d '[' | date -d
  • [user @ server log] # grep "something" logfile.txt | grep "Berhasil" | cut -f1 -d '[' | tanggal
  • [user @ server log] # grep "something" logfile.txt | grep "Berhasil" | cut -f1 -d '[' | date -d "$ 1"
Shane
sumber

Jawaban:

12
gmt="$(grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[')"
date -d "$gmt"

Atau, jika Anda lebih suka format pipa:

grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | { read gmt ; date -d "$gmt" ; }

Masalahnya adalah bahwa datetidak menggunakan stdin. Jadi, kita harus menangkap stdin ke dalam variabel (disebut di gmtsini) dan kemudian menyediakannya di baris perintah ke date.

Sampel keluaran dari pendekatan kedua:

$ echo  "2014-01-30 05:04:27 GMT" | { read gmt ; date -d "$gmt" ; }
Wed Jan 29 21:04:27 PST 2014
John1024
sumber
1
Terima kasih, ini menyelesaikan masalah! Juga menghargai Anda menjelaskan alasan di balik mengapa itu tidak berhasil.
Shane
19

Jika Anda menggunakan tanggal GNU dari coreutils yang cukup baru, ada date -f, dari layar bantuan:

-f, --file=DATEFILE       like --date once for each line of DATEFILE

Jadi usaha Anda 4 bisa jadi:

$ grep "something" logfile.txt | grep "Succeeded" | cut -f1 -d'[' | date -f -

-singkatan terakhir dari stdin.

hroptatyr
sumber
2
Ini harus menjadi jawaban yang diterima.
Petrus K.
Apakah mungkin untuk membandingkan output dari perintah di atas dengan tanggal tertentu. Misalnya. Saya perlu mencantumkan semua tanggal yang lebih lama dari "Rab 30 Jan 21:04:27 PST 2014"
Manu
@ Manu tidak per se, dateutils miliki dategrepuntuk kasus penggunaan khusus itu.
hroptatyr
Ini jauh lebih mudah! Kalau saja aku bisa membaca, aku mungkin sudah menemukan ini di halaman manualnya.
Ken Sharp