文章目录
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
前 1
前 2
前 3
前 4
前 5
453453
后 1
后 2
后 3
后 4
后 5
[root@VM-4-8-centos bamboo]# grep -A 5 '453453' bamboo.txt
453453
后 1
后 2
后 3
后 4
后 5
[root@VM-4-8-centos bamboo]# grep -B 5 '453453' bamboo.txt
前 1
前 2
前 3
前 4
前 5
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"