Linux命令高效操作(2)-妙用历史命令

本希望把Linux高效操作这一个系列文章命名为unix-like命令高效操作,但是后来发现本人并没有在多数的unix-like平台实践过。本着实践第一的精神,就不把话题扯那么大了,决定更名为“linux命令高效操作”,哈哈。废话不多说,我的实验系统:Linux之centos7。

今天我想聊的是每个用过Linux命令操作的同学或许都知道的一个存在:历史命令。什么是历史命令呢?通俗简单的说,就是你执行过的命令的历史。大家最常见的用处就是使用上下方向键进行命令的切换喽!刚接触命令行操作的同学感觉这就是福祉啊,但是用的久了,会觉得每次上下键翻阅查看太烦人。如果历史命令支持搜索该有多棒。还有些命令我之前明明执行过了为什么找不到呢?甚至还有很多其他更高的要求。

可以告诉你,这些要求都可以做到,甚至可以做的更牛逼。

开始之前,首先按如下顺序输入一些命令:

$ cd /home/poloxue/Public/

$ mkdir Work

$ cd Work

$ mkdir web

$ mkdir app

$ mkdir logs

$ cd logs

$ cp /var/log/openvpnas.log .

执行结束之后。

首先学习体验一下历命令史的查看,增加和删除等基本操作。

一 如何查看历史命令

1. 简单查阅

首先明确一点,历史命令是按照执行时间先后顺序进行排序的。

简单查看:上下键查阅历史命令;

除了上下键操作查看历史命令之外,在上一篇文章也介绍了两个快捷键:

ctrl+p 上查历史命令,同向上键,prev;

ctrl+n 下查历史命令,同向下键,next;

这种方式查阅最近几条执行命令相对效率较高,使用频率最到。但是对于较早时间执行的命令查阅相当耗时;

2. 使用history命令查询

history命令是和历史命令息息相关的一个命令,作用对象就是历史命令。看一下history命令怎么查询最近使用的命令记录?

history [n] 展示最近执行的n条记录,例如:

$ history 3

按时间倒序展示最近历史命令,结果如下:

mkdir logs

cd logs

cp /var/log/openvpnas.log .

如果没有追加任何的参数,则展示全部历史记录;

3. 历史命令搜索

history命令本身好像不支持搜索,两种方式可以实现这个功能:ctrl+r快捷键和history+grep组合命令。

a. ctrl+r搜索查看功能:

假设你搜索最近关于cp的操作,如下:

按下ctrl+r快捷键之后输入cp,效果如上图,此时按下enter键选中执行。

ctrl+r搜索结果为最近执行的符合搜索要求的命令。

b. history+grep搜索查看功能:

为什么需要?ctrl+r只能搜索最近执行的命令,如果需要所有满足匹配的历史记录,或者不能完整记住有关单词的情况下,history+grep的组合可以满足你。

例如,搜索所有关于openvpn的操作。

$ history | grep openvpn

history列出有所历史记录,grep支持强大的搜索功能,支持通配符,正则等高级特性,可以基本满足你的任何需求;

