Вопрос или проблема
Я добавил время в файл ~/.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, пожалуйста, не стесняйтесь задавать их!