замена метки времени датой с помощью sed - PullRequest
1 голос
/ 02 июля 2019

При использовании SED для замены меток времени удобочитаемыми датами метка времени всегда заменяется датой эпохи плюс значение, помещенное после "\"

. Я работаю с примером Perl, но предпочитаю использовать sed.Я пробовал варьировать escape-последовательности и заключать в кавычки "'` и т. Д.

sed -re "s/([0-9]{10})/$(date -d @\1)/g" mac.txt

ввод (одна строка):

834|task|3||1561834555|Ods|12015|info|Task HMI starting 837|task|3||1561834702|Nailsd|5041|info|Configured with engine 6000.8403 (/opt/NAI/LinuxShield/engine/lib/liblnxfv.so), dats 9297.0000 (/opt/NAI/LinuxShield/engine/dat), 197 extensions, 0 extra drivers 

Ожидается преобразование даты, но результаты:

834|task|3||Wed Dec 31 19:00:01 EST 1969|Ods|12015|info|Task HMI starting 837|task|3||Wed Dec 31 19:00:01 EST 1969|Nailsd|5041|info|Configured with engine 6000.8403 (/opt/NAI/LinuxShield/engine/lib/liblnxfv.so), dats 9297.0000 (/opt/NAI/LinuxShield/engine/dat), 197 extensions, 0 extra drivers 838|task.

в основном: это то, что называется:

$(date -d @\1) instead of $(date -d @\1561834555)

1 Ответ

1 голос
/ 02 июля 2019

sed никогда не видит $(date -d @\1) - оболочка выполнила подстановку этой команды до запуска sed.

Вы могли бы что-то вроде этого:

sed -Ee 's/([0-9]{10})/$(date -d @\1)/g' -e 's/^/echo "/' -e 's/$/"/' mac.txt | sh

(обратите внимание на одинарные кавычки, не позволяющие оболочке выполнять какие-либо расширения)

Однако , гораздо разумнее использовать язык со встроенными средствами даты.GNU awk:

gawk -F '|' -v OFS='|' '{
    for (i=1; i<=NF; i++)
        if ($i ~ /^[0-9]{10}$/)
            $i = strftime("%c", $i)
    print
}' mac.txt

Вероятно, Perl будет установлен:

perl -MPOSIX=strftime -pe 's{\b(\d{10})\b}{ strftime("%c", localtime $1) }ge' mac.txt
# or, this is more precise as it only substitutes *fields* that consist of a timestamp
perl -MPOSIX=strftime -F'\|' -lape '$_ = join "|", map { s/^(\d{10})$/ strftime("%c", localtime $1) /ge; $_ } @F' mac.txt
...