Как просмотреть временные метки в истории bash?

Есть ли какой-нибудь способ узнать, в какое время были выполнены команды из истории bash? Мы можем видеть порядок, но есть ли какой-нибудь способ, которым я также могу получить время?

Итог: время выполнения в истории Bash

Нажмите Ctrl+Alt+T чтобы открыть терминал, выполните одну из приведенных ниже команд:

HISTTIMEFORMAT="%d/%m/%y %T "  # for e.g. “29/02/99 23:59:59”HISTTIMEFORMAT="%F %T "        # for e.g. “1999-02-29 23:59:59”

Чтобы сделать изменение постоянным для текущего пользователя, запустите:

echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc  # or respectivelyecho 'HISTTIMEFORMAT="%F %T "' >> ~/.bashrcsource ~/.bashrc

Чтобы проверить эффекты, запустите:

history

Для получения дополнительной информации см. мужской удар или Индекс A-Z командной строки Bash для Linux.

Для команд, которые были запущены до HISTTIMEFORMAT было установлено, что текущий время будет сохранено как временная метка. Команды выполняются после HISTTIMEFORMAT был установлен, будет сохранена соответствующая временная метка.

Открытый терминалCtrl+Alt+T и бежать,

HISTTIMEFORMAT="%d/%m/%y %T "

затем,

history

Чтобы сделать изменения постоянными, выполните следующие действия,

gedit ~/.bashrc

вам нужно добавить нижеприведенную строку в файл .bashrc, а затем сохранить его,

export HISTTIMEFORMAT="%d/%m/%y %T "

выполните приведенную ниже команду для исходного файла .bashrc,

source ~/.bashrc

После этого беги history команда.

enter image description here

источник:http://www.cyberciti.biz/faq/unix-linux-bash-history-display-date-time/

Да, вы можете: если вы установите $HISTTIMEFORMAT, в .bash-history будет правильно помечено временем. Это не помогает с существующими .bash-history содержание, но поможет в будущем.

Вы увидите изменения при следующем входе в систему.

echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc

Меняющийся HISTIMEFORMAT у меня это не сработало, потому что я использую zsh.

Если вы хотите заставить его работать с zsh, вам просто нужно ввести :history -i

Моя версия, которая работает

HISTTIMEFORMAT="%F %T %z " history | grep 'your command'

ссылка. https://www.linuxuprising.com/2019/07/bash-history-how-to-show-timestamp-when.html

Напр.

╭you@your-server:/some/path ╰$ HISTTIMEFORMAT="%F %T %z "; history | grep 'some command' 1947  2019-12-17 15:54:34 +0800 ./some.sh 1948  2019-12-17 15:54:34 +0800 ./my-command

Просмотреть полный синтаксис для HISTTIMEFORMAT здесь

Чтобы включить временные метки истории для всех пользователей, создайте скрипт в /etc/profile.d :

echo 'HISTTIMEFORMAT="%Y%m%d %T "' >> /etc/profile.d/timestamp.sh

Я знаю, я отвечаю на него очень поздно, но чтобы сделать это для всех пользователей, вы можете создать любой .sh файл в /etc/profile.d и добавьте к нему следующую строку:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' >> /etc/profile.d/existing-foo-file.sh

Если вы не вошли в систему как root или суперпользователя, вам необходимо использовать tee команда, чтобы сделать это:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' | sudo tee /etc/profile.d/mytimestamp.sh

Если вы хотите добавить к любому существующему файлу, передайте -a флаг, чтобы tee команда:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' | sudo tee -a /etc/profile.d/mytimestamp.sh

enter image description here

Я веду историю для каждого устройства tty для каждого пользователя в .bash_profile и позволяю им расти большими. Иногда я хочу найти, где команда использовалась во всех этих файлах, скажем, с помощью grep.Я только что потратил некоторое время на то, чтобы получить то, что я хочу, с отметками времени в виде строк и заголовков для каждого файла плюс какой tty до времени, поэтому, если я буду использовать grepping, я увижу, где и когда используется:

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ($1 ~/^[0-9]+$/)){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=$1}; if ($1 ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, ($1-baseS)/3600, $1, $2; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003|head==>.bash_history_ttys003<==ttys003 Thu 28 Sep 2017 10:45:48+0.00H (1506591948)cp Qlog tttys003 Thu 28 Sep 2017 10:45:48+6.12H (1506613974)grep \ 755\  Qlogttys003 Thu 28 Sep 2017 10:45:48+6.15H (1506614092)grep \ 769\  Qlogttys003 Thu 28 Sep 2017 10:45:48+6.16H (1506614130)locate akdttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614159)less /System/Library/LaunchAgents/com.apple.akd.plistttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614172)mN -K PLISTttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614179)man -k plistttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614213)man swapllist

Не могу вдаваться во все подробности, так как жизнь слишком коротка (ЛИТС), но вот мои заметки разработчика, как я над этим работал. Это на macOS, так что особых проблем нет, но я использую date -r, где для вас это может отличаться, date -d?. Наслаждайтесь! :

How would I list all .bash_history* lines that grep finds together with the Unix timestamp as string?sample data lines in history (#unix time \n command)head .bash_history_ttys007\#1502956374man top\#1502956600topAs 2 lines looks like an awk task...Can't print FILENAME in begin as there is no current file at that stage :( so use FNR file rec numb check...awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r "$1"" | getline textDate; close(date);print textDate, $0}'awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r "$1"" | getline textDate; close(date);print textDate, $0}' .bash_history_ttys00[67]|headWorks but 3 lines per item as x0a line-returns are in there. WILL HAVE OTHER PROBLEMS TOO (later)...Progress by field sep on new lines and carve up filename for controlling terminalawk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){"date -r "$1"" | getline textDate; close(date);print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys00[67]|head$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){"date -r "$1"" | getline textDate; close(date -r "$1");print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys002Works OK but runs a bit slow: just do dates every once in a while? then if grep-ing will probably miss it...awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys002Do occasional date convert and retain string and offset secs? this does run much faster and requires timestamps to avoid # in commands. About 5s for 20,000 commands for me.awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ($1 ~/^[0-9]+$/)){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=$1}; if ($1 ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, ($1-baseS)/3600, $1, $2; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003

если вы используете zsh: history -E

Я поражен тем, насколько плохо это задокументировано как в Linux, так и в BSD на справочных страницах.

Не уверен, почему два ответа ниже считают необходимым рассказать вам, как открыть терминал…

Согласно блогу, на который ссылается @dog0 , временные метки, по-видимому, не сохраняются, если при выдаче команд не была установлена переменная HISTTIMEFORMAT. Другими словами, если вы не установили его, установка его сейчас не поможет вам получить временные метки ранее выданных команд.

Загляните в этот блог - Better Bash history | Arabesque / .