二 记录历史命令(写入与删除

个人认为,历史命令存在于两个区域,一是每开启一个新终端都会加载的HISTFILE文件,二是当前会话终端开启后执行的命令,这些命令可以理解为存储在内存中,但尚未写入HOSTFILE文件中的部分。

1. 默认效果

当当前会话终端关闭后,会自动将此会话终端执行的历史命令追加到$HISTFILE文件中。

2. 手动写入

除了默认效果,需要关闭终端才能将当前终端的历史命令写入到$HISTFILE中,执行如下命令:

$ history -w

效果与关闭终端效果一样,会将当前终端执行的没有写入到$HISTFILE文件中的历史命令追加到$HISTFILE中。

3. 删除指定历史命令

$ history -d 1

删除指定历史命令位置的命令,history -d n。

如果历史记录如上所示,执行history -d 1会将mkdir public这条记录删除。

4. 清空历史命令

history -c 会清空当前会话终端中的所有历史命令,重新记录。

注意:此时只是改变了当前会话终端中的记录,并没有记录到$HISTFILE文件中。

三 哪些配置项

1. 关于HISTSIZE与HISTFILESIZE

HISTSIZE 定义了控制台输出命令记录数量;

HISTFILESIZE 定义了HISTFILE文件中存放命令记录的数量;

$ echo $HISTSIZE

$ echo $HISTFILESIZE

可以看到打印的数值,默认配置HISTSIZE与HISTFILESIZE大小一样,当历史命令超过规定数量会自动覆盖,为了更好的利用和防止历史命令,可以将HISTFILESIZE与HISTSIZE调整的大一些;

$ vim .bashrc

在/$HOME/.bashrc添加如下内容:

export HISTFILESIZE=3000

export HISTSIZE=3000

2. 关于HISTTIMEFORMAT显示命令执行时间戳

默认情况下,执行history会输出记录编号和历史命令。如果为了审查的目的,想知道某条命令具体的执行时间,配置HISTTIMEFORMAT。可以配置HISTTIMEFORMAT为‘%F %T ‘

$ export HISTTIMEFORMAT=‘%F %T ‘

此时执行history命令,如下效果:


从上图可以看出,除了显示记录编号与历史命令之外,还多了命令执行时间一列。如果此功能经常用到,可以将export HISTTIMEFORMAT=‘%F %T ‘ 添加到/$HOME/.bashrc文件中。

3. HISTCONTROL与HISTIGNORE

HISTCONTROL与HISTIGNORE可提高文件有限的利用率。通过上面的了解,我们知道历史命令的记录数量是有上限的。为了提高历史命令的利用,可以使用两种方式:一是增加历史命令的HISTFILESIZE和HISTSIZE,二是减少无用历史命令记录,增加固定大小HISTFILESIZE的空间利用率;

第一种方式就不做介绍,第二种方式就使用两个配置项:HISTCONTROL与 HISTIGNORE。

a. 去除连续重复命令

设置HISTCONTROL为ignoredups,如下:

$ export HISTCONTROL=ignoredups

效果如下:

从上图可以看出,当HISTCONTROL为ignoredups,重复两次的pwd会合并为一条。但是从上图中可以看出,对于不连续的history仍然保留了两条,下面解决一下这个问题。

b. 去除全局重复历史命令

上面的示例提出了一个问题,HISTCONTROL为ignoredups并没有去除非连续的重复命令。下面将HISCONTROL设置为erasedups,如下:

$ export HISTCONTROL=erasedups

效果如下:

从上图可以看出,虽然我执行了两次pwd,而且是非连续的,但是只保存了一条。这样就可以很大限度高效的使用历史命令有限的空间了,但是如果你有需求要保留每次的命令执行情况方便后面审查,那就不能干了。不过本人目前还没有遇到这样的情况,可能经验太少吧。

c. 空格隐去无用历史命令

有没有这样一种需求?有些命令我执行了,但是我不想让别人知道。实现这种需求有两种方式:一种是通过配置空格隐去无用历史命令,二是通过配置指定某些命令需要隐去。好,第二种放在下面一点说明,先说第一种。

首先,进行设置HISTCONTROL为ignorespace,如下所示:

$ export HISTCONTROL=ignorespace

作用是所执行命令以空格开头,不做历史记录。效果如下:

上图可以看出,pwd和cd以空格开头,而history和ls都是正常输入,此时历史命令中只有history与ls的记录,没有记录pwd与cd。不过,个人感觉这种方式不是很好且具有不可控性,有可能产生误操作导致想要的历史命令丢失历史等情况。那有没有办法指定固定的某些命令被忽略,比如ls, history这些不想保留在历史中。继续往下看...

d. 指定忽略的命令

为了实现指定命令忽略,需要另外一个配置项:HISTIGNORE。如需要隐去ls, ls -l,pwd, history的执行记录,可以通过如下设置:

$ export HISTIGNORE="pwd:ls:ls -l:history"

效果如下:

上图执行了history, pwd, ls -l, ls Public,通过历史命令查看发现只有ls Public/ 被记录了下来。突然觉得历史命令真的好强大,有效利用可以减少无用历史命令的存储。不过,具体省略哪些命令,要因人具体情况而定,也不要省略太多的命令。

4. 配置HISTFILE

通过配置HISTFILE可以改变记录历史命令的文件文件,默认/$HOME/.bashrc。这个就不多说了,我个人基本不会改变此文件位置。

四 利用历史命令快速编辑

上面说了那么多关于历史命令的内容,目的是为了其更高效的使用。最简单的使用场景就是通过上下手动查询的方式,这就不多说了。

下面看些更牛的用法,来真正提高你的命令操作效率:

1. 快速指定历史命令

快速选中指定命令,一种是使用 ! ,通过命令执行顺序编号或者通过命令开头选中,二可以通过ctrl+r搜索快速选中,前面已作过介绍,不多说。下面看看第一种情况,假设此刻历史命令如下:

直接示例说明:

$ !1                   // 执行命令为ls public

$ !-1                  // 执行命令为history

$ !!                    // 等同于!-1

$ !export          // 执行命令为export HISTCONTROL=erasedups

从上面可以看出,!的几种常见用法。

!n    指定编号命令

!-n   倒序n处命令

!!      !-1的简写,也就是最近的一条命令

!str   以str开头的最近一条命令,不过这种方式好像str中不能存在空格,可以使用ctrl+r快捷键代替。

2. 快速选中指定参数

通常在执行命令时,参数的复杂度都大于命令自身。如果能够实现快速选中命令的某个参数那就非常cool了。非常幸运,此要求的确可以做到。假设历史命令如下:

示例说明:

a. 引用某命令的第一个参数

例如,引用第三条命令的第一个参数

$ ls -l !3:^

上述命令的效果相当于ls -l example01

例如,引用最新一条以export开头的命令的第一个参数

$ ls -l !export:^

效果相当于ls -l HISTCONTROL=erasedups

记住一个简写,最近一条命令的第一个参数!!:^,简写!^

b. 引用某条命令的最后一个参数

例如,引用第三条命令的最后一个参数

$ ls -l !3:$

效果相等于ls -l Public/

对于引用最新一条命令的最后一个参数同样也有!!:$和!$两种方式。

c. 引用命令任意位置的参数

除了引用像开头结尾这种特殊位置参数外,同样也支持任意位置参数的引用。

还是以上图中的第三条命令为例,现在我希望引用此命令的第二个参数:

$ ls -l !3:2

如上面所示命令,此时的!3:2为example02。以此类推,简单测试一下我们可以知道,!3:0为ls, !3:1为example01, !3:3为Public/。由此可以得出,分号之后的数字指定的就是命令参数的位置,从0计数。

d. 关于引用命令参数任意区间列表

除了指定某一个参数之外,选择参数时,我们还可以指定参数区间,如选择1-2位置的参数,开头至结尾处的参数等。格式:cmd:offset1-offset2。

以第三条历史命令为例,如下:

$ echo !3:^-$    // 打印全部参数列表,即example01 example02 Public/

$ echo !3:1-2    // 打印1至2位置参数,即example01 exmple02

从上面的示例,可以看出引用命令具体参数的格式通过分号分为两个部分,一是从哪个命令查找,二是查找具体哪个位置的参数。

3. 历史命令替换执行

历史命令替换就是用处不多,也只在有比较长的命令比较高效,格式如下:

cmd:offset1-offset2:s/old/new/:s/old/new/

例如,替换历史命令第3条命令参数example01位example1,example02为example2,Public为Work,如下:

$ echo !3:1-3:s/01/1/:s/02/2/:s/Public/Work/

虽然历史命令理解起来比较简单,但是真正用好且确实提高工作效率是一个不断实践总结的过程。部分功能是我们需要常用的功能,当然这里面也有些功能在平时工作中很少用到,但在有些特殊场景,确实可以提高我们工作效率。

时间: 2024-10-10 02:51:08

Linux命令高效操作(2)-妙用历史命令的相关文章

Unix-like命令高效操作(1)-快捷键

借公司大牛的技术分享ppt,组织几篇关于unix-like命令高效操作的文章! 一篇非常注重实践的技术文,主要关于如何在unix-like下实现高效快速的命令行操作, 希望大家能从中真正体悟出命令行与图形化操作的效率差异! 关于命令行与图形化的话题,网上也有很多的讨论,各执一词,不论谁对说错,主要还是场景不同, 而且有些快捷键也是特定历史时期下的产物. 下面先梳理一下大纲,看看涉及到的内容,命令行快捷键能为我们做到什么? 快捷移动, 包括单字符移动, 单词移动, 行首行尾移动等; 快捷删除, 包

Linux登录自动切换root账户与历史命令优化

1:当我们Linux系统优化完成,会使用oldboy用户远程连接CRT登录,每次连接都需要使用sudo su - 或者su - 输入密码登录,请问如何在CRT连接的时候自动的切换到root账户,(提示:CRT连接的用户为oldboy,所以只能针对oldboy有此功能) 应用场景:当我们使用oldboy用户远程连接系统的时候总是需要使用sudo或者su命令切换到root账户,这样极大影响了我们的工作效率,我们可以通过修改oldboy用户家目录下.bash_profile配置文件,使其在登录是自动运

LINUX命令行操作

Linux 命令行快捷键 7条回复 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 说明 Ctrl – k: 先按住 Ctrl 键,然后再按 k 键: CAlt – k: 先按住 Alt 键,然后再按 k 键: M – k:先单击 Esc 键,然后再按 k 键. 移动光标 Ctrl – a :移到行首 Ctrl – e :移到行尾 Ctrl – b :往回(左)移动一个字符 Ctrl – f :往后(右)移动一个字

Linux中的历史命令

Linux中的历史命令一般保存在用户????/root/.bash_history history 选项 历史命令保存文件夹 选项 ????-c:清空历史命令 ????-w :把缓存中的历史命令写入历史命令保存文件/root/.bash_history 在.bash_history中看到的命令和用history命令看到的内容并不完全一样.在.bash_history文件中看到的是上次登录注销以后保存的命令,而histroy看到的包括这次登录执行的命令 1.将缓存中的命令写入历史命令保存文件 [[

【Linux命令详解】10、查看历史命令—[ history]

10.history     可以查看命令历史记录,每一条命令前面都会有一个序列号标示. 10.1.1 命令语法:     history [选项] 10.1.2 选项参数 history命令选项参数含义 选项              选项含义 -c                 清除命令历史记录 -w                让bash将历史命令立即从内存写到.bash_history文件 -a                 将目前新增的history历史命令写入.bash_his

提升效率的Linux终端快捷操作汇总

很多普通 Linux 桌面用户都对使用终端感到排斥和恐惧,其实它没大家想的那么复杂,很多常见操作都可以直接在终端中进行,如:安装软件.升级系统等. 无论你是新手还是 Linux 终端使用的老鸟,系统极客在此为大家总结了提升终端命令执行效率的快捷操作汇总,希望能帮助你学习和提升效率. 移动定位光标 在终端中移动光标和定位似乎非常不便,其实不是你想的那样,有很多种方式可以让键盘成为你的好朋友,只是需要掌握正确的方法而已. 定位单词 在长段的命令中,使用 Ctrl + ← 和 Ctrl + → 可快速

Linux下高效编写Shell——shell特殊字符汇总

Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好,往往能给我们起到事半功倍的效果,为此,特地将Shell里面的一些符号说明罗列成对照表的形式,以便快速的查找.看看你知道下表中哦你的哪些Shell符号呢? Shell符号及各种解释对照表: Shell符号 使用方法及说明 # 注释符号(Hashmark[Comments]) 1.在shell文件的行

Linux安全基础:shell及一些基础命令

1.什么是shell?Shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash. 2.shell的分类(1)bash bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,包括许多附加的特点.Bash 有可编辑的命令行,可以回查历史命令,支持 tab 键补齐以使用户避免输入长的文件名.(2)csh C shell 使用的是“类C”语法,借鉴了 Bourne shell 的许多特点,只是内部 shell

shell介绍、历史命令、命令补全和别名、通配符、输入输出重定向

shell介绍 shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和计算机硬件之间还有一层东西--系统内核. 用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作. Redhat.Centos 默认安装的shell版本是bash,它是sh的增强版. 历史命令 我们执行过的命令Linux都会记录,预设可以记录1000条历史命令.这些命令保存在用户家目录的.bash_h