Linux 中常用的查找、过滤、替换的命令

1、查找命令

1.1 find

基本格式:find path expression

1.1.1 按照文件名查找
(1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找
(2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf
(3)find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件
(4)find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件
1.1.2 按照文件特征查找
(1)find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)
(2)find / -atime -2   # 查找在系统中最后48小时访问的文件
(3)find / -empty   # 查找在系统中为空的文件或者文件夹
(4)find / -group cat   # 查找在系统中属于 group为cat的文件
(5)find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)
(6)find / -mtime -1   #查找在系统中最后24小时里修改过的文件
(7)find / -user fred   #查找在系统中属于fred这个用户的文件
(8)find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
(9)find / -size -1000k   #查找出小于1000KB的文件
1.1.3 使用混合查找方式查找文件

参数有: !,-and(-a),-or(-o)。

(1)find /tmp -size +10000c -and -mtime +2   #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件
(2)find / -user fred -or -user george   #在/目录下查找用户是fred或者george的文件文件
(3)find /tmp ! -user panda  #在/tmp目录中查找所有不属于panda用户的文件

2、过滤命令

2.1 grep

语法:
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

2.1.1 主要参数
[options]主要参数:
  -c:只输出匹配行的计数。
  -i:不区分大小写
  -h:查询多文件时不显示文件名。
  -l:查询多文件时只输出包含匹配字符的文件名。
  -n:显示匹配行及行号。
  -s:不显示不存在或无匹配文本的错误信息。
  -v:显示不包含匹配文本的所有行。
  -r:递归查找子目录

