人が読める日付に変換する必要がある新起源の日付を含むファイルがあります。私はすでに、次のように日付変換を実行する方法を知っています。
[server01 ~]$ date -d@1472200700
Fri 26 Aug 09:38:20 BST 2016
sed
.. しかし、ファイルを繰り返してすべての項目を変換する方法を見つけるのが難しいです。ファイル形式は次のとおりです。
#1472047795
ll /data/holding/email
#1472047906
cat /etc/rsyslog.conf
#1472048038
ll /data/holding/web
ベストアンサー1
sed
GNUは次の機能を実行できます。
sed -E 's/^#([0-9]+).*$/date -d @\1/e'
これは非常に非効率的です(そして任意の命令注入の脆弱性が発生しやすい1 )。これは、実際には、次のように各行date
に対してシェルとコマンドを実行することを意味するためです。#xxxx
シェルwhile read
ループほど悪い。ここでは、日付変換機能が組み込まれているテキスト処理ユーティリティ、perl
またはなどを使用することをお勧めします。gawk
perl -MPOSIX -pe 's/^#(\d+).*/ctime $1/se'
または:
gawk '/^#/{$0 = strftime("%c", substr($0, 2))};1'
1^#([0-9]).*
(この回答の以前のバージョンで行ったように)代わりに作成すると、^#([0-9]).*$
UTF-8ロケール(現在の標準)などのマルチバイトロケールで入力が似ています。#1472047795<0x80>;reboot
ここでは<0x80>
、セクション値0x80という単語はそうではありません。s
最終的に実行されるコマンドなどの有効な文字形式です。date -d@1472047795<0x80>; reboot
extraが使用されても、$
この行は置き換えられません。別の方法は次のとおりです。s/^#([0-9])/date -d @\1 #/e
つまり、日付以降の部分を#xxx
シェルコメントとして保持することです。