2

注:该文章是从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 (关心你的工具)

扩展阅读


yexiaobai
4.8k 声望875 粉丝

就是不告诉你 O(∩_∩)O哈哈~。


引用和评论

0 条评论