运维与监控  - 讨论区

标题:Linux下的实用bash命令分享

2010年12月18日 星期六 12:44

在我刚开始使用Linux不久,我试图学习一些bash命令,于是我敲下了如下的命令:

 $ man bash

我立即发现bash用户手册简直就是一个长篇史诗。一页又一页的命令、功能说明、小技巧、小说明以及非常多的环境变量。20年过去了,我到现在还是能经常在bash中发现一些新的工具和功能 ,我不知道称呼Bash为一个工具是不是比一个代码更为恰当。在这篇文章中我将介绍Bash的一些不常用(但是还是非常有用)的特性。

一、扩展字段匹配

首先我们来看一个叫做扩展字段匹配的功能。这个选项允许你执行比标准Bash所提供的更复杂的字段匹配。例如,你可以定位除了后缀为.tmp之外的所有文件。扩展字段匹配功能可

以通过shopt命令启用,或者内置的shell选项:

 $ shopt -s extblob

备注:你还可以运行shopt命令来查看其它选项、特性和它提供的一些秘密功能。

一旦启用,我们可以用一个简单的语法列出某个目录中除去后缀为.tmp的所有文件:

 $ ls !(*.tmp)

你还可以使用多个参数:

 $ ls !(*.tmp|*.log|*.bak)

你可以选择使用其它几个extglob的参数,比如:

 ?(pattern-list) Matches zero or one occurrence of the given patterns
*(pattern-list) Matches zero or more occurrences of the given patterns
+(pattern-list) Matches one or more occurrences of the given patterns
@(pattern-list) Matches exactly one of the given patterns
!(pattern-list) Matches anything except one of the given patterns

二、cdspell shell选项

Cdspell是另一个很有用并且少为人知的shell命令。Cdspell命令可以更正在cd命令中出现的小的拼写错误。你可以通过shopt命令行来启用cdspell选项。

 $ shopt -s cdspell

举个例子,现在我们试着输入一个简单的关于更改目录的错误命令:

 $ cd /ect
/etc

很快你能发现这个小错误被自动更正过来了,并且bash已经让你成功更改到了正确的目录下。

 $ pwd
/etc

Cdspell选项可以自动更正字母顺序拼写错误的单词,漏了字母的单词,还可以去掉单词中多余的字母。

三、更好地管理Bash命令历史记录

Bash中最有用的功能之一就是可以自动记忆你曾经使用过的命令。你可以用history命令来列出一系列之前执行过的命令。然后你可以在bash shell中用叹号标注来找回并且执行之前的命令。例如,你可以从历史记录中通过数字列出某条命令:

 $ !110

这样可以运行历史记录中的第110条命令。或者你也可以通过名称来指定某条命令:

 $ !wget

这样执行最近的一条wget命令。

以下这种用法很少人知道:

 $ !:0

这可以返回之前执行过的命令行中的命令字段,例如:

 $ wget http://www.google.com
$ !:0
$ wget

如果不需要命令,只需要返回命令之后的参数,你可以用这个命令:

 $ mkdir /tmp/newdirectory
$ cd !*
cd /tmp/newdirectory

然后,你的历史记录有可能因为重复使用而变得混乱,而且你会希望只返回一些比如ls或者ps命令这样的结果。Bash有一个叫做$HISTIGNORE的环境变量,它可以只记忆那些你想要的命令,而不是所有命令。让我们看看我的$HISTIGNORE设置:

 $ HISTIGNORE="&:history:ls:ls * ps:ps -A:[bf]g:exit"

这个设置可以避免记录重复记录(&号),然后所有ls,ls*ps和ps-A,还有bg,fg和内置的exit命令都将被记录在历史列表中。另一个有用的小技巧就是加一个[ \t]*参数,可以避免所有以空格开始的命令被记录在历史列表中。最后,我们只要输出它就可以了:

 $ export HISTIGNORE

四、交互式历史命令搜索

