06grep与find命令详解
1. grep 命令
grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep [选项][文件]”。
grep 命令的参数及其作用如下:
-b 将可执行文件(binary)当做文本文件(text)来搜索
-c 仅显示找到的行数
-i 忽略大小写
-n 显示行号 ***常用***
-v 反向选择——仅列出没有“关键字”的行 ***常用***
这些参数中,-n 和 -v 这两个参数几乎能完成您日后 80% 的工作需要。
//用grep命令来查找/etc/passwd 文件中包含“/sbin/nologin”的行
[root@bogon test]# grep -n /sbin/nologin /etc/passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
//省略部分输出信息
grep与正则表达式的大批额使用,请参考“21grep与正则表达式”
2. find 命令
find 命令用于按照指定条件查找文件,格式为 “find [查找路径] 寻找条件 操作”。
Linux中,搜索工作都是通过 find 命令来完成的,它可以使用不同的文件特性作为寻找条件(如文件名、大小、修改时间、权限信息),一旦匹配成功则默认将信息显示到屏幕上。
find 命令的参数及其作用如下:
-name 匹配名称
-perm 匹配权限
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间(-n 指 n 天以内, +n 指 n 天之前)
-atime -n +n 匹配访问文件的时间(-n 指 n 天以内, +n 指 n 天之前)
-ctime -n +n 匹配修改文件权限的时间(-n 指 n 天以内, +n 指 n 天之前)
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-newer f1 !f2 匹配比文件f1新但比f2旧的文件
--type b/d/c/p/l/f 匹配文件类型(块设备、目录、字符设备、管道、链接文件、文本文件)
-size 匹配文件的大小(+50KB查找超过50KB的文件,-50KB查找小于50KB的文件)
-prune 忽略某个目录
-exec ..... {}\; 后面可跟进一步处理搜索结果的命令
其中, -exec 参数用于把 find 命令搜索到的结果交由紧随其后的命令做进一步处理。
在 /etc 目录中,如果想要获取到该目录中所有以 host 开头的文件列表,可以执行如下命令:
#1.常规搜索
[root@bogon test]# find /etc -name "host*" -print
/etc/selinux/targeted/active/modules/100/hostname
/etc/host.conf
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/hostname
#2.1.在当前目录下,查找类型为文本文件,大小大于100M的文件
[oracle@bat3963 ~]$ find . -type f -size +100M
./product/11.2.0/dbhome_1/bin/oracle
./product/11.2.0/dbhome_1/javavm/admin/classes.bin
./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190215144109_tmp.dmp
./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190303092619_tmp.dmp
./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190326162200_tmp.dmp
./product/11.2.0/dbhome_1/lib/libserver11.a
#2.2.使用管道(|)无法传递 find 的输出
[oracle@bat3963 ~]$ find . -type f -size +100M | ls -l
total 88
drwxr-xr-x. 2 oracle users 4096 Nov 25 2016 Desktop
drwxr-xr-x. 2 oracle users 4096 Nov 25 2016 Documents
drwxr-xr-x. 2 oracle users 4096 Nov 25 2016 Downloads
drwxr-xr-x. 2 oracle users 4096 Nov 25 2016 Music
drwxr-xr-x. 2 oracle users 4096 Nov 25 2016 Pictures
#2.3.对于 find 的输出参数,可以使用 xargs 传递
[oracle@bat3963 ~]$ find . -type f -size +100M |xargs ls -l
./product/11.2.0/dbhome_1/javavm/admin/classes.bin
-rwxrwxr-x. 1 oracle users 229064198 Nov 22 2016 ./product/11.2.0/dbhome_1/lib/libserver11.a
-rw-r-----. 1 oracle users 280539136 Feb 15 2019 ./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190215144109_tmp.dmp
-rw-r-----. 1 oracle users 279851008 Mar 3 2019 ./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190303092619_tmp.dmp
-rw-r-----. 1 oracle users 281624576 Apr 30 2017 ./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190326162200_tmp.dmp
#3.find 配合 du 命令可以更方便的查看文件的大小
[oracle@bat3963 ~]$ find . -type f -size +100M |xargs du -h
229M ./product/11.2.0/dbhome_1/bin/oracle
105M ./product/11.2.0/dbhome_1/javavm/admin/classes.bin
268M ./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190215144109_tmp.dmp
267M ./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190303092619_tmp.dmp
269M ./product/11.2.0/dbhome_1/rdbms/log/upgrade_20190326162200_tmp.dmp
219M ./product/11.2.0/dbhome_1/lib/libserver11.a
#4.du 和 df 的区别
#du查看目录大小,df查看磁盘使用情况,-h用于指定以K,M,G为单位,提高信息的可读性
[oracle@bat3963 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_bat3995-lv_root 60G 52G 5.4G 91% /
tmpfs 6.9G 133M 6.7G 2% /dev/shm
/dev/sda1 485M 39M 421M 9% /boot
#find命令 -exec ..... {}\;参数使用
#1.开始时,0611文件夹中只有test和findtest两个文件夹,并且test文件夹中有四个文件,findtest为空
[root@bogon 0611]# ls -R
.:
findtest test
./findtest:
./test:
560_file aaa.txt aa.txt a.txt
#2.执行find命令,将在test文件夹中找的的文件名以“a”打头的文件全部复制到findtest文件夹中
[root@bogon 0611]# find ./test -name "a*" -exec cp -a {} ./findtest/ \;
#3.再次查看文件夹,发现已经将查找到的文件都保存到了findtest中
[root@bogon 0611]# ls -R
.:
findtest test
./findtest:
aaa.txt aa.txt a.txt
./test:
560_file aaa.txt aa.txt a.txt
道虽迩,不行不至;事虽小,不为不成。