grep文件内容过滤及find文件目录查找

  • 文件内容过滤
  • 一、grep文件内容过滤
  • 1.命令格式及常用选项
  • 二、find文件及目录过滤
  • 1.命令格式及常用选项
  • 2.find命令的额外处理命令


文件内容过滤

当我们查看文件的时候往往会有一些很大的文件,但是我们需要查看的数据只有小小的一部分,这个时候我们就需要用到文件内容过滤来高速简洁的查找到自己需要的信息。

一、grep文件内容过滤

1.命令格式及常用选项

用于查找指定文件中符合条件的字符串,可以用正则表达式搜索文件中的字符串,并将匹配的字符串打印出来
命令格式:grep [-选项…] 查找条件 文件名

  • 常用短选项:
    -n 显示查找信息的行号
    -i 忽略字符串大小写显示
    -v 显示排除字符串内容的行(排除了查找条件)
  • 常用正则表达式:
    -^字符串 显示以该字符串为开头的行
    -字符串$ 显示以该字符串为结尾的行
    -^ $ 显示空行

示例:

[root@jiangjiang /]# grep -n root /etc/passwd  //查找包含root的行并显示行号显示
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

[root@jiangjiang /]# grep -n -i dns /etc/passwd //查找包含dns的行不论大小写并且显示行号显示
28:unbound:x:994:989:Unbound DNS resolver:/etc/unbound:/sbin/nologin
40:avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

[root@jiangjiang /]# grep -n -v nologin /etc/passwd  //查找不包含nologin的行并显示行号显示
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
35:named:x:25:25:Named:/var/named:/bin/false
44:user1:x:1002:1659::/home/user1:/bin/bash
45:user2:x:1003:1003::/home/user2:/bin/bash

[root@jiangjiang /]# grep -n ^root /etc/passwd //查找以root为开头的行并显示行号显示
1:root:x:0:0:root:/root:/bin/bash

[root@jiangjiang /]# grep -n bash$ /etc/passwd //查找以bash为结尾的行并显示行号显示
1:root:x:0:0:root:/root:/bin/bash
44:user1:x:1002:1659::/home/user1:/bin/bash
45:user2:x:1003:1003::/home/user2:/bin/bash

[root@jiangjiang /]# grep -v ^# /etc/fstab | grep -v ^$ -n  //查找不包含以#为开头的注释内容及不包含空格行并以显示行号的方式显示
2:/dev/mapper/centos-root /                       xfs     defaults        0 0
3:UUID=dbfac77f-f4d8-4f16-a6ba-ae40649d37ff /boot                   xfs     defaults        0 0
4:/dev/mapper/centos-swap swap                    swap    defaults        0 0

二、find文件及目录过滤

1.命令格式及常用选项

查找文件或目录所在的路径有which、locate、find,但是which是用于查找可执行文件的;而locate和find都可以查找普通文件;但是locate是在/var/mlocate/mlocate.db文件里面查找指定文件的路径,而find则是在指定目录下递归查找符合指定条件的文件 相比较于locate更详细

  • find:根据预设的条件递归查找文件或目录所在位置
  • 命令格式:find 查找路径 -查找条件1 -查找条件2 … [-exec 处理命令 {} \;]
    – -exec 处理命令 可以接受额外的处理命令来对find查找出来的结果进行处理(-exec 直接执行 -ok需确认执行 -delete 删除)
    – {} 表示find查找出来的结果被放置在{}中
    – \; 表示额外处理命令结束
  • 常用选项:
    –type:指定类型 f(文件) d(目录) l(链接文件)
    –name:指定查找的文件或目录名
    –iname:表示指定的文件或目录名忽略大小写
    –size:指定文件或目录的大小 +(大于) -(小于) k、M、G
    –a:表示的多个条件同时满足(并且)
    –o:表示多个条件满足一个就行(或者)
    –user:用户名 表示查找指定某一用户的文件
    –mtime:表示按文件被修改时间来查找文件;+ (代表多少天之前)、 -(代表多少天之内)、 0(表示24小时之内)

示例:

[root@jiangjiang /]# find /kk/ -type f //查找/kk目录下的文件
/kk/3k1.txt
/kk/3k2.txt
/kk/3k3.txt
/kk/3k4.txt
/kk/3k5.txt

[root@jiangjiang /]# find /kk/ -type d //查找/kk目录下的目录
/kk/
/kk/kkk
/kk/2k1
/kk/2k2
/kk/2k3
/kk/2k4
/kk/2k5

[root@jiangjiang /]# find /kk/ -type l //查找/kk目录下的链接文件
/kk/jinx.txt

[root@jiangjiang /]# find /kk/ -name 3k* -type f //查找/kk目录下名字为3k开头的文件
/kk/3k1.txt
/kk/3k2.txt
/kk/3k3.txt
/kk/3k4.txt
/kk/3k5.txt

[root@jiangjiang /]# touch /kk/3K{1..3}.txt
[root@jiangjiang /]# find /kk/ -iname 3*.txt -type f //查找/kk目录下名字为3开头的.txt文件且忽略大小写
/kk/3k1.txt
/kk/3k2.txt
/kk/3k3.txt
/kk/3k4.txt
/kk/3k5.txt
/kk/3K1.txt
/kk/3K2.txt
/kk/3K3.txt

[root@jiangjiang /]# find /var/log/ -size +2M -type f //查找/var/log/目录下大于2M的文件
/var/log/audit/audit.log
/var/log/anaconda/journal.log

