ファイルのエポックタイムスタンプを別の形式に置き換えるにはどうすればよいですか?

ファイルのエポックタイムスタンプを別の形式に置き換えるにはどうすればよいですか?

人が読める日付に変換する必要がある新起源の日付を含むファイルがあります。私はすでに、次のように日付変換を実行する方法を知っています。

[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

sedGNUは次の機能を実行できます。

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>; rebootextraが使用されても、$この行は置き換えられません。別の方法は次のとおりです。s/^#([0-9])/date -d @\1 #/eつまり、日付以降の部分を#xxxシェルコメントとして保持することです。

おすすめ記事