pattern正则表达式主要参数:
  \: 忽略正则表达式中特殊字符的原有含义。
  ^:匹配正则表达式的开始行。
  $: 匹配正则表达式的结束行。
  \<:从匹配正则表达式的行开始。
  \>:到匹配正则表达式的行结束。
  [ ]:单个字符,如[A]即A符合要求 。
  [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
  .:所有的单个字符。
  * :有字符,长度可以为0。
2.1.2 实例查找目录中文件
# 显示所有以d开头的文件中包含 test的行
[root@VM-4-8-centos bamboo]# ls
dad.txt  dancer.txt  desk.txt  double.txt
[root@VM-4-8-centos bamboo]# cat dad.txt
this is a test file
[root@VM-4-8-centos bamboo]# cat dancer.txt
dancer test
[root@VM-4-8-centos bamboo]# cat desk.txt
desk
[root@VM-4-8-centos bamboo]# cat double.txt
number double
[root@VM-4-8-centos bamboo]# grep 'test' d*
dad.txt:this is a test file
dancer.txt:dancer test

# 可以看到找到了 dad.txt 和 dancere.txt 两个文件
# 也可以指定几个文件
[root@VM-4-8-centos bamboo]# grep 'test' dad.txt dancer.txt desk.txt
dad.txt:this is a test file
dancer.txt:dancer test
# -r 递归查找当前目录及子目录下包含 bamboo 的文件
[root@VM-4-8-centos bamboo]# grep 'bamboo' -r .
./bamboo.txt:bamboo
./subFolder/zhuzi.txt:bamboo zhuzi
[root@VM-4-8-centos bamboo]# grep 'bamboo' *.txt
bamboo.txt:bamboo
# -v 输出不匹配的行
[root@VM-4-8-centos bamboo]# cat -n bamboo.txt
     1  bamboo
     2  hello
     3  world
     4  china
[root@VM-4-8-centos bamboo]# grep -n 'bamboo' bamboo.txt
1:bamboo
[root@VM-4-8-centos bamboo]# grep -nv 'bamboo' bamboo.txt
2:hello
3:world
4:china
# 可以看到不匹配的行是 2、3、4
2.1.3 结合 ps 使用
# 查找 redis 的进程,grep 后可以跟端口号、应用名
[root@VM-4-8-centos bamboo]# ps -ef|grep redis
root      1074     1  0 Oct06 ?        00:00:43 /usr/local/bin/redis-server 127.0.0.1:6379
root     22282 20092  0 09:07 pts/1    00:00:00 grep --color=auto redis

[root@VM-4-8-centos bamboo]# ps -ef|grep 6379
root      1074     1  0 Oct06 ?        00:00:43 /usr/local/bin/redis-server 127.0.0.1:6379
root     22368 20092  0 09:08 pts/1    00:00:00 grep --color=auto 6379
2.1.4 日志过滤使用
# -A 表示查看匹配行之后的多少行记录
# -B 表示查看匹配行之前的多少行记录
# -n n 是数字,表示看匹配行前后 n 行的记录
# 比如这个查询匹配后 10 行的日志
grep -A  10 '2021-10-08 18:01:01.353' xxx.log

# 比如这个查询匹配前 10 行的日志
grep -B  10 '2021-10-08 18:01:01.353' xxx.log

# 比如这个查询匹配前后 10 行的日志
grep -10 '2021-10-08 18:01:01.353' xxx.log

# 可以看一五下面的例子
[root@VM-4-8-centos bamboo]# grep -5 '453453' bamboo.txt 12345
45345312345
[root@VM-4-8-centos bamboo]# grep -A 5 '453453' bamboo.txt 
45345312345
[root@VM-4-8-centos bamboo]# grep -B 5 '453453' bamboo.txt  12345
453453

3、替换

3.1 sed

3.1.1 替换目录下所有匹配的文件中的字符

比如下面的目录 :
可以看到,通过过滤 bamboo 关键字,查找到当前目录下的 bamboo.txt 有这个关键字,还有子目录下:zhuzi.txt 也有这个关键字,现在我们就替换这 2 个文件中的 bamboo 为 yeyinzhu.

[root@VM-4-8-centos bamboo]# pwd
/root/bamboo
[root@VM-4-8-centos bamboo]# ls
bamboo.txt  dad.txt  dancer.txt  desk.txt  double.txt  subFolder
[root@VM-4-8-centos bamboo]# grep 'bamboo' ./ -r
./bamboo.txt:bamboo
./subFolder/zhuzi.txt:bamboo zhuzi

替换命令

#命令:sed -i 's/bamboo/yeyinzhu/g' `grep 'bamboo' -rl ./`
# ` 这个符号是 tab 键上的那个符号
[root@VM-4-8-centos bamboo]# sed -i 's/bamboo/yeyinzhu/g' ` grep 'bamboo' -rl ./`

# 再次执行命令后可以看到没有找到匹配的文件了
[root@VM-4-8-centos bamboo]# grep 'bamboo' ./ -r

# 然后查看文件,bamboo 已经被替换为 yeyinzhu 了。
[root@VM-4-8-centos bamboo]# cat bamboo.txt 
yeyinzhu
hello
world
china
[root@VM-4-8-centos bamboo]# cat subFolder/zhuzi.txt 
yeyinzhu zhuzi
3.1.2 替换目录下特定文件
# 替换 dad.txt 中 this 为 that 
[root@VM-4-8-centos bamboo]# cat dad.txt 
this is a test file
[root@VM-4-8-centos bamboo]# sed -i 's/this/that/g' dad.txt 
[root@VM-4-8-centos bamboo]# cat dad.txt 
that is a test file
3.1.3 替换的字符串有单引号怎么做
# 替换的信息用 " 包裹即可。
[root@VM-4-8-centos bamboo]# cat libs/config_pros.lua 
_M.active_env = 'pro'
[root@VM-4-8-centos bamboo]# sed -i "s/_M.active_env = 'pro'/_M.active_env = 'pre'/g" libs/config_pros.lua
[root@VM-4-8-centos bamboo]# cat libs/config_pros.lua 
_M.active_env = 'pre'

引伸一下,如果是直接 ssh 登录远程机器替换的话,使用如下的命令

# 看一下此时的值是 pre
[root@VM-4-8-centos bamboo]# cat libs/config_pros.lua 
_M.active_env = 'pre'
# 本地写一个脚本,ssh 登录到这个机器,然后修改 pre 为 pro,看一下脚本内容:
╰ cat tmpSed.sh
#!/bin/bash
ip=xxx
DDIR_APP=xxx
ssh root@${ip} "cd ${DDIR_APP};sed -i \"s/_M.active_env = 'pre'/_M.active_env = 'pro'/g\" libs/config_pros.lua"
# 执行脚本

# 然后再看一下,此时已经修改成功
[root@VM-4-8-centos bamboo]# cat libs/config_pros.lua 
_M.active_env = 'pro
3.1.4 替换的字符串有双引号怎么做
# 替换的信息用 ' 包裹即可。
[root@VM-4-8-centos bamboo]# cat libs/config_pros.lua 
_M.active_env = "pro"
[root@VM-4-8-centos bamboo]# sed -i 's/_M.active_env = "pre"/_M.active_env = "pro"/g' libs/config_pros2.lua 
[root@VM-4-8-centos bamboo]# cat libs/config_pros2.lua 
_M.active_env = "pre"

引伸一下,如果是直接 ssh 登录远程机器替换的话,使用如下的命令

# 看一下此时的值是 pre
[root@VM-4-8-centos libs]# cat config_pros2.lua 
_M.active_env = "pro"
# 本地写一个脚本,ssh 登录到这个机器,然后修改 pro 为 pre,看一下脚本内容:
╰ cat tmpSed2.sh
#!/bin/bash
ip=xxx
DDIR_APP=xxx
ssh root@${ip} "cd ${DDIR_APP}/;sed -i 's/_M.active_env = \"pro\"/_M.active_env = \"pre\"/g' libs/config_pros2.lua"
# 执行脚本

# 然后再看一下,此时已经修改成功
[root@VM-4-8-centos libs]# cat config_pros2.lua 
_M.active_env = "pre"