从bash历史记录中可以看到我什么时候执行了命令?我们可以看到订单,但是还有什么方法可以获取时间?

底线:Bash历史记录中的执行时间

评论

我很惊讶手册页中在Linux和BSD上对它的记录如此糟糕。

查阅此博客-sanctum.geek.nz/arabesque/better-bash-history。

如果您使用的是zsh:history -E

不知道为什么下面的两个答案会让您有必要告诉您如何打开终端。.

根据@ dog0引用的博客,除非发出命令时设置了HISTTIMEFORMAT变量,否则显然不会保存时间戳。换句话说,如果您没有设置它,那么现在进行设置将无法帮助您检索以前发出的命令的时间戳。

#1 楼

按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或Linux的Bash命令行。

对于在设置HISTTIMEFORMAT之前运行的命令,当前时间将保存为时间戳。设置HISTTIMEFORMAT后运行的命令将保存正确的时间戳。

评论


请注意,在为会话设置了HISTTIMEFORMAT后,这只会记录新历史记录项的时间戳,即您不能追溯使用此记录。这里的一些答案给人的印象是history命令立即显示带有时间戳的条目

–路易丝·马多克斯(Louis Maddox)
16-2-20在20:58



@Jamil:对于遵循ISO标准的人,日期部分为“%y-%m-%d”;)

–Gauthier
16-3-31在11:03

只是给zsh用户的注释-与许多内置函数不同,它并不镜像bash。改为查看此:unix.stackexchange.com/questions/103398/…

– Sridhar Sarnobat
16年8月30日在21:59

@Gauthier-实际上,仅将%F用作ISO日期;-) man7.org/linux/man-pages/man3/strftime.3.html

– brianmearns
18年7月11日在19:34



奇怪的是,这确实对我来说具有追溯力-在我明确设置此环境变量之前,我能够查看历史记录项的时间戳。那可能是因为HISTTIMEFORMAT之前被设置为空字符串,还是类似的东西?

– ijoseph
20-10-28在17:22



#2 楼

打开终端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/

评论


感谢您的回答。\这将是永久性的更改吗?

–rɑːdʒɑ
2013年12月15日12:06



嘿,我正在OS X和Windows(通过MINGW)中进行此操作,并将其添加到.bash_profile中,profile和rc之间有什么区别?

–LasagnaAndroid
2015年10月1日在17:28

HISTTIMEFORMAT =“%d /%m /%y%T”的历史记录

–Alex78191
20 Mar 25 '20在11:06

#3 楼

是的,您可以:如果设置$HISTTIMEFORMAT,则.bash-history将带有正确的时间戳。这对现有的.bash-history内容无济于事,但将来会有所帮助。

评论


您可以扩大它的清晰度吗?

–rɑːdʒɑ
2013年12月15日12:06

对上一篇文章的更正:设置HISTTIMEFORMAT可以显示时间戳...甚至存在。我最喜欢的是:HISTTIMEFORMAT ='%F%T',因为它与您居住的国家无关紧要...每个人都立即知道现在几点。 :)

–user491029
16年1月8日在22:43

我设置了$ HISTTIMEFORMAT,即使在此命令之前,我也获得了今天的时间。

– YasinOkumuş
17年9月18日在13:40

@ user491029“ ...甚至存在”。这是事实,但具有误导性。至少在ubuntu 14.04上,设置了HISTTIMEFORMAT后,它确实开始显示所有历史记录条目的时间戳,但是看起来在当前会话之前运行的任何命令的时间戳都是当前会话的登录时间戳。

– jbobbins
19年6月27日在19:52

#4 楼

更改HISTIMEFORMAT对我不起作用,因为我使用的是zsh。

如果要使其与zsh一起使用,只需键入:
history -i

#5 楼

您将在下次登录时看到更改。

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


#6 楼

适用的我的版本

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的完整语法

#7 楼

要为所有用户启用历史记录时间戳,请在/etc/profile.d中创建脚本:

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


评论


这对于通过GUI登录的用户可能不起作用,因为默认终端不会运行登录Shell。 /etc/bash.bashrc将是一个更好的地方。

–muru
18-2-22在10:12



确保/etc/profile.d/timestamp.sh的权限为“ 644”,以便history命令显示所有用户的时间戳。

– sjethvani
20年8月20日在13:29

#8 楼

我知道,我回答得很晚,但是要为所有用户执行此操作,您可以在.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




评论


您好Shashank,感谢您添加答案,但是这个答案与其他答案有何不同?如果您的答案是完全不同的,那么我们很高兴收到,但是如果没有,您可以改善现有的答案。

–rɑːdʒɑ
19年7月22日在5:03

嗨,谢谢你的评论。这与其他方式在以下方面有所不同:1.他们中有些人提到为所有用户创建,但没有人提及在/etc/profile.d中创建/解释任何文件名。 timestamp.sh看起来非常接近技术性(因此会造成混乱),因此我使用了现存的-foo-file.sh(foo-bar概念)名称。 2.没有人提及与非root用户一起使用它。因此,我举了一个使用sudo的示例。 3.第三个示例改进了附加到现有文件的第二个示例。由于linux / unix初学者可以解决此问题,因此我进行了详细说明。

– Shashank Agrawal
19年7月22日在5:32



请注意:确保/etc/profile.d/timestamp.sh的权限为'644',以便history命令显示所有用户的时间戳。在我的情况下,'/etc/profile.d/timestamp.sh'的许可为'640',因为所有者以外的用户没有看到时间格式的历史记录。

– sjethvani
20年8月20日在13:38

谢谢@sjethvani

– Shashank Agrawal
20年8月20日在13:55

#9 楼

我在.bash_profile中维护每个用户的每个tty设备的历史记录,并让它们变大。有时候我想使用grep查找所有文件中使用的命令的位置。
我花了一段时间了解我想要的方式,其中时间戳记是每个文件的字符串和标题,以及时间之前的tty因此,如果我刻薄,我会看到使用的时间和地点:

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ( ~/^[0-9]+$/)){Cmd="date -r """; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=}; if ( ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, (-baseS)/3600, , ; 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上,因此没有特殊的问题,但是我确实使用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 """ | getline textDate; close(date);print textDate, q4312078q}'
awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r """ | getline textDate; close(date);print textDate, q4312078q}' .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 ( ~/^[0-9]+$/){"date -r """ | getline textDate; close(date);print  tty, substr(textDate,1,length(textDate)-1) ,"(" ")", } }' .bash_history_ttys00[67]|head

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ( ~/^[0-9]+$/){"date -r """ | getline textDate; close(date -r "");print  tty, substr(textDate,1,length(textDate)-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{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ( ~/^[0-9]+$/){Cmd="date -r """; Cmd | getline textDate; close(Cmd);print  tty, substr(textDate,1,length(textDate)-1) ,"(" ")", } }' .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) && ( ~/^[0-9]+$/)){Cmd="date -r """; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=}; if ( ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, (-baseS)/3600, , ; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003