Как преобразовать дату-время системного журнала [UTC] в эпоху?

Осторожно:

When using -d or --delete, care should be taken to insure against accidental data loss.

When used together with options -s or --symlink, a user could accidentally preserve a symlink while deleting the file it points to.

When specifying a directory more than once, all files will be listed as their own duplicates, leading to data loss

Сохранение избранного каталога стало проще по сравнению с версией 1.6.0 fdupes, в которой добавлена ​​опция -oили --order, позволяющая сортировать вывод по имени пути. (По умолчанию во всех версиях сортировка выполняется по времени модификации файла.)

Если вы используете абсолютные имена каталогов, вы можете гарантировать, что ваш любимый каталог всегда будет первым в выводе, добавив в начале дополнительный префикс /, чтобы он сортировался первым. Например, каталоги /a/aи //b/bбудут отсортированы так, что //bвыводится первым. (Это предполагает, что вы не используете имена каталогов, такие как /---mydir--/, которые будут сортироваться до//).

Затем вы можете использовать опцию -fили --omitfirst, чтобы подавить первый файл в списке совпадений, или с помощью(сначала прочитать руководство :это удалит файлы )--delete --noprompt, этот первый файл будет не быть удаленным.

Итак, командная строка в принципе

fdupes -r -f -o name //myfavourite/directory/path /dir2 /dir3...  >listtodel

Это просто создает список имен файлов для удаления, например, путем передачи списка через xargs. Для фактического удаления не -в интерактивном режиме добавьте параметры, указанные выше.

Обратите внимание: вы все равно можете найти файлы из вашего любимого каталога в выходных данных, если в этом каталоге есть дубликаты.

Таким же образом вы можете упорядочить каталоги в предпочтительном порядке сохранения, например.////dir1///dir2//dir3/dir4.

1
04.07.2019, 09:00
4 ответа

С помощью GNU dateвы можете запустить dateодин раз и получить ввод со стандартного ввода. Использование функции совместной обработки gawk для обработки всех дат по одному экземпляру awkи date:

% awk -v cmd='stdbuf -oL date +%s -f-' -F': ' 'BEGIN{OFS=FS} {print $2 |& cmd; cmd |& getline $2} 1' foo
1: 1562048059: %ASA-6-106015: <message>
2: 1562048089: %ASA-6-106015: <message>

Обратите внимание, что выводdateдолжен быть небуферизованным (, следовательно, stdbuf -oL), иначе сопроцесс зависнет.

2
27.01.2020, 23:22

Вот типичный способ преобразования названий месяцев в числа с использованием ассоциативного массива, где индекс — это название месяца, а значение — номер месяца. Например, mon["Jul"]равно 7. Это устанавливается один раз в блоке BEGIN.

awk 'BEGIN { 
       split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",months," ")
       for(i=1;i<=12;i++)mon[months[i]] = i }
     { m = $2; d = $3; y = $4; t = $5; gsub(":"," ",t)
       print mktime(y " " mon[m] " " d " " t) }'

Затем для каждой строки различные поля перестраиваются -в правильном порядке для mktime()и объединяются с промежуточными пробелами. Поле времени tимеет :, преобразованное в пространство. Приведенное выше просто печатает время эпохи, вам все равно нужно добавить остальные данные.

0
27.01.2020, 23:22

Возможно перл:

perl -MTime::Piece -i.bak -pe '
    if ( /([[:upper:]][[:lower:]]{2} \d{2} \d{4} \d\d:\d\d:\d\d)/ ) {
        $datetime = Time::Piece->strptime($1, "%b %d %Y %T");
        $epoch = $datetime->epoch;
        s/$timestamp/$epoch/
    }
' log_file
0
27.01.2020, 23:22

Как и утилита date(1), утилита gawkдля mktime()предполагает, что спецификация даты использует местное время.

Чтобы заставить его использовать UTC, следует использовать TZenvvar:

$ TZ=UTC gawk -F'[: ]+' '{sub(/([^:]+:){4} */, mktime(sprintf("%s %02d %s %d %d %d", $3, index("  JanFebMarAprMayJunJulAugSepOctNovDec",$1)/3, $2, $4, $5, $6))"\t"$7"\t"); print}'
1562080459      %ASA-6-106015   <message>
1562080489      %ASA-6-106015   <message>
1
27.01.2020, 23:22

Теги

Похожие вопросы