该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。
该指令只能用于查找二进制文件、源代码文件和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作用相反。
分组及引用:
分组:匹配的是重复的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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?