Bash技巧
Table of Contents
1 运行上一条命令
!! !-1
!!是BASH的事件引用符,!!相当与!-1,表示引用上一条命令。同理,可以使用!-2!-3等等来引用前N次的命令,可以引用命令的多少取决与~/.bashhistory文件记录的命令数。
2 快速备份一个文件
cp filename{,.bak}
该命令把filename文件拷贝成filename.bak。它的原理就在于bash把大括号扩展成filename filename.bak。
3 Ctrl+r历史搜索模式
有的时候,我们需要在Bash中重复执行先前的命令,虽然上下方向键可以使用,但是这适用于附近的几个命令。当你需要执行很早以前的命令时,Ctrl+r更方便。它可以帮助你搜索先前曾经输入的命令,一旦匹配到,直接回车即可。
4 cd - 返回上次进入的目录
如果你利用cd命令进入一个比较深的目录之后,突然丢失之后,可以使用cd - 命令返回上一次进入的目录,相当于撤销。
下面是测试实例:
4.1 进入某复杂目录下
lishuo@lishuo-Rev-1-0:/media/D/人文&技术文档/计算机编程/GCC$
4.2 cd回到主目录下
lishuo@lishuo-Rev-1-0:~$
4.3 使用cd -进行补救
lishuo@lishuoRev-1-0:~$ cd - /media/D/人文&技术文档/计算机编程/GCC lishuo@lishuo-Rev-1-0:/media/D/人文&技术文档/计算机编程/GCC$
5 !$ 重复命令参数
!$的作用就是重复前一个命令的参数,另外Esc + . 可以快速切换这些命令的参数或选项。
实例:
~$ mkdir ~/桌面/test
~$ cd !$
cd ~/桌面/test
~/桌面/test
6 标准流
0 | stdin |
---|---|
1 | stdout |
2 | sterr |
实例:
~$ sudo smartctl --all /dev/sda 2>&1 | grep Power_On_Hours 9 Power_On_Hours 0x0032 095 095 000 Old_age Always - 3996
其中grep不仅搜索标准输出,还搜索stderr的输出信息。其中"2>&1"的意思就是将便准错误的输出加入到标准输出。
7 友好显示当前挂载的文件系统
mount | column -t
column把输出结果进行列表格式化操作。
8 执行一条命令但不保存到history中
<space> command
通过在命令行前添加一个空格,就可一组织这条命令被保存到bash history中,这个行为可以通过$HISTIGNORE shell变量来设置。我的设置是HISTIGNORE="&:[ ]*" ,表示不保存重复的命令到 history 中,并且不保存以空格开头的命令行。$HISTIGNORE 中的值以冒号分隔。
9 显示当前目录素有子目录的大小
du -h --max-depth=1
–max-depth=1 参数可以让 du 命令显示当前目录下 1 级子目录的统计信息,当然你也可以把 1 改为 2 ,进一步显示 2 级子目录的统计信息,可以灵活运用。而-h 参数则是以Mb 、G 这样的单位来显示大小。
10 显示消耗内存最多的10个运行中的进程,以内存使用量排序
ps aux | sort -nk +4 | tail
11 查看ASCII表
man 7 ascii
12 在一个子SHELL中运行一个命令
(cd /tmp && ls)
当然这只是演示,要查看目录当然可以ls /tmp。好处就是不会改变当前shell的目录,以及如果命令中设计环境变量,也不会对当前shell有任何修改。
在Shell编程中还有很多使用上引号来括住一个命令:`ls /tmp`,这也是子shell过程。可是上引号的方法无法嵌套,而使用小括号的方法可以,一个比较纠结的例子.
echo $(echo -e /C|/x%24%28printf "%x" 65))
13 列出10条最长用的命令
history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}} | sort -rn | head'
13.1 改良版
下面命令可以显示命令的使用频率
$ history | \ > awk '{a[$2]++} END{for(i in a){print a[i] "\t" i "\t" a[i]/$HISTSIZE}}'\ > sort -rn \ > awk '{print $2 "\t\t" $3}' \ > sed '/^\./d' \ > head -n 10