LINUX.ORG.RU

замены даты в файле via sed


0

1

У меня есть файл вида:

1314347367.377 X X X
1314347372.373 X X X

Первый столбец - время с начала epoch.

Нужно заменить его на на время в читабельной форме

Может кто-нибудь объяснить, почему

sed -r "s/([0-9]{10,}\.[0-9]{3})/$(date --date=&)/g" log > log.new

не работает?

В первом столбце нового файла строки вида

Tue Aug 30 00:00:00 MSD 2011

Что соответствует date --date=<пусто>

Очевидно, что & не разворачивается внтури $(...) Как это пофиксить?

Спасибо.

★★★★★

Ответ на: комментарий от adriano32

Да, это я забыл.

 
sed -r "s/([0-9]{10,}\.[0-9]{3})/$(date --date=@&)/g" log > log.new 
тем не менее:
 date: invalid date `@' 

x4DA ★★★★★
() автор топика
Ответ на: комментарий от lazyklimm

Спасибо, тоже вполне подходит.

x4DA ★★★★★
() автор топика
Ответ на: комментарий от x4DA

ORLY?Это для седа это сматченная последовательность, а для баша

$ date --date=
Tue Aug 30 00:00:00 EEST 2011
$ date --date=&
^C
[1] 3131
$ Tue Aug 30 00:00:00 EEST 2011
[1]+  Done                    date --date=
$

adriano32 ★★★
()

замены даты в файле with sed

//fxd

anonymous
()
Ответ на: комментарий от x4DA
$ cat logr
1314347367.377 X X X
1314347372.373 X X X
$ sed -r "s/([0-9]{10,}\.[0-9]{3})/echo \`date --date=@&\`/g" logr | sh
Fri Aug 26 11:29:27 EEST 2011 X X X
Fri Aug 26 11:29:32 EEST 2011 X X X
adriano32 ★★★
()
Ответ на: комментарий от x4DA

спасибо, видимо все-таки в самом sed-е не получится так сделать.

Что-то ты как-то рановато сдался:

$ sed -r "s/([0-9]{10,}\.[0-9]{3})(.+)/date --date=@\1; echo \2/e; s/\n/ /g" log
Птн Авг 26 12:29:27 MSD 2011 X X X
Птн Авг 26 12:29:32 MSD 2011 X X X

Neksys ★★★
()

Очевидно, что & не разворачивается внтури $(...)

Естественно, $(...) «разворачивается» ещё в шелле, шелл нифига не знает про твой '&'.

Led ★★★☆☆
()
Ответ на: комментарий от x4DA

>спасибо, видимо все-таки в самом sed-е не получится так сделать.

sed полон по Тюрингу, поэтому можно продолжать мучения :)

annulen ★★★★★
()
Ответ на: комментарий от x4DA

В основе лежит модификатор /e (расширение GNU)

Позволяет указать команду шелла (не программы sed) в качестве ЗАМЕНЫ. Если соответствие ОБРАЗЦУ будет найдено, то оно будет заменено на вывод указанной в секции ЗАМЕНЫ команды. Пример:

$ echo ночь | sed 's/ночь/echo день/e'
день
«\1» и «\2» означают соответствующую по счету часть регулярного выражения, запомненную при помощи знаков \( и \).
$ sed -r "s/([0-9]{10,}\.[0-9]{3})(.+)/date --date=@\1/e;" log
Птн Авг 26 12:29:27 MSD 2011
Птн Авг 26 12:29:32 MSD 2011

$ sed -r "s/([0-9]{10,}\.[0-9]{3})(.+)/date --date=@\1;echo \2;/e;" log
Птн Авг 26 12:29:27 MSD 2011
X X X
Птн Авг 26 12:29:32 MSD 2011
X X X

$ sed -r "s/([0-9]{10,}\.[0-9]{3})(.+)/date --date=@\1;echo \2;/e; s/\n//" log
Птн Авг 26 12:29:27 MSD 2011X X X
Птн Авг 26 12:29:32 MSD 2011X X X

$ sed -r "s/([0-9]{10,}\.[0-9]{3})(.+)/date --date=@\1;echo \2;/e; s/\n/ /" log
Птн Авг 26 12:29:27 MSD 2011 X X X
Птн Авг 26 12:29:32 MSD 2011 X X X

Neksys ★★★
()
Ответ на: комментарий от legolegs

А можно быстро, красиво и эффективно сделать на авке, как уже показали: замены даты в файле via sed (комментарий)

Не настолько быстро, как хотелось бы:

$ cat log | awk '{print strftime("%Y-%m-%d %H:%M:%S",$1),$2,$3}';
awk: line 2: function strftime never defined

Neksys ★★★
()
Ответ на: комментарий от Neksys

таки это для gawk расширение, что можно узнать из man awk

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.