![ファイルの日付形式の変更[重複]](https://linux33.com/image/94847/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%97%A5%E4%BB%98%E5%BD%A2%E5%BC%8F%E3%81%AE%E5%A4%89%E6%9B%B4%5B%E9%87%8D%E8%A4%87%5D.png)
Sample.txtという名前の次のファイルがあります。
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3
このように見えるように修正する必要があります。日付形式をこの形式に変更する必要があります。
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3
答え1
awk
以下の助けを借りて使用されますdate
。
awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}'
-F '[[\\]]'
フィールド区切り文字を[
または]
に設定すると、日付はフィールド2にあり、残りはフィールド3にあります。変数には、2番目のフィールドを目的の形式に変換するコマンドが
cmd
含まれており、外部コマンドを実行して出力を変数に保存します。date
getline
date
out
out
最後に、変数の内容と3番目のフィールドを印刷します。
例:
% cat file.txt
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3
% awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}' file.txt
2016-09-10 06:31:41!Node2!Node1!Node3
2016-09-11 23:31:41!Node2!Node1!Node3
答え2
Perlモジュールでstrptime
/を使用してください:strftime
Time::Piece
perl -MTime::Piece -pe '
s/\[(.*?)\]/Time::Piece->strptime($1, "%a %b %d %H:%M:%S %Y")->strftime("%Y-%m-%d %H:%M:%S!ER_DEV")/e
' Sample.txt
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3
答え3
sed
次の強力な純粋なコマンドを使用してこれを実行できます。
sed 's/^.... //
s/^Jan /01/; s/^Feb /02/; s/^Mar /03/; s/^Apr /04/; s/^May /05/; s/^Jun /06/
s/^Jul /07/; s/^Aug /08/; s/^Sep /09/; s/^Oct /10/; s/^Nov /11/; s/^Dec /12/
s/^\(..\) /\10/; s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/'
s/^.... //
[
曜日と(3文字の略語)を削除してください。s/^Jan /01/
など、月(名前の3桁の略語)(および次のスペース)を対応する数値(月番号)に置き換えます。s/^\(..\) /\10/
1桁の日付(日)の値(つまり、前にスペースがある10未満の数字)を確認し、前にゼロがあるように変更します。例えば、[Sat Sep 3
→→09 3
0903
s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/
残りの日付/時刻文字列をmmdd HH:MM:SS YYYY]
次から変換します。YYYY-mm-dd HH:MM:SS
。 (質問など、出力に先行スペースを表示するには、このコマンドにスペースを追加します。)
メモ:
- これはエラー処理を実行しません。入力が話したものと異なる場合、出力は混乱します。
- これは月名を英語でハードコードし、ロケール設定には適用されません。