[root@jiangjiang /]# find /var/log/ -size +200k -a -size -5M -type f //查找/var/log/目录下大于200k且小于5M的文件
/var/log/lastlog
/var/log/anaconda/syslog
/var/log/anaconda/packaging.log
/var/log/anaconda/journal.log
/var/log/messages-20220726
/var/log/messages-20220619

[root@jiangjiang /]# find /var/log/ -mtime +60 -a -size -10k -type f //查找/var/log/目录下修改时间在60天之前且小于10k的文件
/var/log/tallylog
/var/log/grubby_prune_debug
/var/log/cups/error_log
/var/log/cups/page_log
/var/log/cups/access_log-20220222
/var/log/cups/access_log-20220412
/var/log/cups/access_log-20220421
/var/log/anaconda/ifcfg.log
/var/log/anaconda/ks-script-0eAZRY.log
/var/log/firewalld
/var/log/yum.log
/var/log/vmware-network.8.log
/var/log/vmware-network.7.log
/var/log/vmware-network.6.log
/var/log/spooler-20220606
/var/log/vmware-network.9.log

[root@jiangjiang /]# find /home/ -mtime +30 -o -size +1G  //查找/home/目录下修改时间在30天之前或者大于1G的文件
/home/
/home/xiaohu/.mozilla
/home/xiaohu/.mozilla/extensions
/home/xiaohu/.mozilla/plugins
/home/xiaohu/.bash_logout
/home/xiaohu/.bash_profile
/home/xiaohu/.bashrc
/home/xiaohu/.cache
/home/xiaohu/.config
/home/xiaohu/.config/abrt
/home/user1/.mozilla
/home/user1/.mozilla/extensions
/home/user1/.mozilla/plugins
/home/user1/.bash_logout
/home/user1/.bash_profile
/home/user1/.bashrc
/home/user2/.mozilla
/home/user2/.mozilla/extensions
/home/user2/.mozilla/plugins
/home/user2/.bash_logout
/home/user2/.bash_profile
/home/user2/.bashrc

注意:find命令用来查找用户文件的时候出现在/proc的报错可以直接忽略,查找不到的这些文件是在你刚执行find命令递归查找时已经找到了,但是在准备打印出来的时候又找不到该文件才产生的报错,一般来讲 /proc这个目录是用来存放你内存里的数据的,而内存里的数据是时有时无的、飘忽不定的,所以可以忽略这。

示例:

[root@jiangjiang /]# find / -user user2
find: ‘/proc/24215/task/24215/fd/5’: 没有那个文件或目录
find: ‘/proc/24215/task/24215/fdinfo/5’: 没有那个文件或目录
find: ‘/proc/24215/fd/6’: 没有那个文件或目录
find: ‘/proc/24215/fdinfo/6’: 没有那个文件或目录
/var/spool/mail/user2
/home/user2
/home/user2/.mozilla
/home/user2/.mozilla/extensions
/home/user2/.mozilla/plugins
/home/user2/.bash_logout
/home/user2/.bash_profile
/home/user2/.bashrc
/home/user2/.cache
/home/user2/.cache/abrt
/home/user2/.cache/abrt/lastnotification
/home/user2/.config
/home/user2/.config/abrt
/home/user2/.bash_history

2.find命令的额外处理命令

find命令有着自己的额外处理命令
-exec 处理命令 {} \;
除处理命令外其他为固定格式
-ok 处理命令{} \;
确认处理命令是否操作
-delete
删除find查询结果

示例:

[root@jiangjiang /]# ls /kk 
2k1  2k3  2k5      3K1.txt  3K2.txt  3K3.txt  3k5.txt   kkk
2k2  2k4  3k1.txt  3k2.txt  3k3.txt  3k4.txt  jinx.txt
[root@jiangjiang /]# find /kk/ -mtime 0 -a -name '3k*' -type f -exec mv {} /kk/kkk/ \;
[root@jiangjiang /]# ls /kk/
2k1  2k2  2k3  2k4  2k5  3K1.txt  3K2.txt  3K3.txt  jinx.txt  kkk
[root@jiangjiang /]# ls /kk/kkk/
3k1.txt  3k2.txt  3k3.txt  3k4.txt  3k5.txt

[root@jiangjiang /]# ls /kk/
2k1  2k2  2k3  2k4  2k5  3K1.txt  3K2.txt  3K3.txt  jinx.txt  kkk
[root@jiangjiang /]# find /kk/ -mtime 0 -a -name '2k*' -type d -ok mv {} /kk/kkk/ \;
< mv ... /kk/2k1 > ? y
find: ‘/kk/2k1’: 没有那个文件或目录
< mv ... /kk/2k2 > ? y
find: ‘/kk/2k2’: 没有那个文件或目录
< mv ... /kk/2k3 > ? y
find: ‘/kk/2k3’: 没有那个文件或目录
< mv ... /kk/2k4 > ? y
find: ‘/kk/2k4’: 没有那个文件或目录
< mv ... /kk/2k5 > ? y
find: ‘/kk/2k5’: 没有那个文件或目录
[root@jiangjiang /]# ls /kk/
3K1.txt  3K2.txt  3K3.txt  jinx.txt  kkk
[root@jiangjiang /]# ls /kk/kkk/
2k1  2k2  2k3  2k4  2k5  3k1.txt  3k2.txt  3k3.txt  3k4.txt  3k5.txt

[root@jiangjiang /]# ls /kk/jk/
3KKK1.txt  3KKK2.txt  3KKK3.txt  3KKK4.txt  3KKK5.txt
[root@jiangjiang /]# find /kk/jk/  -mtime 0 -a -name '*K*'  -type f -delete 
[root@jiangjiang /]# ls /kk/jk/
[root@jiangjiang /]#