我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊 Linux环境中grep、find、locate、whereis、who、uname、whatis、apropos八大查找命令简明教程。
首先解释一下里面为什么没有man,说实话我运维系统以后,几乎不用这个命令,各社区论坛好帖子这么多,看看用例就可以学会了,我为什么还要看这么枯燥的man命令显示结果。我还是从实用角度来介绍下面的命令吧。
grep命令
在很多时候,并不需要像cat、more、less命令那样列出文件的全部内容,用户要做的只是找到包含某些信息的一行。这个时候,如果使用 more命令一行一行去找的话,无疑是费时费力的。当文件特别大的时候,这样的做法则完全不可行了。为了在文件中寻找某些信息,可以使用grep命令。
grep [OPTIONS] PATTERN [FILE...]
例如,有一个day文件,内容为7行字符,第一行是星期一的英文单词,第二行是星期二的英文单词,依次类推,为了在文件day中查找包含un的行,可以使用如下命令:
$ grep un day
Sunday
可以看到,grep有两个类型不同的参数。第一个是被搜索的模式(关键词),第二个是所搜索的文件。grep会将文件中出现关键词的行输出。可以指定多个文件来搜索,假设另外有一个weather文件,里面有各种天气的英文单词,每个一行,例如:
$ grep un day weather
day:Sunday
weather: sunny
如果要查找如两个英文单词(中间用空格分隔)这样的关键词,那么必须加单引号以把空格包含进去
$ grep 'struct list' stack.h
struct list {
struct list *next;
struct list *top;
typedef struct list list;
严格地说,grep通过“基础正则表达式(basic regular expression)”进行搜索。和grep相关的一个工具是egrep,除了使用“扩展的正则表达式(extended regular expression)”,egrep和 grep完全一样。“扩展正则表达式”能够提供比“基础正则表达式”更完整地表达规范。
find 命令
随着文件增多,使用搜索工具成了顺理成章的事情。find就是这样一个强大的命令,它能够迅速在指定范围内查找到文件。find命令的基本语法如下:
find [OPTION] [path...][expression]
例如,希望在/usr/bin/目录中查找zip命令:
$ find /usr/bin/ -name zip -print
/usr/bin/zip
从这个例子中可以看到,find命令需要一个路径名作为查找范围,在这里是/usr/bin/。find会深入到这个路径的每一个子目录中去寻找,因此如果指定“/”,那么就查找整个文件系统。-name选项指定了文件名,在这里是zip。可以使用通配符来指定文件名,如“find~/ -name *.c-print”将列出用户主目录下所有的c程序文件。-print表示将结果输出到标准输出(在这里也就是电脑屏幕)。注意find命令会打印出文件的绝对路径。
find命令还能够指定文件的类型。在Linux中,包括目录和设备都以文件的形式表现,可以使用-type选项来定位特殊文件类型。例如,在/etc/目录中查找名叫init.d的目录:
$ find /etc/ -name init.d -type d -print
find: /etc/ssl/private: Permission denied
find: /etc/cups/ssl; Permission denied
/etc/init.d
注意:在输出结果中出现了两行Permission denied。这是由于普通用户并没有进入这两个目录的权限,这样find在扫描时将跳过这两个目录。-type选项可以使用的参数如下所示。
参数 含义
b 块设备文件
f 普通文件
c 字符设备文件
p 命名管道
d 目录文件
l 符号链接
还可以通过指定时间来指导 find命令查找文件。-atime n用来查找最后一次使用在n天前的文件,-mtime n则用来查找最后一次修改在n天前的文件。但是在实际使用过程中,很少能准确确定n的大小。在这种情况下,可以用+n表示大于n,用-n表示小于n。例如,在/usr/bin/中查找最近100天内没有使用过的命令(也就是最后一次使用在100天或100天以前的命令)。
$ find /usr/bin/ -type f -atime +100 -print
/usr/bin/pilconvert.py
/usr/bin/espeak-synthesis-driver.bin
/usr/bin/pildriver.py
/usr/bin/pilfont.py
/usr/bin/gnome-power-bugreport.sh
/usr/bin/gnome-power-cmd.sh
/usr/bin/pilprint.py
/usr/bin/pilfile.py
类似地,下面这个命令查找当前目录中,在最近一天内修改过的文件。
$ find . -type f -mtime -1 -print
./text1
./day
./weather
locate命令
尽管find命令已经展现了其强大的搜索能力,但对于大批量的搜索而言,还是显得慢了一些,特别是当用户完全不记得自己的文件放在哪里的时候。这时,locate命令会是一个不错的选择。如下:
$ locate *. doc
/fishbox/share/doc/办公文档1.doc
/fishbox/share/doc/办公文档2.doc
/fishbox/share/doc/办公文档3.doc
这些搜索结果几乎是一瞬间就出现了。locate并没有进入子目录搜索,它有一点类似于桌面搜索,通过检索文件名数据库来确定文件的位置。locate命令自动建立整个文件名数据库,不需要用户插手。如果希望立刻生成该数据库文件的最新版本,那么可以使用updatedb命令。运行这个命令需要有root权限,更新整个数据库大概耗时1分钟。
whereis命令
whereis命令主要用于查找程序文件,并提供这个文件的二进制可执行文件、源代码文件和使用手册页存放的位置。例如,查找find命令:
$ whereis find
find: /usr/bin/find /usr/share/man/man1/find.1.gz
可以使用-b选项让whereis命令只查找这个程序的二进制可执行文件。
$ whereis -b find
find: /usr/bin/find
如果whereis无法找到文件,那么将返回一个空字符串。
$ whereis xxx
xxx:
whereis无法找到某个文件的可能原因是,这个文件没有存在于任何 whereis命令搜索的子目录中。whereis命令检索的子目录是固定编写在它的程序中的。这看起来多少有点像是个缺陷,但把搜索限制在固定的子目录如/usr/bin、/usr/sbin和/usr/share/man中可以显著加快文件查找的进度。
who命令
在一台服务器上,同一时间往往会有很多人同时登录。who命令可以查看当前系统中有哪些人登录,以及他们都工作在哪个控制台上。
$ who
quzhou tty7 2008-09-30 21:12 (:0)
quzhou pts/0 2008-09-30 21:13 (:1.0)
有些时候,可能会忘记自己是以什么身份登录到系统,特别当需要以特定身份启动某个服务器程序时。这个时候,whoami这个命令会很有用。正如这个命令的名字那样,whoami会回答“我是谁”这个问题。
$ whoami
quzhou
uname命令
另一个常用的命令是uname,用于显示当前系统的版本信息。带-a选项的uname命令会给出当前操作系统的所有有用信息。
$ uname -a
Linux lewis-laptop 2.6.24-19-generic #1 SMP Fri Jul 11 21: 01: 46 UTC 2008x86 64 GNU/Linux
在大部分时候,需要的只是其中的内核版本信息。此时可以使用-r选项。
uname -r
2.6.24-19-generic
作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。