Есть ли какой-нибудь способ узнать, в какое время были выполнены команды из истории bash? Мы можем видеть порядок, но есть ли какой-нибудь способ, которым я также могу получить время?
Итог: время выполнения в истории 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
команда.
источник: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
Я веду историю для каждого устройства 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 / .