0

文字列内のエポック タイムスタンプを人間が読めるタイムスタンプに置き換えようとしています。エポックを必要な時間形式に変換する方法を知っています (手動で行っています) が、文字列内で (スクリプトを介して) 置き換える方法を理解するのに苦労しています。

文字列は、XXXX-XXX-2011-01-25-3.6.2-record.pb などのファイル名です。1296066338 .gz (エポックは太字)。

次のgawkコードでタイムスタンプを変換しています:

gawk 'BEGIN{print strftime("%Y%m%d.%k%M",1296243507)}'

私は通常、bash スクリプトに慣れていません。誰かが私に正しい方向への微調整を与えることができますか?

ありがとう。

4

3 に答える 3

2

あなたはこれを使うことができます

date -d '@1296066338' +'%Y%m%d.%k%M'

awkを呼び出したくない場合に備えて。

于 2011-01-31T00:19:19.633 に答える
0

すべてのファイル名は同じ形式ですか?具体的には、 "。" +エポック+".gz"?

その場合は、さまざまなルートを使用できます。これがsedの1つです:

$ echo "XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz" | sed 's/.*\.\([0-9]\+\)\.gz/\1/'
1296066338

これでエポックが抽出され、gawkコマンドに送信されます。何かのようなもの:

#!/bin/bash

...
epoch=$( echo "XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz" | sed 's/.*\.\([0-9]\+\)\.gz/\1/' )
readable_timestamp=$( gawk "BEGIN{print strftime(\"%Y%m%d.%k%M\",${epoch})}" )

次に、ファイル名の番号を置き換えたい方法を使用します。sedを介して再度送信できますが、エポックを保存する代わりに、ファイル名の他の部分を保存することをお勧めします。

編集:良い測定のために、私のマシンで動作するサンプル:

#!/bin/bash

filename="XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz"

epoch=$( echo ${filename} | sed 's/.*\.\([0-9]\+\)\.gz/\1/' )
readable_timestamp=$( gawk "BEGIN{print strftime(\"%Y%m%d.%k%M\",${epoch})}" )

new_filename=$( echo ${filename} | sed "s/\(.*\.\)[0-9]\+\(\.gz\)/\1${readable_timestamp}\2/" )

echo ${new_filename}
于 2011-01-31T00:15:44.597 に答える
0

Bash の文字列操作と AWK の変数の受け渡しを使用して、呼び出しsedや引用符のエスケープを行う必要がないようにすることができます。

#!/bin/bash
file='XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz'
base=${file%.*.*}     #    XXXX-XXX-2011-01-25-3.6.2-record.pb
epoch=${file#$base}   #    1296066338.gz
epoch=${epoch%.*}     #    1296066338
# we can extract the extension similarly, unless it's safe to assume it's ".gz"
humantime=$(gawk -v "epoch=$epoch" 'BEGIN{print strftime("%Y%m%d.%k%M",epoch)}')
newname=$base.$humantime.gz
echo "$newname"

結果:

XXXX-XXX-2011-01-25-3.6.2-record.pb.20110126.1225.gz
于 2011-01-31T01:55:13.963 に答える