次の内容を含むファイルがあります。
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'
を通してこの問題)しかし、出力形式はMon Nov 10 02:00:03 2014
。
このコマンドはタイムスタンプを私が望む出力に変換できることを知っていますが、すべての引用符と項目のために動作させることdate -d@1415602803 +"%F %H:%M:%S"
はできません。awk
system("cmd")
答え1
ここで何かを見つけました: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;
行全体を印刷します。
答え2
たぶんこんな感じ
perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e'
答え3
必要に応じて、任意の日付形式で外部コマンドをawk
使用できます。date
awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
答え4
私は9ヶ月前にこの質問と重複してマークされた質問をしました。私はこの質問に対する回答を投稿するように求められました。以下は質問と回答へのリンクです。