History со временем linux

How to see time stamps in bash history?

Is there any way I can see at what time the commands were executed from the bash history? We can see the order but is there any way I can get the time also? Bottom-Line: Execution time in the Bash history

According to the blog referenced by @dog0 , timestampse apparently do not get saved unless the HISTTIMEFORMAT variable was set when commands were issued. In other words, if you didn’t have it set, setting it now will not help you retrieve timestamps of previously issued commands.

9 Answers 9

Press Ctrl + Alt + T to open a terminal, then run one of the commands below:

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” 

To make the change permanent for the current user run:

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

For commands that were run before HISTTIMEFORMAT was set, the current time will be saved as the timestamp. Commands run after HISTTIMEFORMAT was set will have the proper timestamp saved.

Note that this will only record timestamps for new history items, after HISTTIMEFORMAT is set for sessions, i.e. you can’t use this retrospectively. Some answers here give the impression the history command immediately shows timestamped entries

Just a note to zsh users out there — unlike many builtins it does not mirror bash. See this instead: unix.stackexchange.com/questions/103398/…

Weirdly, this did appear to work for me retrospectively — I was able to see the timestamps of history items prior to my explicit setting of this environment variable. That may be because HISTTIMEFORMAT was set to an empty string before, or something similar?

Open terminal Ctrl + Alt + T and run,

To make the changes permanent follow the below steps,

you need to add the below line to .bashrc file and then save it,

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

run the below command to source .bashrc file,

After that run history command.

enter image description here

Hey, I’m doing this in OS X and Windows (through MINGW), and I’m adding it into .bash_profile, what’s the diff between profile and rc?

Yes, you can: if you set $HISTTIMEFORMAT , the .bash-history will be properly timestamped. That doesn’t help with existing .bash-history content, but will help in the future.

Correction to previous post: Setting HISTTIMEFORMAT enables the display of the timestamps. even existing. My favorite is:HISTTIMEFORMAT=’%F %T ‘ as it matters not from which country you reside. everyone knows immediately what time it is. 🙂

@user491029 «. even existing». This is true, but misleading. On ubuntu 14.04, at least, it did start showing timestamps for all history entries once I had set HISTTIMEFORMAT, but it looks like the timestamps for any command run before the current session were the login timestamp of the current session.

Changing HISTIMEFORMAT didn’t work for me, because I’m using zsh.

If you want to make it work with zsh, you just have to type : history -i

Читайте также:  Linux view folder size

You ‘ll see changes on next login.

echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc 
HISTTIMEFORMAT="%F %T %z " history | grep 'your command' 
╭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 

View full syntax for HISTTIMEFORMAT here

To enable history timestamps for all users, create a script in /etc/profile.d :

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

This will likely not work for users logging in via the GUI, since the default terminal will not run login shells. /etc/bash.bashrc would be a better place.

Make sure permission of /etc/profile.d/timestamp.sh is ‘644’ , so that history command shows timestamp for all users .

I maintain a history per tty device per user, in .bash_profile, and let them grow large. Sometimes I want to find where a command was used across all those files using grep, say. I have just spent a while getting how I want, with time stamps as strings and headers for each file plus which tty before the time so if I am grepping I will see where and when used:

$ awk 'BEGIN " FILENAME "; if ((ln==0) && ($1 ~/^1+$/)); if ($1 ~/^1+$/) else >> ' .bash_history_ttys003|head ==>.bash_history_ttys003 

Can't go into all the background as life is too short (LITS) but here are my dev notes as I worked it up. This is on macOS so no special gawk but I do use date -r where it may differ for you, date -d?. Enjoy! :

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 ; "date -r "$1"" | getline textDate; close(date);print textDate, $0>' awk 'BEGIN ; "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 " FILENAME "; if ($1 ~/^7+$/) >' .bash_history_ttys00[67]|head $ awk 'BEGIN " FILENAME "; if ($1 ~/^1+$/) >' .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 " FILENAME "; if ($1 ~/^6+$/) >' .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 " FILENAME "; if ((ln==0) && ($1 ~/^6+$/)); if ($1 ~/^2+$/) else >> ' .bash_history_ttys003 

Источник

История команд Linux

В терминале Linux, кроме всего прочего, есть одна замечательная вещь. Это история команд Linux. Все команды, которые вы вводите во время работы сохраняются и вы можете найти и посмотреть их в любой момент. Также можете вернуться на несколько команд чтобы не набирать недавно выполненную команду заново.

В этой небольшой статье мы рассмотрим как пользоваться историей команд Linux, как ее настроить, а также рассмотрим полезные приемы, которые могут помочь вам в работе.

История команд Linux

Большинство задач, связанных с историей команд, мы будем выполнять либо с помощью команды history, либо с помощью оболочки. В истории хранится последняя 1000 команд, которые вы выполняли. Чтобы посмотреть всю историю для этого терминала просто запустите команду history без параметров:

Для дополнительных действий с историей вам могут понадобиться опции. Команда history linux имеет очень простой синтаксис:

$ history опции файл

В качестве файла можно указать файл истории. По умолчанию история для текущего пользователя хранится в файле ~/.history, но вы можете задать, например, файл другого пользователя. А теперь рассмотрим опции:

  • -c - очистить историю;
  • -d - удалить определенную строку из истории;
  • -a - добавить новую команду в историю;
  • -n - скопировать команды из файла истории в текущий список;
  • -w - перезаписать содержимое одного файла истории в другой, заменяя повторяющиеся вхождения.

