外观
搜索命令
whereis 命令
whereis 是搜索命令的命令,也就是说whereis不能搜索普通文件,而只能搜索系统命令,基本信息如下:
- 命令名称:whereis
- 英文原意:locate the binary,source,and manual page files for a command
- 所在路径:/usr/bin/whereis
- 执行权限:所有用户
- 功能描述:查找二进制命令、源文件和帮助文档的路径
命令格式:whereis [选项] 参数
- 选项:
-b:只查找二进制文件-B 目录:只在设置的目录下查找二进制文件-m:只查找说明文件-M 目录:只在设置的目录下查找说明文件-s:只查找原始代码文件-S 目录:只在设置的目录下查找原始代码文件-f:不显示文件名前的路径名称
which 命令
which 也是搜索系统命令的命令,和whereis的区别在于,whereis命令可以在查找二进制命令的同时,查找帮助文档的位置,而which命令在查找到二进制命令的同时,如果这个命令有别名,则还可以查到别名命令。基本信息如下:
- 命令名称:which
- 英文原意:shows the full path of (shell) commands
- 所在路径:/usr/bin/which
- 执行权限:所有用户
- 功能描述:列出二进制命令路径和别名。
which只会在环境变量$PATH设置的目录里查找符合条件的命令
命令格式:which [选项] 参数
find 命令
find命令用来在指定目录下查找文件,基本信息如下:
- 命令名称:find
- 英文原意:search for files in a directory hierarchy
- 所在路径:/bin/find
- 执行权限:所有用户
- 功能描述:在指定目录中搜索文件
命令格式:find [搜索路径] [选项]
- 搜索路径:省略则默认为当目录,相当于 "find ."
- 选项:
-name 范本样式:按照文件名称搜索,支持通配符模糊查询-iname 范本样式:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别-inum inode编号:查找符合指定的inode编号的文件或目录-path 范本样式:查找路径包含范本样式的文件或目录-regex 范本样式:正则表达式搜索-iregex 范本样式:同"-regex",忽略大小写-size [+|-]文件大小[cwbkMG]:查找符合指定的文件大小的文件- "+" 的意思是搜索比指定大小还要大的文件,"-" 的意思是搜索比指定大小还要小的文件
- "cwbkMG"是单位,c——字节,w——字(2字节),b——块(512字节),k——千字节,M——兆字节,G——吉字节。如果不写单位默认是b
-atime [+|-]天数:按照文件最后一次访问时间搜索,单位每天- "+"、"-"的含义,例如"5"表示恰好5天前的那一天,"+5"超过5天前的时间,"-5"5天内的时间。(以下按时间搜索选项中"+"、"-"含义相同)
-mtime [+|-]天数:按照文件数据最后一次修改时间搜索,单位每天-ctime [+|-]天数:按照文件元数据(如权限等)最后一次修改时间搜索,单位每天-amin [+|-]分钟数:按照文件最后一次访问时间搜索,单位每分钟-mmin [+|-]分钟数:按照文件数据最后一次修改时间搜索,单位每分钟-cmin [+|-]分钟数:按照文件元数据(如权限等)最后一次修改时间搜索,单位每分钟-perm [+|-]权限数值:查找符合指定的权限数值的文件或目录。例如,权限数值为"766"表示权限恰好等于766,"-766"表示文件权限必须全部包含766,"+766"表示文件权限包含766任意一个权限-uid 用户ID:查找所有者是指定用户ID的文件-user 用户名:查找所有者是指定用户名的文件-gid 组ID:查找所有组是指定组ID的文件-group 组名:查找所有组是指定组名的文件-nouser:查找没有所有者的文件- 按照所有者和所有组搜索时,"-nouser"选项比较常用,主要用于查找垃圾文件。没有所有者的文件比较少见,那就是外来文件,比如光盘和U盘的文件是由Windows复制的,在Linux中查看就是没有所有者的文件,再比如手工源码包安装的文件也可能没有所有者
-type 文件类型:只寻找符合指定的文件类型的文件f——普通文件,l——符号连接,d——目录,c——字符设备,b——块设备,s——套接字,p——Fifo
-empty:查找文件大小为0的文件-maxdepth 目录层级数:设置搜索的最大目录层级-mindepth 目录层级:设置搜索的最小目录层级-exec 执行指令:把find命令查找结果交由"-exec"调用的命令来处理- 格式:
find [搜索路径] [选项] -exec 命令 {} \;, 其中"{}"代表find命令的查询结果
- 格式:
-ok 执行指令:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户是否执行-prune:不寻找字符串作为寻找文件或目录的范本样式-a:and 逻辑与-o: or 逻辑或-not:not 逻辑非
示例:
#==================根据文件名或者正则表达式进行匹配=====================
#列出当前目录及子目录下所有文件和文件夹
[root@localhost ~]# find .
#在`/home`目录下查找以.txt结尾的文件名
[root@localhost ~]# find /home -name "*.txt"
#同上,但忽略大小写
[root@localhost ~]# find /home -iname "*.txt"
#当前目录及子目录下查找所有以.txt和.pdf结尾的文件
[root@localhost ~]# find . \( -name "*.txt" -o -name "*.pdf" \)
或
[root@localhost ~]# find . -name "*.txt" -o -name "*.pdf"
#查找路径包含local的文件或者目录
[root@localhost ~]# find /usr/ -path "*local*"
#基于正则表达式匹配文件路径
[root@localhost ~]# find . -regex ".*\(\.txt\|\.pdf\)$"
#=====================借助`-exec`选项与其他命令结合使用==================
#找出当前目录下所有root的文件,并把所有权更改为用户tom
[root@localhost ~]# find .-type f -user root -exec chown tom {} \;
#找出自己家目录下所有的.txt文件并删除,删除前先询问
[root@localhost ~]# find $HOME/. -name "*.txt" -ok rm {} \;
#查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
[root@localhost ~]# find . -type f -name "*.txt" -exec cat {} \;> all.txt
#将30天前的.log文件移动到old目录中
[root@localhost ~]# find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
#找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
[root@localhost ~]# find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
#========================逻辑运算符==========================
#查找文件大小超过2k并且是普通文件类型的文件
[root@localhost ~]# find . -size +2k -a -type f
#找出/home下不是以.txt结尾的文件
[root@localhost tmp]# find . -not -name "*.txt"
或
[root@localhost ~]# find /home ! -name "*.txt"
#======================搜索但跳出指定的目录===================
#查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
[root@localhost ~]# find . -path "./sk" -prune -o -name "*.txt"locate 命令
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录(find 是去硬盘找),而是搜索一个数据库/var/lib/mlocate/mlocate.db,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件,为了避免这种情况,可以在使用locate之前,先使用updatedb命令手动更新数据库。locate命令基本信息如下:
- 命令名称:locate
- 英文原意:find files by name
- 所在路径:/usr/bin/locate
- 执行权限:所有用户
- 功能描述:按照文件名搜索文件
命令格式:locate [选项] 文件名
- 选项:
-d: 指定资料库的路径。默认是/var/lib/mlocate/mlocate.db-n:至多显示n个输出
数据库配置文件(/etc/updatedb.conf)内容说明:
[root@localhost ~]# cat /etc/updatedb.conf
#开启搜索限制,也就是让这个文件生效
PRUNE_BIND_MOUNTS = "yes"
#在locate执行搜索时,禁止搜索这些文件类型
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse 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"
#在locate执行搜索时,禁止搜索这些扩展名的文件
PRUNENAMES = ".git .hg .svn"
##在locate执行搜索时,禁止搜索这些系统目录
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"locate优缺点: 优点:按照数据库搜索,搜索速度快,消耗资源小 缺点:只能按照文件名来搜索文件,而不能执行更复杂的搜索,比如按照权限、大小、修改时间等
grep 命令
grep命令的作用是在文件中提取和匹配符合条件的字符串行,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。基本信息如下:
- 命令名称:grep
- 英文原意:global search regular expression(RE) and print out the line
- 所在路径:/usr/bin/grep
- 执行权限:所有用户
- 功能描述:全面搜索正则表达式并把行打印出来
命令格式:grep [选项] 搜索内容 文件名
- 选项:
-i:忽略大小写-n:输出行号-v:反向查找-d 动作: 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。动作包含:read、recurse、skip-R或-r: 此参数的效果和指定“-d recurse”参数相同,递归查找目录下的所有文件内容--color=auto:搜素出的关键字用颜色高亮显示
find也是搜索命令,那么find与grep命令有什么区别呢? find:find命令用于在系统中搜索符合条件的文件名,如果需要模糊查询,则使用通配符进行匹配,通配符是完全匹配。(find命令也可以通过"-regex"选项,把匹配规则转为正则表达式规则) grep:grep命令用于在文件中搜索符合条件的字符串,如果需要模糊查询,则使用正则表达式进行匹配,正则表达式是包含匹配。
通配符与正则表达式的区别
- 通配符:一般用于匹配文件名,完全匹配
?:匹配一个任意字符*:匹配0个或多个任意字符,也就是可以匹配任何内容[]:匹配中括号里任意一个字符。例如,[abc]代表一定匹配一个字符,或是a,或是b,或是c[-]:匹配中括号里任意一个字符,"-"代表一个范围。例如,[a-z]代表匹配一个小写字母[^]:逻辑非,表示匹配不是中括号里的一个字符。例如,[^0-9]代表匹配一个不是数字的字符- 正则表达式:一般用于匹配字符串
?:匹配前一个字符重复0次或1次*:匹配前一个字符重复0次或多次[]:匹配中括号里任意一个字符。例如,[abc]代表一定匹配一个字符,或是a,或是b,或是c[-]:匹配中括号里任意一个字符,"-"代表一个范围。例如,[a-z]代表匹配一个小写字母[^]:逻辑非,表示匹配不是中括号里的一个字符。例如,[^0-9]代表匹配一个不是数字的字符^:匹配行首$:匹配行尾
示例:
#在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
[root@localhost ~]# grep match_pattern file_name
或
[root@localhost ~]# grep "match_pattern" file_name
#在多个文件中查找:
[root@localhost ~]# grep "match_pattern" file_1 file_2 file_3
#标记匹配颜色 --color=auto 选项:
[root@localhost ~]# grep "match_pattern" file_name --color=auto
#在当前目录中对文本进行递归搜索
[root@localhost ~]# grep -r "match_pattern" .
#正则匹配输出以数字开头的所有行
[root@localhost ~]# grep "^[0-9].*" file_name| 管道符
命令格式:命令1 | 命令2 "|"管道符的作用是把命令1的正确输出作为命令2的操作对象
示例1: 我们经常使用 "ll" 命令查看文件的长格式,不过在有些目录中文件很多,不如/etc/目录使用 "ll" 命令显示的内容就非常多,只能看到最后的内容而不能看到前面输出的内容,这时我们马上想到 "more" 命令可以分屏显示文件内容,一种笨方法是:
#用输出重定向,把"ll"命令的输出保存到/root/testfile
[root@localhost ~]# ll -a /etc/ > /root/testfile
#然后用more分屏显示
[root@localhost ~]# more /root/testfile这样操作实在是不方便,这时可以利用管道符,命令如下:
#把"ll"命令的输出作为"more"命令的操作对象
[root@localhost ~]# ll -a /etc/ | more示例2:
#在"ll"命令输出内容中搜索yum的文件名
[root@localhost ~]# ll -a /etc/ | grep yum示例3:
#统计具体的网络连接数量("grep"命令筛选,"wc"命令统计)
[root@localhost ~]# netstat -an | grep -i "ESTABLISHED" | wc -lalias 命令
alias命令用来设置指令的别名,我们可以使用该命令可以将一些较长的命令进行简化。
alias基本使用方法:
- 打印已经设置的命令别名
alias或alias -p
- 给命令设置别名
- 格式:
alias 新的命令='实际命令'。必须使用单引号''实际命令引起来,防止特殊字符导致错误 - 例如:
alias l='ls -lsh',现在只用输入 "l" 就可以列出目录了,相当于输入"ls -lsh";alias ser='service network restart',现在输入"ser"就可以重启网络服务了
- 格式:
直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢? 使用编辑器打开~/.bashrc,在文件中加入别名设置,如:alias rm='rm -i',保存后执行source ~/.bashrc,这样就可以永久保存命令的别名了。因为修改的是当前用户目录下的~/.bashrc文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改/etc/bashrc文件就可以了。