你以前知道这件事情吗,就是你可以互动式地搜索你的Bash历史命令,从而更好地整理好它?你可以输入Ctrl-r来启用这个搜索功能(这个可以对Emacs用户来说比较熟悉,就像Emacs一样,你可以用Ctrl-a和Ctrl-e到达命令行的开始或者结尾,象其它快捷键一样)。这会启动以下命令:

 (reverse-i-search)`':

然后你可以输入一个命令或者命令的一部分来搜索你的Bash历史命令,系统会列出匹配的命令。如果找到你需要的命令你可以通过敲击回车键来运行它或者敲ESC键来编辑匹配的命令行。

五、非别名命令

多数人都知道如何使用别名命令,它允许你创建自定义版本的命令,比如给rm命令加一个-r参数,或者给mkdir加一个-p参数:

 $ alias rm='rm -r'
$ alias mkdir='mkdir -p'

你也可以不加标记的运行一个别名命令来获得一个当前可用的别名命令列表。

但是你可能不知道非别名命令。这可以让你在无需别名的情况下运行一个命令:

 $ unalias rm /tmp/file

你还可以用\参数来获得相同的结果:

 $ \rm /tmp/file

这将执行rm命令,而不需要象在别名命令中一样手动去加-r参数。

下面介绍另外五个同样十分实用的Bash命令:

更改Bash导航

大多数人都知道Bash的导航命令。用Emacs作编辑器的人对它们更是相当熟悉。它们包括:

 Ctrl + a - 返回到当前命令的开始
Ctrl + e - 返回到当前命令的末尾
Ctrl + w - 删除光标左边的第一个条目(变量或者命令)
Ctrl + u - 剪切光标前面的所有内容
Ctrl + y - 剪切光标后面的所有内容
Ctrl + y - 粘贴你用Ctrl +u或者Ctrl + y剪切的内容
Ctrl + p - 滚动显示以前的命令
Ctrl + n - 下一个命令
Ctrl + l - 清屏

你可能不知道Bash不仅能够使用Emacs编辑模式,而且还能够使用vi模式(为那些更喜欢用vi命令的人准备)。你可以用下面的命令切换到vi编辑模式:

 $ set -o vi

你还可以把这个命令添加到你的.bashrc文件中,以便永久地切换到vi模式:

 $ set -o vi >> ~/.bashrc

现在你就可以用vi模式使用命令行了。比如,你可以用vi命令模式进行导航。按Esc键进入命令模式,然后你就可以使用以下命令:

 l - 向前移动一个字符
h - 向后移动一个字符
0(零) - 把光标移动到该行最前面
$ - 把光标移动到行末
w - 往前移一个字
b - 往后移一个字

然后你可以按Esc键退出命令模式,或者像vi一样按A或I键进入插入模式,对命令行进行编辑。按enter键会执行当前命令。

如果你决定不用vi模式,你可以键入以下命令返回emacs模式:

 $ set -o emacs

你还可以用命令:

 $ bind –P

来显示你的所有命令以及它们的按键设置。你也可以用该bind命令对各种函数设置自己的按键组合。

 cd –命令

你可以使用:

 $ cd –

返回你原来所在的目录,你可以重复使用该命令返回上一级目录。

设置命令的输出路径

有时候你想告诉人们你的命令行发生了什么事情,但是又不想让他们拥有访问权。有一种快捷、简便的方法可以解决这个问题:使用脚本和nc命令在网络上显示你的命令行发生了哪些变化,只需输入:

 $ script -f >(nc -l 8000)

这个命令会把所有在命令行中键入的内容输送到网络上,所有使用监听端口8000的人都能够看到你用nc命令键入的内容。

 $ nc host 8000

文件首次重定向

我喜欢那些让我少打字的技巧。通常你想要用多种方式处理同一个文件。使用重定向,我们可以首先指定文件的名字,以及结束时执行的命令。比如:

 $ </var/log/messages grep dhclient
$ </var/log/messages grep kernel 
$ </var/log/messages grep yum

这里我们指定了我们想要预先搜索的文件,然后指定了grep命令和我们想要查找的文本。现在如果我们想要从历史中检索该命令,我们只需要编辑要再次搜索的文本就可以了。

三个有用的查找(find)命令

最后,我要分享三个我经常使用的、非常有用的查找命令。Find命令是一个非常强大的小工具,尤其是与-exec选项搭配的时候,它们允许你在查找的结果中执行命令。我建议你阅读一下find的说明,以便更深入的使用该命令。

第一个命令:查找并列出当前目录中过去一天修改的所有文件。

 $ find ./ -type f -mtime -1 -exec ls -al {} \;

你显然可以修改该命令,以便查找其他地方、不同时间(把-1改成不同的时间)的文件。

第二个命令:查找文件,然后执行一个基于Perl的寻找-替换功能。

 $ find . -name '*.txt' -type f -exec perl -pi -e 's/goldfish/tiger/g' {} \;

在这种情况下,我们查找所有扩展名为.txt的文件,并在这些文件中查找单词“goldfish”,把这个单词替换成“tiger”。

最后一个查找命令:我经常用它从我的路径中递归删除.svn(和其他的)目录。

 find . -name ".svn" -exec rm -rf {} \;
 
  来源
 

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2022

    京ICP备05028076号