Наиболее полезной для нас из всего этого будет опция -c, которая позволяет очистить историю команд linux:

Так вы можете посмотреть только последние 10 команд:

А с помощью опции -d удалить ненужное, например, удалить команду под номером 1007:

Если вы хотите выполнить поиск по истории bash, можно использовать фильтр grep. Например, найдем все команды zypper:

На самом деле работать с историей еще более просто с помощью оболочки, возможно, вы уже используете многие ее функции, но о некоторых точно не знаете. Рассмотрим их:

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

Вы можете выполнить последнюю команду просто набрав "!!". Также можно выполнить одну из предыдущих команд указав ее номер "!-2"

Чтобы выполнить поиск по истории прямо во время ввода нажмите Ctrl+R и начните вводить начало команды.

Если вы знаете, что нужная команда была последней, которая начиналась на определенные символы, например, l, то вы можете ее выполнить, дописав "!l":

Если нужная команда последняя содержала определенное слово, например, tmp, то вы можете ее найти, использовав "!?tmp":

Если вы не хотите, чтобы выполняемая команда сохранилась в истории просто поставьте перед ней пробел.

Таким образом, вы можете очень быстро отыскать нужную команду, если помните как она была написана. История команд bash хранит очень много команд и этого вполне достаточно для комфортной работы.

Настройка истории Linux

Linux - очень настраиваемая и гибкая система, поэтому настроить здесь можно все, в том числе и историю. По умолчанию выводится только номер команды, но вы можете выводить и ее дату. Для этого нужно экспортировать переменную HISTORYFORMAT вместе нужным форматом:

export HISTTIMEFORMAT='%F %T '
$ history

Для форматирования можно использовать такие модификаторы:

Вы можете указать какие команды не стоит отображать, например, не будем выводить ls -l, pwd и date:

export HISTIGNORE='ls -l:pwd:date:'

Также можно отключить вывод одинаковых команд:

Существует два флага, ignoredups и ignorespace. Второй указывает, что нужно игнорировать команды, начинающиеся с пробела. Если вы хотите установить оба значения, используйте флаг ignoreboth. Используйте переменную HISTSIZE, чтобы установить размер истории:

По умолчанию история сохраняется для каждого терминала отдельно. Но если вы хотите чтобы все ваши команды немедленно синхронизировались между всеми терминалами, то это очень просто настроить. Добавьте такую переменную:

export PROMPT_COMMAND="$history -a; history -c; history -r;"

Для тестирования работы вы можете набирать эти команды прямо в терминале и сразу видеть результат, но для сохранения добавьте нужные строки в ваш ~/.bashrc. Например:

export PROMPT_COMMAND="$history -a; history -c; history -r;"
$ export HISTCONTROL=ignoredups
$ export HISTTIMEFORMAT='%F %T '

Готово, теперь осталось сохранить изменения и перезапустить ваши терминалы. Теперь ваша история будет выводить дату, игнорировать дубли и синхронизироваться между терминалами.

Выводы

В этой статье мы рассмотрели что такое история команд linux, как с ней работать, как применяется команда history linux и какие настройки можно использовать для более комфортной работы. Если у вас остались вопросы, спрашивайте в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Linux Command History with date and time

I wants to check on my linux system when which command was fired - at which date and time. I fired commands like this:

It shows me the last 50 commands history, but not with date and time at which it was fired. Does any one knows how to do it?

Setting HISTTIMEFORMAT changes format for future commands, so that timestamp will be saved for them. Timestamps for commands fired before setting HISTTIMEFORMAT were not saved in histfile, so there's no way to show them.

7 Answers 7

echo 'export HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bash_profile source ~/.bash_profile 

It shows today's date and time for all previously executed commands which is wrong, is there any way I can get the correct date and time when previous commands were executed?

You're going to want this in all of your interactive shells, not just login shells. As such, you want to set HISTTIMEFORMAT in ~/.bashrc rather than in ~/.bash_profile

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

You can adjust the format to your liking, of course.

This does not show date and time of command when it was fired. Lets say command was fired yesterday but if I write as you suggested it will show todays date. Which I do not want.

@RJ07: This won't work on commands executed in the past, since no timestamp was saved for them. However, if you add this to your bash.src, the timestamps will be saved for all future bash inputs.

OK, this only works for THE FUTURE. As Rushvi says it doesn't update past histories. still ok though.

In case you are using zsh you can use for example the -E or -i switch:

If you do a man zshoptions or man zshbuiltins you can find out more information about these switches as well as other info related to history:

Also when listing, -d prints timestamps for each event -f prints full time-date stamps in the US `MM/DD/YY hh:mm' format -E prints full time-date stamps in the European `dd.mm.yyyy hh:mm' format -i prints full time-date stamps in ISO8601 `yyyy-mm-dd hh:mm' format -t fmt prints time and date stamps in the given format; fmt is formatted with the strftime function with the zsh extensions described for the %D prompt format in the section EXPANSION OF PROMPT SEQUENCES in zshmisc(1). The resulting formatted string must be no more than 256 characters or will not be printed -D prints elapsed times; may be combined with one of the options above 

Источник

Оцените статью
Adblock
detector