注:该文章是从http://talk.linuxtoy.org/using-cli/ 这转载过来的
使用^old^new换掉输错或是输少的部分
1. 输入命令错误,修正命令
cat myflie
用下面的命令进行修正
^li^il
输入上面的命令后,会自动出现下面的命令
cat myfile
2.命令行缺少补全
ansible vod -m command -a 'uptim'
当输错后,使用下面的命令行来进行处理纠正错误
^im^ime
使用上面这个命令后,会自动的出现下面的内容
ansible vod -m command -a 'uptime'
使用 !:gs/old/new 将 old 全部换成 new
示例如下
ansible nginx -m command -a 'which nginx'
需要把nginx全部替换成squid,使用命令如下
!:gs/nginx/squid
输完命令后,会自动变动如下
ansible squid -m command -a 'which squid'
如果你使用的是zsh的话,需要使用如下命令全局替换
^nginx^squid^:G # zsh
需要记住的原则如下:
- 一删
- 二换
- 三全变
忘记历史就是背叛
- 了解历史记录的大小
echo $HISTSIZE
1000
- 历史记录的保存位置
echo $HISTFILE
/home/xiaodong/.zhistory
- 历史记录的保存大小
echo $HISTFILESIZE # bash
1000
echo $SAVEHIST # zsh
1000
注:上面两个命令我在我的MAC中输出的结果为空,我的MAC的环境是zsh,各位在测试的时候需要注意
- 查看历史
% history
% history | less
1 hist
2 ./code/gs/update_system.pl -n
3 emerge -C chromium
4 emerge @preserved-rebuild
5* df -h
......
% history 5
% history | grep string
- 使用 Ctrl + r 逆向搜索历史命令
%
(reverse-i-search)`h': history 5
- 使用 Ctrl + p 访问上一条命令
% history 5
[Ctrl + p]
- 使用 Ctrl + n 访问下一条命令
%
[Ctrl + n]
- 使用 !! 执行上一条命令
% !!
% sudo !!
% apt-get install figlet
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
% sudo !!
sudo apt-get install figlet
- 使用 !foo 执行以 foo 开头的命令
% !his
history
- 使用 !?foo 执行包含 foo 的命令
% !?is
echo $histchars
注:这个如果是多个命令包含is的话,那就是执行最新的一个,感觉这个有点鸡肋
- 使用 !n 执行第 n 个命令
% !10
vim lib/TunePage.pm
注:表示执行历史命令中的第十个命令,这需要你对历史命令的执行次数很熟悉,可以针对历史命令标号的方式进行标记
- 使用 !-n 执行倒数第 n 个命令
% !-2
htop
% !-1 == !!
Tip: 给命令提示符中增加历史命令编号
% export PS1='!\! \u@\h:\w\$ '
!998 xiaodong@codetoy:~$
- 使用 !# 引用当前行
% cp filename filename.old
% cp filename !#:1.old
注:cp filename !#:1.old
这个是一个完整的命令,其执行后,出现的结果就是显示命令cp filename filename.old
关于历史引用,要记住的是:
- !!
- ![?]字符串
- ![-]数字
- !#
- 历史命令word选取图
注:这个确实还没有明白什么意思
- 通过 !$ 得到上一条命令的最后一位参数
% mkdir videos
% cd !$
%
[Alt + .] #这个不知道干嘛的
- 通过 !^ 得到上一条命令的第一个参数
% ls /usr/share/doc /usr/share/man
% cd !^ #等价于cd /usr/share/doc
%
[Ctrl + Alt + y] #未知
- 通过 !:n 得到上一条命令第 n 个参数
% touch foo.txt bar.txt baz.txt
% vim !:2
vim bar.txt
- 通过 !:x-y 得到上一条命令从 x 到 y 的参数
% touch foo.txt bar.txt baz.txt
% vim !:1-2
vim foo.txt bar.txt
- 通过 !:n* 得到上一条命令从 n 开始到最后的参数
% cat /etc/resolv.conf /etc/hosts /etc/hostname
% vim !:2*
vim /etc/hosts /etc/hostname
- 通过 !* 得到上一条命令的所有参数
% ls code src
% cp -r !*
关于 Word 选取,要记住的是:
- n
- ^|$
- [n]*
- x-y
% !an:$
% !10:2-4
% !{an}2
- 利用 :h 选取路径开头
% ls /usr/share/fonts/truetype
% cd !$:h
cd /usr/share/fonts
注:这个相当于dirname
- 利用 :t 选取路径结尾
% wget http://nginx.org/download/nginx-1.4.7.tar.gz
% tar zxvf !$:t
tar zxvf nginx-1.4.7.tar.gz
注:这个相当于basename
* 利用 :r 选取文件名
% unzip filename.zip
% cd !$:r
cd filename
- 利用 :e 选取扩展名
% echo abc.jpg
% echo !$:e
echo .jpg # bash
.jpg
echo jpg # zsh
jpg
- 利用 :p 打印命令行
% echo *
README.md css img index.html js
% !:p
echo *
- 利用 :s 做替换
% echo this that
% !:s/is/e
echo the that
注:惯用法: ^is^e
* 利用 :g 做全局操作
% echo abcd abef
% !:gs/ab/cd
echo cdcd cdef
cdcd cdef
- 利用 :u 将其更改为大写 (zsh)
% echo $histchars
% echo !$:u
echo $HISTCHARS
- 利用 :l 将其更改为小写 (zsh)
% echo !$:l
echo $histchars
关于修饰符,要记住的是:
h|t
r|e
p
s
g
u|l
几个修饰符结合使用示例:
% ls /usr/share/fonts/opentype
% echo !$:t:u
echo OPENTYPE
- 历史展开模式
常备锦囊,内藏妙计
- 使用 {} 构造字符串
% cp file.c file.c.bak
% cp file.c{,.bak}
% echo cp file.c{,.bak}
% vim {a,b,c}file.c
vim afile.c bfile.c cfile.c
% vim [abc]file.c # ?
% vim {a..c}file.c # bash
% setopt braceccl # zsh
% vim {a-c}file.c # zsh
- 使用 {} 构造字符串 (续)
% wget http://linuxtoy.org/img/{1..5}.jpg
1.jpg 2.jpg 3.jpg 4.jpg 5.jpg
% touch {01..5}.txt
01.txt 02.txt 03.txt 04.txt 05.txt
% touch {1..10..2}.txt
1.txt 3.txt 5.txt 7.txt 9.txt
% echo {1..10..-2} # zsh
9 7 5 3 1
% echo {9..1..2} # bash
9 7 5 3 1
- 使用 {} 构造字符串 (续)
% mkdir -p 2014/{01..12}/{baby,photo}
% echo {{A..Z},{a..z},{0..9}}
- 使用 `` 或 $() 做命令替换
% grep -l error *.pm # (1)
TunePage.pm
% vim TunePage.pm # (2)
% vim `grep -l error *.pm`
% vim $(grep -l error *.pm)
嵌套时,$() 可读性更清晰,而 `` 则较差
% vim $(grep -l failed $(date +'%Y%m%d').log)
% vim `grep -l failed \`date +'%Y%m%d'\`.log`
重要原则
Type less, accomplish more (少打多做)
DRY, don't repeat yourself (不要重复你自己)
Care about your tool (关心你的工具)
扩展阅读
bash: man history
zsh: man zshexpn
Bash Reference Manual:
https://www.gnu.org/software/bash/manual/html_node/index.htmlA User's Guide to ZSH:
http://zsh.sourceforge.net/Guide/zshguide.htmlBook: Unix Power Tools
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。