Linux 上运行shell命令,系统会记录一定数量的命令,使用history命令可以快速查找到之前使用过的某个历史命令,并快速运行这条命令。

常用的history功能

1)列出历史命令

输入history即可,默认最多1000条,后面介绍如果修改条数。

[root@localhost ~]# history 
   78  vi server.xml 
   79  pwd
   80  vi server.xml 
   81  cd ../
   82  ls
   83  cat database-init-sql-list.txt 
   84  ls
   85  cd webapps/
   86  ls
   87  cd website-webapp/
   88  ls
   89  cd ../../
   90  ls
   91  cd database

只显示最近运行的10条命令

[root@localhost ~]# history 10
 1069  find / name=template
 1070  cd /root/hbk/
 1071  ps -ef|grep java
 1072  kill -9 2523 
 1073  cd tomcat-8061-publishweb/webapps/
 1074  ../bin/startup.sh 
 1075  tailf ../logs/catalina.out 
 1076  cd
 1077  history 
 1078  history 10

2)运行某条历史命令

从上面可以看到每一条历史命令都有一个编号,运行某条历史命令,只需要执行!编号即可。最后一条可以使用!!运行。

[root@localhost ~]# !1071
ps -ef|grep java
root       5175      1  1 09:44 pts/2    00:01:19 java -Djava.util.logging.config.file=/root/hbk/tomcat6-8079-manageweb/conf/logging.properties -server -Xms512m -Xmx1024m -XX:PermSize=512M -XX:MaxPermSize=1024m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/root/hbk/tomcat6-8079-manageweb/endorsed -classpath /root/hbk/tomcat6-8079-manageweb/bin/bootstrap.jar -Dcatalina.base=/root/hbk/tomcat6-8079-manageweb -Dcatalina.home=/root/hbk/tomcat6-8079-manageweb -Djava.io.tmpdir=/root/hbk/tomcat6-8079-manageweb/temp org.apache.catalina.startup.Bootstrap start
root       5502      1  1 09:48 pts/1    00:01:24 java -Djava.util.logging.config.file=/root/hbk/tomcat-8061-publishweb/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1024m -XX:PermSize=512M -XX:MaxPermSize=1024m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/root/hbk/tomcat-8061-publishweb/endorsed -classpath /root/hbk/tomcat-8061-publishweb/bin/bootstrap.jar:/root/hbk/tomcat-8061-publishweb/bin/tomcat-juli.jar -Dcatalina.base=/root/hbk/tomcat-8061-publishweb -Dcatalina.home=/root/hbk/tomcat-8061-publishweb -Djava.io.tmpdir=/root/hbk/tomcat-8061-publishweb/temp org.apache.catalina.startup.Bootstrap start
root      15464   1949  0 11:56 pts/1    00:00:00 grep --color=auto java

3)显示历史命令执行时间戳

加上时间和用户

export HISTTIMEFORMAT="%F %T `whoami` "

显示如下:

[root@localhost ~]# history 10
 1085  2019-01-03 12:01:23 root cd hbk/
 1086  2019-01-03 12:01:24 root ls
 1087  2019-01-03 12:01:43 root vi .bashrc 
 1088  2019-01-03 13:38:15 root export HISTTIMEFORMAT="%F %T `whoami`"
 1089  2019-01-03 13:38:18 root history 
 1090  2019-01-03 13:38:34 root export HISTTIMEFORMAT="%F %T `whoami` "
 1091  2019-01-03 13:38:36 root history 
 1092  2019-01-03 13:39:51 root export HISTTIMEFORMAT="%F %T `whoami` "
 1093  2019-01-03 13:39:52 root cd
 1094  2019-01-03 13:39:57 root history 10

也可以进一步添加ip

[root@localhost ~]# who -u am i
root     pts/1        2019-01-03 09:06   .          1949 (192.168.8.133)

想办法拿到192.168.8.133地址

[root@localhost ~]# who -u am i 2>/dev/null
root     pts/1        2019-01-03 09:06   .          1949 (192.168.8.133)

使用awk进行提取

[root@localhost ~]# who -u am i 2>/dev/null|awk '{print $NF}'
(192.168.8.133)

NF其实是number of field, 即整行域的总数,print就是打印最后一个域
NF是指awk正在处理的记录包含几个域(字段),这于域分隔符有关,默认为空
%F 完整日期格式,等价于 %Y-%m-%d
%T 时间,等于%H:%M:%S

写在配置文件中,使之永久生效
编辑 /etc/profile

USER_IP=`who -u am i 2>/dev/null|awk '{print $NF}'`
export HISTTIMEFORMAT="[%F %T `whoami` $USER_IP]"

[root@localhost ~]# source /etc/profile

效果:

[root@localhost ~]# history 5
 1097  [2019-01-03 13:43:11 root (192.168.8.133)]who -u am i 2>/dev/null
 1098  [2019-01-03 13:44:26 root (192.168.8.133)]who -u am i 2>/dev/null|awk '{print $NF}'
 1099  [2019-01-03 13:47:17 root (192.168.8.133)]vi /etc/profile
 1100  [2019-01-03 13:50:21 root (192.168.8.133)]source /etc/profile
 1101  [2019-01-03 13:50:40 root (192.168.8.133)]history 5

4)修改历史记录保留的条目

默认显示1000条记录,如果想增大,可以修改HISTSIZE环境变量,同理,要永久生效的话,需要写入配置文件中。
默认是1000,如下所示

[root@localhost ~]# echo $HISTSIZE
1000

也可以直接使用vi,如下通过sed替换s参数,技巧嘿嘿

[root@localhost ~]# sed -i 's/^HISTSIZE=1000/HISTSIZE=2000/' /etc/profile
[root@localhost ~]source /etc/profile   //使其立即生效

5)清空历史命令记录

执行history -c将清空历史命令记录

[root@localhost ~]# history -c
[root@localhost ~]# history 
  108  [2019-01-03 14:04:23 root (192.168.8.133)]history