Linux 查找搜索命令 5种方式

一、whereis命令
       该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。

       该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令。

      简单理解:只能搜索系统命令,不能搜索普通文件。

语法:whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]

参数:

 

  • -b  只查找二进制文件。
  • -B<目录>  只在设置的目录下查找二进制文件。
  • -f  不显示文件名前的路径名称。
  • -m  只查找说明文件。
  • -M<目录>  只在设置的目录下查找说明文件。
  • -s  只查找原始代码文件。
  • -S<目录>  只在设置的目录下查找原始代码文件。
  • -u  查找不包含指定类型的文件。


实例: 

[root@centos7 ~]# whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz


注意:以上输出信息从左至右分别为:查询的程序名、bash路径、bash的man手册页路径。

二、which 命令
       该指令会在环境变量$PATH指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。       

语法:which [文件...]

参数:

  • -n<文件名长度>  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
  • -p<文件名长度>  与-n参数相同,但此处的<文件名长度>包括了文件的路径。
  • -w  指定输出时栏位的宽度。
  • -V  显示版本信息。

实例:

ll:[root@centos7 ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[root@centos7 ~]# which ls
alias ls='ls --color=auto'
        /usr/bin/ls
[root@centos7 ~]# which ll
alias ll='ls -l --color=auto'
        /usr/bin/ls


注意:which命令与whereis命令的区别在于他们的显示结果不同:如果这个命令有别名,which命令则还可以显示别名。

三、type命令
       type命令 用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。

命令类型:

  • alias:别名。
  • keyword:关键字,Shell保留字。
  • function:函数,Shell函数。
  • builtin:内建命令,Shell内建命令。
  • file:文件,磁盘文件,外部命令。
  • unfound:没有找到。


语法:type [选项] [参数]

选项

    -t:输出“file”、“alias”或者“builtin”,分别表示给定的指令为“外部指令”、“命令别名”或者“内部指令”;

    -p:如果给出的指令为外部指令,则显示其绝对路径;

    -f:只返回shell函数的信息。

    -a:在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名。

参数:   指定命令-要显示类型的指令命令。

实例:

[root@centos7 ~]# type type
type 是 shell 内嵌
[root@centos7 ~]# type -t ll
alias
[root@centos7 ~]# type -t /bin/ls
file
[root@centos7 ~]# type -p /bin/ls
/bin/ls
[root@centos7 ~]# type -a /bin/ls
/bin/ls 是 /bin/ls
[root@centos7 ~]# type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls
[root@centos7 ~]# type -a find
find 是 /usr/bin/find
[root@centos7 ~]# type -a grep
grep 是 `grep --color=auto' 的别名
grep 是 /usr/bin/grep


四、find命令
      Linux find命令用来在指定目录下查找文件/目录。任何位于参数之前的字符串都将被视为欲查找的目录名。

      如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。它提供了相当多的查找条件,功能很强大。但是,它是一个非常耗时,耗资源的命令,所以:

     1)不能在系统繁忙时段运行;

     2)尽可能在最小的搜索范围的前提下使用

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

简单理解为:

find   [查找目录] [查找规则] [查找完后的操作]

参数说明 :

        find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

    -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

    -amin n : 在过去 n 分钟内被读取过

    -anewer file : 比文件 file 更晚被读取过的文件

    -atime n : 在过去n天内被读取过的文件

    -cmin n : 在过去 n 分钟内被修改过

    -cnewer file :比文件 file 更新的文件

    -ctime n : 在过去n天内被修改过的文件

    -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

    -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

    -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

    -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。

    -type c : 文件类型是 c 的文件。

d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结


s: socket
    -pid n : process id 是 n 的文件

你可以使用 ( ) 将运算式分隔,并使用下列运算。

    exp1 -and exp2

    ! expr

    -not expr

    exp1 -or exp2

    exp1, exp2

实例:推荐查询规则加上引号

1)精准查找,将目前目录及其下子目录中的查找文件列出

     通过文件名(-name):

[root@centos7 ~]# tree
.
├── abc
│   ├── aa_dir
│   │   └── aa.txt
│   ├── bb_dir
│   │   └── bb.txt
│   ├── file2.cfg
│   ├── test22
│   │   ├── anaconda-ks.cfg
│   │   └── test_d
│   └── test.txt
└── anaconda-ks.cfg
 
5 directories, 6 files
[root@centos7 ~]# find . -name aa.txt
./abc/aa_dir/aa.txt


     所有者(-user):

[root@centos7 ~]# ll ./abc
总用量 8
drwxr-xr-x 2 root root     20 1月   6 10:25 aa_dir
drwxr-x-wx 2 root root     20 1月   6 10:26 bb_dir
-rwxrw-r-- 1 lisi g_lisi 1440 12月 12 14:22 file2.cfg
drwxr-xr-- 3 root root     43 1月   4 14:08 test22
-rwxr-xr-- 1 root root     57 12月 12 14:37 test.txt
[root@centos7 ~]# find ./abc -user 'lisi'
./abc/file2.cfg
[root@centos7 ~]# find ./abc -user 'root'
./abc
./abc/test22
./abc/test22/anaconda-ks.cfg
./abc/test22/test_d
./abc/test.txt
./abc/bb_dir
./abc/bb_dir/bb.txt
./abc/aa_dir
./abc/aa_dir/aa.txt


     所属组(-group):

[root@centos7 ~]# find ./abc -group "g_lisi"
./abc/file2.cfg


2)模糊查找

通配符: *  表示任意字符,   ?表示一个字符

iname 会忽略大小写

[root@centos7 ~]# find . -name "*_*"
./.bash_logout
./.bash_profile
./.bash_history
./abc/test22/test_d
./abc/bb_dir
./abc/aa_dir
[root@centos7 ~]# find . -name "*_???"
./abc/bb_dir
./abc/aa_dir


3)查找在/root/abc目录下,在过去 1天读取过的文件

[root@centos7 ~]# find /root/abc -atime -1
/root/abc
/root/abc/test22
/root/abc/test22/anaconda-ks.cfg
/root/abc/test22/test_d
/root/abc/file2.cfg
/root/abc/test.txt
/root/abc/bb_dir
/root/abc/bb_dir/bb.txt
/root/abc/aa_dir
/root/abc/aa_dir/aa.txt


4)多条件查询:默认查找的内容指目录和文件

使用上面提到的 ( ) 将运算式分隔,-a(and),-o(or),!(not)

查找在/root/abc目录下,条件: 过去 1天读取过的文件,文件大小小于100M,一般文件

[root@centos7 ~]# find /root/abc -atime -1 -a -size -204800 -or -type f   
/root/abc
/root/abc/test22
/root/abc/test22/anaconda-ks.cfg
/root/abc/test22/test_d
/root/abc/file2.cfg
/root/abc/test.txt
/root/abc/bb_dir
/root/abc/bb_dir/bb.txt
/root/abc/aa_dir
/root/abc/aa_dir/aa.txt
[root@centos7 ~]# find /root/abc -atime -1 -a -size -204800 -and -type f
/root/abc/test22/anaconda-ks.cfg
/root/abc/bb_dir/bb.txt
/root/abc/aa_dir/aa.txt


5)查找完后的操作

     查找在/root/abc目录下,条件:后缀为 .txt的一般文件

     注意:-exec可以替换-ok,功能一样只是多一个提示

操作1:找到,ls -l 列出

[root@centos7 ~]# find /root/abc -name "*.txt"  -exec ls -l {} \;  
-rwxr-xr-- 1 root root 57 12月 12 14:37 /root/abc/test.txt
-rw-r---w- 1 root root 0 1月   5 13:46 /root/abc/bb_dir/bb.txt
-rw-r--r-- 1 root root 0 1月   5 13:25 /root/abc/aa_dir/aa.txt
[root@centos7 ~]# find /root/abc -name "*.txt"  -ok ls -l {} \;  
< ls ... /root/abc/test.txt > ? y
-rwxr-xr-- 1 root root 57 12月 12 14:37 /root/abc/test.txt
< ls ... /root/abc/bb_dir/bb.txt > ? y
-rw-r---w- 1 root root 0 1月   5 13:46 /root/abc/bb_dir/bb.txt
< ls ... /root/abc/aa_dir/aa.txt > ? y
-rw-r--r-- 1 root root 0 1月   5 13:25 /root/abc/aa_dir/aa.txt


操作2:删除,并在删除之前不询问

[root@centos7 ~]# find /root/abc -name "*.txt"  -exec rm -rf {} \;
[root@centos7 ~]# tree
.
├── abc
│   ├── aa_dir
│   ├── bb_dir
│   ├── file2.cfg
│   └── test22
│       ├── anaconda-ks.cfg
│       └── test_d
└── anaconda-ks.cfg
 
5 directories, 3 files


四、grep命令
       grep 命令用于查找文件里符合条件的字符串。是一种强大的文本搜索工具。grep可用于shell脚本。

       grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。不影响原文件内容。

       grep命令和find命令的主要区别:find是搜索文件/目录本身;而grep命令是搜索在文件里边的内容

语法

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

简单理解为:

grep  [选项]  [模式] [文件]

参数:

  • -a 或 --text : 不要忽略二进制的数据。
  • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 --ignore-case : 忽略字符大小写的差别。
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -q 或 --quiet或--silent : 不显示任何信息。
  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 --no-messages : 不显示错误信息。
  • -v 或 --revert-match : 显示不包含匹配文本的所有行。取反
  • -V 或 --version : 显示版本信息。
  • -w 或 --word-regexp : 只显示全字符合的列。即只能是单词,而不能是单词中的某一部分
  • -x --line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定"-i"参数相同。
  • –help : 在线帮助。


1)基本使用方式

     -i 忽略大小写   

[root@centos7 ~]# grep -i "keyboard" ./abc/file2.cfg  
# Keyboard layouts
keyboard --vckeymap=cn --xlayouts='cn'


    -c 显示行号

    -cv 显示有几行没被匹配到

    

 

注意:

     显示的行号,不是给结果编一个新的行号,是源文件中的行号

     如果同时使用-cv选项是显示有多少行没有被匹配到。

    -o 只显示与搜索匹配到的内容

[root@centos7 ~]# grep -o "boot" ./abc/file2.cfg   
boot
boot
boot
boot
boot
boot
boot


    -A -B -C 使用

[root@centos7 ~]# grep -n -A 2 "location" ./abc/file2.cfg 
27:bootloader --location=mbr --boot-drive=sda
28-# Partition clearing information
29-clearpart --none --initlabel


模式部分:

1、直接输入要匹配的字符串,这个使用加-f选项(grep -f),或者直接使用 fgrep命令(fast grep)代替来提高查找速度

2、使用基本正则表达式 : 特殊字符要用转义符\

 

 

 

    \b或\<:锚定单词的词首
    \b或\>:锚定单词的词尾
    \B :与\b作用相反。


分组及引用:

   分组:匹配的是重复的abc这一个整个字符时,我们就需要分组,将abc作为一个整体

   后向引用:表示在引用整个正则中分组中所匹配到的结果,\1表示第一个分组中的正则所匹配到的结果。如果是嵌套分组,分组顺序取决于分组符号的左侧部分部分的顺序。

\(string\) :将string作为一个整体方便后面引用
    \1 :引用第1个左括号及其对应的右括号所匹配的内容。
    \2 :引用第2个左括号及其对应的右括号所匹配的内容。
    \n :引用第n个左括号及其对应的右括号所匹配的内容。

实例:

1)标点符号

    

 

2)搜索/etc/passwd文件中以/开始,以sh结尾的字符串,在/和sh中间可以有0-2个任意字符

[root@centos7 ~]# grep   "/.\{0,2\}sh$"   /etc/passwd         
root:x:0:0:root:/root:/bin/bash
lisi:x:1000:1000::/home/lisi:/bin/bash


3)分组:\ 为转义符

[root@centos7 ~]# grep "\(114\.\)\{3\}" ./abc/file2.cfg  
network  --bootproto=dhcp --device=ens33 --nameserver=114.114.114.114,218.108.248.200,218.108.248.228 --ipv6=auto --activate


3、扩展的(Extend)正则表达式

      使用扩展的正则表达式要加-E选项(grep -E),或者直接使用 egrep命令,基本不需要加转义符\

    

 

   在网络配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33 中检索出所有的 IP 

[root@centos7 ~]# egrep "(\b[1-9][0-9]{0,2}\.){3}\b[1-9][0-9]{0,2}" /etc/sysconfig/network-scripts/ifcfg-ens33 
    

注意:

      - 默认情况下,正则表达式的匹配工作在贪婪模式下,也就是说它会尽可能长地去匹配,比如某一行有字符串 abacb,如果搜索内容为 "a.*b" 那么会直接匹配 abacb这个串,而不会只匹配ab或acb。

      - 所有的正则字符,如 [ 、* 、( 等,若要搜索 * ,而不是想把 * 解释为重复先前字符任意次,可以使用 \* 来转义。

五、locate命令


1、命令简介

        locate(locate) 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

整个locate工作其实是由四部分组成的:

/usr/bin/updatedb   主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate         查询文件位置
/etc/updatedb.conf   updatedb的配置文件
/var/lib/mlocate/mlocate.db  存放文件信息的文件


语法:locate [选项] [参数]

选项:

  • -b   --basename   与--wholename相反,认为后接的字符串是basename来进行匹配
  • -c   --count   不列出匹配的文件名,只列出数量
  • -d   --database DBPATH   后接指定数据库变量DBPATH,该变量是一串数据库名的列表,不采用默认匹配数据库mlocatedb
  • -e   --existing   只显示当前存在的文件条目
  • -L   --follow   检查文件是否存在时,会通过符号链接找到被链接文件,这样就不会输出broken symbolic的结果(当符号链接指向的文件被删除时,该符号链接成为broken symbolic),默认设置,与-P相对
  • -i   --ignore-case   匹配时忽略大小写(默认是区分大小写)
  • -l   --limit   实际使用时的用法为locate -n 数字,表示只列出前几个匹配结果
  • -m   --mmap   忽略向后兼容性,一般用不上
  • -P   --nofollow,-H   与-L相对,不沿符号链接检查文件是否存在,会将broken symbolic结果也输出
  • -0   -null   将输出里的不同条目以ASCII字符NUL进行间隔,其实就是输出结果连在一起不换行
  • -S   --statistics   后面不接参数,只是把搜索数据库的统计信息输出
  • -q   --quiet   静默模式,不显示读取数据库的错误信息
  • -r   --regexp REGEXP   使用基础正则表达式
  • --regex   使用扩展正则表达式
  • -s   --stdio   忽略向后兼容性,一般用不上
  • -V   --version
  • -w   --wholename   与--basename相对,将后接字符串作为whole path name进行匹配,这样转义

符号无法被识别

参数:要查找的文件名中含有的字符串

CentOS7默认没有安装该命令,先安装,然后更新后台数据库,输入命令:updatedb,最后就可以使用了

[root@centos7 ~]# rpm -qa mlocate    <=查询mlocate命令是否安装。如果没有显示就执行下面的命令
[root@centos7 ~]# yum -y install mlocate
[root@centos7 ~]# updatedb 
[root@centos7 ~]# locate /etc/my
/etc/my.cnf
/etc/my.cnf.d
/etc/my.cnf.d/mysql-clients.cnf


2、实例:新增的文件无法locate时,使用updatedb

1)查找所有名字包含_dir的文件

[root@centos7 ~]# locate _dir
/root/abc/aa_dir
/root/abc/bb_dir
/root/abc/aa_dir/aa.txt
/usr/lib/dracut/modules.d/99microcode_ctl-fw_dir_override
/usr/lib/dracut/modules.d/99microcode_ctl-fw_dir_override/module-setup.sh
/usr/lib/python2.7/site-packages/firewall/core/fw_direct.py
/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyc
/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyo
/usr/lib64/httpd/modules/mod_dir.so


2)列出5个后缀为.sh的文件

[root@centos7 ~]# locate -l 5 .sh
/boot/grub2/i386-pc/modinfo.sh
/etc/dhcp/dhclient-exit-hooks.d/azure-cloud.sh
/etc/dhcp/dhclient.d/chrony.sh
/etc/kernel/postinst.d/51-dracut-rescue-postinst.sh
/etc/profile.d/256term.sh


3)使用正则表达式查找

[root@centos7 ~]# locate -r "/[a-zA-Z]\{0,2\}_dir$"                
/root/abc/aa_dir
/root/abc/bb_dir


4)查看updatedb的配置文件 /etc/updatedb.conf

[root@centos7 ~]# cat /etc/updatedb.conf 
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"

第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否进行限制搜索。

第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。

第二行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索。不同后缀之间用空格隔开。

第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索。

看这个文件的目的:

  updatedb之后使用locate仍然找不到想要文件,查看检查挂载的目录是否被忽略了,如果需要搜索挂在的目录,自己开启即可。
 

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值