Linux环境中grep、find、locate、whereis、who、uname、whatis、apropos八大查找命令简明教程

我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊 Linux环境中grep、find、locate、whereis、who、uname、whatis、apropos八大查找命令简明教程。当然,在我的博客里成立windows程序员看linux这个专题,主要还是因为微软也发布了自己的linux的发行版,使得我们不得不研究linux技术以适应这个时代。

 

首先解释一下里面为什么没有man,说实话我运维系统以后,几乎不用这个命令,各社区论坛好帖子这么多,看看用例就可以学会了,我为什么还要看这么枯燥的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 quzhou-laptop 5.6.24-19-generic #1 SMP Fri Jul 11 21: 01: 46 UTC 2008x86 64 GNU/Linux

在大部分时候,需要的只是其中的内核版本信息。此时可以使用-r选项。

uname -r
5.6.24-19-generic

whatis命令

man手册中的长篇大论有时候显得太啰嗦了——很多情况下,人们只是想要知道一个命令大概可以做些什么。于是,whatis满足大家的需要。

$ whatis uname
uname  (1)  - print system information

whatis从某个程序的使用手册页中抽出一行简单的介绍性文字,帮助用户了解这个程序的大致用途。whatis的原理同locate命令基本一致。

apropos命令

与之相反的一个命令是apropos,这个命令可以通过使用手册中反查到某个命令。举例来说,如果用户想要搜索一个文件,而又想不起来应该使用哪个命令的时候,可以这样求助于apropos。

$ apropos search
apropos(1)  - search the manual page names and descriptions
badblocks(8)  - search a device for bad blocks
bzegrep(1)  - search possibly bzip2 compressed files for a regular expression
bzfgrep(1)  - search possibly bzip2 compressed files for a regular expression
bzgrep(1)  - search possibly bzip2 compressed files for a regular expression
find(1)  - search for files in a directory hierarchy
gnome-search-tool(1)  - the GNOME Search Tool
manpath(1)  - determine search path for manual pages
tracker-applet (1)  - The tracker tray-icon and on-click-search-entry
tracker-search-tool(1)  - Gnome Tracker Search Tool
tracker. cfg (5)  - configuration file for the trackerd search daemon
trackerd (1)  - indexer daemon for tracker search tool
zegrep(1)  - search possibly compressed files for a regularexpression
zfgrep(1)  - search possibly compressed files for a regularexpression
zgrep(1)  - search possibly compressed files for a regularexpression
zipgrep(1)  - search files in a ZIP archive for lines matchinga pattern
 

可以看到,apropos将命令简介(其实就是whatis的输出)中包含“search”的条目一并列出,用户总能够从中找到自己想要的。

总结

grep程序是查找文件内容的利器。

find命令可以按需查找某个特定的文件(包括目录)。

locate命令通过事先建立数据库提高搜索文件的速度。

whereis命令可以查某个特定程序所在的位置。

通过who命令可以查看当前有哪些人登录到系统。

uname命令用于显示当前系统的版本信息。

whatis命和 apropos命令能够 man手册中提取简要信息。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值