これを含むファイルがあります:
_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
_
タイムスタンプをこの形式の日付に変換したい:
_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
_
どうやってやるの?
私はこれが機能することを知っています:Perl -pe 's/(\d+)/localtime($1)/e'
(from this question )ですが、出力形式は_Mon Nov 10 02:00:03 2014
_です。
このコマンドでタイムスタンプを目的の出力に変換できることはわかっています:_date -d@1415602803 +"%F %H:%M:%S"
_ですが、すべての引用符とその他の理由により、system("cmd")
を使用してawk
で動作させることができませんでした。
このように
Perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e'
ここに何かが見つかりました: Stackoverflow-コマンドラインでunixtimeから変換 。
これを思いついた:
_awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
_
-F","
_のフィールド区切り文字を使用するには、_,
_、OFS=",";
_出力フィールドも_,
_で区切られるように、$1=strftime("%Y-%m-%d %H:%M:%S", $1);
最初のフィールドの値を_$1
_から指定した形式に変更し、print $0;
_行全体を印刷します。awk
が好きな場合は、外部コマンドdate
を任意の日付形式で使用できます
awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
9か月前に、これと重複している質問をしました。たった今、この質問に対して私のために働いた答えを投稿する要求を見ました。ここにその質問と回答へのリンクがあります。
あなたも試すことができます:
cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash