Как увидеть время в файле ~/.bash_history

Вопрос или проблема

Я добавил время в файл ~/.bashrc, так что теперь он показывает время, когда я выполняю команду history, вот так:

  376  04/10/19 20:39:52 sudo cat ~/.bash_history
  377  04/10/19 20:40:04 date
  378  07/10/19 10:13:29 echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc
  379  07/10/19 10:13:38 source ~/.bashrc
  380  07/10/19 10:13:54 history
  381  07/10/19 10:20:08 sudo vim /home/subir/.bash_history 
  382  07/10/19 10:20:29 sudo nano /home/subir/.bash_history 
  383  07/10/19 11:34:20 cd ..
  384  07/10/19 11:34:34 find | grep .bash_history
  385  07/10/19 11:34:48 cat ./subir/.bash_history 
  386  07/10/19 11:37:32 history

Но когда данные этой сессии добавляются в файл ~/.bash_history, он показывает что-то вроде этого :

#1570201804
date
#1570423409
echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc
#1570423418
source ~/.bashrc
#1570423434
history
#1570423808
sudo vim /home/subir/.bash_history 
#1570423829
sudo nano /home/subir/.bash_history 

Что означают значения после # ?. Может кто-то помочь мне понять их значение или подсказать, как получить временную метку в файле ~/.bash_history.

Это временная метка Unix / эпохи – количество секунд, прошедших с 1 января 1970 года.

Если вы преобразуете это в дату и время, вы получите:

$ date -d @1570201804
Пт Окт  4 18:10:04 EAT 2019

В UTC это 10/04/2019 @ 3:10pm (UTC), но поскольку я нахожусь в Восточной Африке, разница во времени составляет +3, что приводит к 10/04/2019 @ 6:10pm (UTC)

Я полагаю, что ваш часовой пояс +5:30

Парсинг .bash_history с временными метками (awk).

Сначала я обрезаю поле по новой строке -F \\n и проверяю строки, начинающиеся с #epoch $0 ~ /^#[0-9]+/. Затем я обрезаю первый символ substr($1,2) перед форматированием строки эпохи strftime("%d/%m/%y %T"). В конце я печатаю первую часть без новой строки printf "%5d %s ", чтобы я мог извлечь следующую строку getline, которая содержит команды, и напечатать их на той же строке.

awk -F \\n '{ if ($0 ~ /^#[0-9]+/) {printf "%5d  %s ", ++i, strftime("%d/%m/%y %T", substr($1,2)); getline; print $0 }}' ~/.bash_history

Вывод:

    1  07/10/19 14:46:09 echo a
    2  07/10/19 14:46:28 echo b
    3  07/10/19 14:46:39 echo c

Парсинг и печать временных меток в .bash_history с использованием Perl.

Этот короткий “однострочный” скрипт Perl обнаруживает строки, начинающиеся с #, извлекает эпоху и выводит её как временную метку (в более универсальном формате) префикс (без новой строки). Корректный вывод зависит от того, что .bash_history находится в правильном формате.

perl -MTime::Piece -ne 'if(/^#(\d+)/) { print localtime($1)->strftime("%F %T %Z "); } else { print; }' ~/.bash_history

Вывод:

2024-10-13 23:49:54 MDT ls
2024-10-13 23:50:08 MDT who
2024-10-13 23:50:11 MDT exit

Ответ или решение

Вопрос о том, как увидеть временные отметки в файле ~/.bash_history, интересует многих пользователей Bash. Давайте детально разберем, как можно получить эти временные метки и выяснить, что означают значения, начинающиеся с знака #.

Понимание временных отметок в ~/.bash_history

Когда вы используете команду history в терминале Bash, если вы заранее настроили HISTTIMEFORMAT, вы можете увидеть исполняемые команды вместе с их временными отметками. Однако при сохранении истории в файл ~/.bash_history временные метки будут представлены в формате Unix Timestamp (эпохальное время) – это количество секунд, прошедших с 1 января 1970 года.

Запись в вашем ~/.bash_history могут выглядеть следующим образом:

#1570201804
date
#1570423409
echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc

Каждая строка, начинающаяся с #, содержит временную отметку, которая представляет собой количество секунд с начала эпохи. Ваша задача может заключаться в конвертации этих отметок в более понятную для чтения дату и время.

Конвертация Unix Timestamp в формат даты

Вы можете использовать команду date для преобразования Unix Timestamp в читаемую дату и время. Например:

date -d @1570201804

Этот пример вернет:

Fri Oct  4 18:10:04 EAT 2019

В UTC это будет 10/04/2019 @ 3:10pm (UTC). Обратите внимание, что ваше местное время может отличаться, поэтому учитывайте ваш часовой пояс.

Печать временных отметок вместе с командами в ~/.bash_history

Чтобы отобразить команды с соответствующими временными отметками, вы можете использовать несколько подходов с использованием утилит awk или perl. Приведем примеры для обоих инструментов.

Использование awk

Этот однострочный скрипт на awk позволит вам получить временные отметки вместе с командами:

awk -F \\n '{ if ($0 ~ /^#[0-9]+/) {printf "%5d  %s ", ++i, strftime("%d/%m/%y %T", substr($1,2)); getline; print $0 }}' ~/.bash_history

Использование perl

Также можно использовать perl, чтобы извлечь временные отметки и напечатать их в более удобном формате:

perl -MTime::Piece -ne 'if(/^#(\d+)/) { print localtime($1)->strftime("%F %T %Z "); } else { print; }' ~/.bash_history

Заключение

Теперь вы знаете, как вывести временные отметки для команд, записанных в файле ~/.bash_history. Используя команды date, awk, или perl, вы можете легко преобразовывать и форматировать единицы времени, делая вашу историю работы с Bash более информативной и полезной.

Если у вас остались вопросы о работе с ~/.bash_history или вы хотите обсудить более продвинутые аспекты использования Bash, пожалуйста, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...