Как увидеть метки времени в истории Bash?

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

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

323
задан 22 June 2015 в 11:13

9 ответов

Нажмите 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 respectively
echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bashrc
source ~/.bashrc

Чтобы проверить эффекты, выполните:

history

Для получения дополнительной информации см. man bash или Индекс зоны доступа командной строки Bash для Linux .

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

381
ответ дан 22 June 2015 в 11:13

Откройте терминал 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/

88
ответ дан 22 June 2015 в 11:13

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

21
ответ дан 22 June 2015 в 11:13
  • 1
    У меня нет Dropbox fies в /var/lib/, но вместо этого двоичный файл в /usr/bin/dropbox, но никакая идея где файлы. Вы знаете, где файлы Dropbox могут быть? Как Вы находили путь? – Léo Léopold Hertz 준영 14 July 2015 в 12:38

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

echo 'HISTTIMEFORMAT="%Y%m%d %T "' >> /etc/profile.d/timestamp.sh
1
ответ дан 22 June 2015 в 11:13

Я знаю, я отвечаю на него очень поздно, но чтобы сделать это для всех пользователей, вы можете создать любой файл .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

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

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

enter image description here

0
ответ дан 8 October 2019 в 21:20

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

echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc
3
ответ дан 8 October 2019 в 21:20

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

$ 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 t
ttys003 Thu 28 Sep 2017 10:45:48+6.12H (1506613974)grep \ 755\  Qlog
ttys003 Thu 28 Sep 2017 10:45:48+6.15H (1506614092)grep \ 769\  Qlog
ttys003 Thu 28 Sep 2017 10:45:48+6.16H (1506614130)locate akd
ttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614159)less /System/Library/LaunchAgents/com.apple.akd.plist
ttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614172)mN -K PLIST
ttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614179)man -k plist
ttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614213)man swapllist

Не могу войти во все фон, поскольку жизнь слишком коротка (LITS), но вот мои заметки разработчика, когда я работал над этим. Это на macOS, так что особого gawk нет, но я использую 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
\#1502956374
man top
\#1502956600
top

As 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]|head
Works 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 terminal
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);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_ttys002

Works 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_ttys002

Do 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
0
ответ дан 5 January 2021 в 23:15

Моя работающая версия

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 см. Здесь

2
ответ дан 5 January 2021 в 23:15

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

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

3
ответ дан 5 January 2021 в 23:15

Другие вопросы по тегам:

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