Shell Script String Manipulation - PullRequest
       12

Shell Script String Manipulation

0 голосов
/ 31 января 2011

Я пытаюсь заменить метку времени в строке на удобочитаемую метку времени. Я знаю, как преобразовать эпоху в нужный мне формат времени (и делал это вручную), хотя мне сложно понять, как заменить его в строке (с помощью сценария).

Строка - это имя файла, например, XXXX-XXX-2011-01-25-3.6.2-record.pb. 1296066338 .gz (эпоха выделена жирным шрифтом).

Я конвертировал метку времени с помощью следующего кода gawk:

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

Я вообще незнаком с сценариями bash. Кто-нибудь может подтолкнуть меня в правильном направлении?

спасибо.

Ответы [ 3 ]

2 голосов
/ 31 января 2011

Вы можете использовать это

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

, если не хотите вызывать awk.

0 голосов
/ 31 января 2011

Вы можете использовать строковые манипуляции 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
0 голосов
/ 31 января 2011

Все ли имена файлов имеют одинаковый формат? В частности, "." + эпоха + ".gz"?

Если это так, вы можете использовать несколько различных маршрутов. Вот один с sed:

$ 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, но вместо сохранения эпохи вы захотите сохранить другие части имени файла.

EDIT: Для примера, рабочий образец на моей машине:

#!/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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...