Все остальные ответы порождают новый процесс date
для каждой даты эпохи, которую необходимо преобразовать. Это может потенциально увеличить накладные расходы на производительность, если ваш ввод большой.
Однако у GNU date есть удобная опция -f
, которая позволяет одному экземпляру процесса date
непрерывно читать входные даты без необходимости в новой вилке. Таким образом, мы можем использовать sed
, paste
и date
таким образом, чтобы каждый из них создавался только один раз (2x для sed
) независимо от размера ввода:
$ paste -d '\n' <( sed '2~2d;y/#/@/' epoch.txt | date -f - ) <( sed '1~2d' epoch.txt )
Wed Aug 24 07:09:55 PDT 2016
ll /data/holding/email
Wed Aug 24 07:11:46 PDT 2016
cat /etc/rsyslog.conf
Wed Aug 24 07:13:58 PDT 2016
ll /data/holding/web
$
sed
соответственно в основном удаляют четные и нечетные строки ввода; первый также заменяет #
на @
, чтобы указать правильный формат временной метки эпохи. sed
затем передается по конвейеру date -f
, который выполняет необходимое преобразование даты для каждой строки ввода, которую он получает. пасты
. Конструкции представляют собой подстановки процесса bash , которые эффективно обманывают вставку, заставляя думать, что она считывает данные из заданных имен файлов, тогда как на самом деле она считывает выходные данные, переданные из команды внутри. -d '\ n'
указывает paste
разделять четные и нечетные выходные строки символом новой строки. Вы можете изменить (или удалить) это, если, например, вы хотите, чтобы метка времени находилась в той же строке, что и другой текст.
Обратите внимание, что в этой команде есть несколько GNUisms и Bashisms. Это несовместимо с Posix, и не следует ожидать, что его можно будет переносить за пределы мира GNU / Linux. Например, date -f
делает что-то еще в варианте OSX BSD date
.