文章目录
SHELL编程四剑客
SHELL编程四剑客介绍
- 在SHELL编程工具中,四剑客工具的使用更加广泛,SHELL编程四剑客包括:Find、Sed、grep、awk,熟练掌握四剑客会对SHELL编程能力有极大的提升
Find
Find介绍及参数
- Find工具主要用于操作系统文件、目录的查找。
- 语法:
find path -option [-print] [exec -ok command] {} \;
- path:查找的范围
- option:参数
- print:打印
- option常用参数:
参数 | 含义 |
---|---|
-name filename | 查找名为filename的文件 |
-type b/d/c/p/l/f | 查找块设备、目录、字符设备、管道、符号链接、普通文件 |
-size n[c] | 查长度为n块[或n字节]的文件 |
-perm | 根据执行权限查找 |
-user username | 按文件属主查找 |
-group groupname | 按组名查找 |
mtime -n+n | 根据文件更改时间查找文件,“-n"是指n天以内,”+n"是指n天以前 |
atime -n+n | 按文件访问时间查找文件 |
-ctime -n+n | 按文件创建时间查找文件 |
-mmin -n+n | 按文件更改时间查找文件,“-n"是指n分钟以内,”+n"是指n分钟以前 |
-amin -n+n | 按文件访问时间查找文件 |
-cmin -n+n | 按文件创建时间查找文件 |
-maxdepth | 查找目录级别深度 |
- Find工具"-name"示例
示例 | 含义 |
---|---|
find /data/ -name “.txt” | 查找/data/目录下后缀为.txt结尾的文件 |
find /data/ -name “[A-Z]*” | 查找/data/目录下大写字母开头的文件 |
find /data/ -name “test*” | 查找/data/目录以test开头的文件 |
- Find工具"-type"示例
示例 | 含义 |
---|---|
find /data/ -type d | 查找/data/目录下的文件夹 |
find /data/ ! -type d | 查找/data/目录下的非文件夹 |
find /data/ -type l | 查找/data/目录下的链接文件 |
find /data/ -type d | xargs chmod 775 -R | 把目录及目录下的文件权限都设为755 |
find /data/ -type f | xargs chmod 644 -R | 把目录下的文件权限都设为644 |
- Find工具"-mtime"示例
示例 | 含义 |
---|---|
atime(access time) | 文件被读取或执行的时间 |
ctime(change time) | 文件状态改变时间 |
mtime(modify time) | 文件内容被修改的时间 |
find /data/ -mtime +30 -name “*.log” | 查找30天之前被修改的log文件 |
find /data/ -mtime -30 -name “*.txt” | 查找30天以内被修改的log文件 |
find /data/ -mtime 30 -name “.txt” | 查找第30天被修改的log文件 |
find /data/ -mmin +30 -name “*.log” | 查找30分钟之前被修改的log文件 |
find /data/ -amin -30 -name “*.txt” | 查找30分钟以内被访问的log文件 |
find /data/ -cmin 30 -name “*.txt” | 查找第30分钟被修改属性的log文件 |
- Find工具参数综合示例
#查找data目录下文件类型的log文件,文件大于10k拷贝到tmp目录下
find /data/ -name "*.log" -type f -size +10k -exec cp {} /tmp/ \;
#查找data目录下的log结尾的文件,删除大于10k权限为644的文件
find /data/ -name "*.log" -type f -size +10k -perm 644 -exec rm -rf {} \;
#查找data目录下30天之前被更改过的文件大于10M的log结尾的文件,移动到tmp目录下
find /data/ -name "*.log" -type f -mtime +30 -size +10M -exec mv {} /tmp/ \;
Find示例
#在根搜索,指定后缀和软件大概名称
[root@localhost ~]# find / -name *.rpm -name lrzsz*
/mnt/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm
[root@localhost ~]#
#有后缀的不一定是软件包,可以是目录或文件;可以使用type参数区分是软件包还是文件
[root@localhost ~]# mkdir -p /tmp/lrzsz.rpm
[root@localhost ~]# find / -name *.rpm -name lrzsz*
/tmp/lrzsz.rpm
/mnt/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm
#通过type参数查找的软件包
[root@localhost ~]# find / -name *.rpm -name lrzsz* -type f
/mnt/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm
#通过type参数查找的目录
[root@localhost ~]# find / -name *.rpm -name lrzsz* -type d
/tmp/lrzsz.rpm
[root@localhost ~]#
#查找根下相同名称、类型中文件大小小于200k的文件
[root@localhost ~]# find / -name *.rpm -name lrzsz* -type f -size -200k
/mnt/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm
[root@localhost ~]#
#查找当前目录下的tar包,大小大于1M
[root@localhost ~]# find . -name *.tar.* -type f -size +100M
./mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#查找文件大小时不加"-、+",就是要精准匹配大小
[root@localhost ~]# find . -name *.tar.* -type f -size 577M
./mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#查找大于200M小于600M的tar包(参数与参数之间默认是and的关系,-a参数可以不写)
[root@localhost ~]# find . -name *.tar.* -type f -size +200M -a -size -600M
./mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#当前目录下查找tar包,指定类型文件,文件大小超过200M,文件属主为admin属组为root
[root@localhost ~]# find . -name *.tar.* -type f -size +200M -user admin -group root
./mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#在当前目录查找文件tar包,属主为admin属组为root,权限为644
[root@localhost ~]# find . -name *.tar.* -type f -user admin -group root -perm 644
./mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#加入for语句实现查找到的文件批量拷贝到其他目录
[root@localhost ~]# for i in $(find . -name *.tar.* -type f -user admin -group root -perm 644);do cp $i /tmp/;done
[root@localhost ~]# ll /tmp/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
-rw-r--r--. 1 root root 604856088 1月 29 14:11 /tmp/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#使用exec层接,做到把搜索结果批量拷贝到指定目录
[root@localhost ~]# find . -name *.tar.* -type f -user admin -group root -perm 644 -exec cp {} /tmp/ \;
[root@localhost ~]# ll /tmp/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
-rw-r--r--. 1 root root 604856088 1月 29 14:16 /tmp/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#使用xargs层接,使用-I参数做个临时缓存,再拷贝到tmp目录(效果与exec相同)
#xargs与exec的区别在于,xargs可以批量操作,而exec只能单个操作
#(xargs消耗的性能/内存是比exec要大的,所以一般情况下推荐采用exec)
[root@localhost ~]# find . -name *.tar.* -type f -size +200M | xargs -I {} cp {} /tmp/
[root@localhost ~]# ll /tmp/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
-rw-r--r--. 1 root root 604856088 1月 29 16:56 /tmp/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
[root@localhost ~]#
#使用xargs命令删除可不用加-I参数
[root@localhost ~]# find /tmp/ -name *.tar.* -type f -size +200M | xargs rm -rf {}
[root@localhost ~]# ls /tmp/
systemd-private-9eef71dd3d8d49f09671b07f5bb9f2a0-chronyd.service-Am0fRQ vmware-root_671-3988556280
[root@localhost ~]#
#查看30天前被修改的文件,并打包成tar包
[admin@jfedu01 log]$ sudo find . -type f -name "*.log" -mtime +30
./rpmsoft.log
[admin@jfedu01 log]$ sudo find . -type f -name "*.log" -mtime +30 -exec tar -czf 1.tar {} \;
[admin@jfedu01 log]$ ls
1.tar installsoft.txt rpmsoft.log
[admin@jfedu01 log]$ ll 1.tar
-rw-r--r-- 1 root root 6820 Jan 29 20:30 1.tar
[admin@jfedu01 log]$ tar -tf 1.tar
./rpmsoft.log
[admin@jfedu01 log]$
#使用-o参数同时查找不同后缀的文件
[admin@jfedu01 log]$ sudo find /var/log/ -name "*.txt" -o -name "*.log" -mmin -10
/var/log/jfedu.txt
/var/log/audit/audit.log
[admin@jfedu01 log]$
#搜索10分钟以内被更改过的文件,在搜索多类型文件的情况下,一个"-mmin"参数只能对应一个文件类型
#以下命令为例,"-mmin"参数放在最后只是过来了10分钟以内被更改过的.log文件,而没有筛选10分钟以内被更改的.txt文件
[admin@jfedu01 log]$ sudo find . -type f -name "*.txt" -o -name "*.log" -mmin -10
./jfedu.txt
./audit/audit.log
[admin@jfedu01 log]$ sudo find . -type f -name "*.log" -o -name "*.txt" -mmin -10
./audit/audit.log
./boot.log
./qcloud_action.log
./mariadb/mariadb.log
./cloud-init-output.log
./cloud-init.log
./yum.log
./tuned/tuned.log
[admin@jfedu01 log]$ sudo find . -type f -mmin -10 -name "*.log" -o -name "*.txt"
./jfedu.txt
./audit/audit.log
[admin@jfedu01 log]$ sudo find . -type f -mmin -10 -name "*.log" -o -name "*.txt"
./jfedu.txt
./audit/audit.log
./jfedu.log
[admin@jfedu01 log]$ sudo find . -type f -mmin +10 -name "*.log" -o -name "*.txt"
./jfedu.txt
./boot.log
./qcloud_action.log
./mariadb/mariadb.log
./cloud-init-output.log
./cloud-init.log
./yum.log
./tuned/tuned.log
[admin@jfedu01 log]$ sudo find . -type f -mmin +10 -name "*.log" -o -name "*.txt" -mmin +10
./jfedu.txt
./boot.log
./qcloud_action.log
./mariadb/mariadb.log
./cloud-init-output.log
./cloud-init.log
./yum.log
./tuned/tuned.log
[admin@jfedu01 log]$ sudo find . -type f -mmin +10 -name "*.log" -o -name "*.txt" -mmin -10
./boot.log
./qcloud_action.log
./mariadb/mariadb.log
./cloud-init-output.log
./cloud-init.log
./yum.log
./tuned/tuned.log
#在搜索多个文件类型时,如要更精准地搜出10分钟内更改过的文件,则两个文件类型各添加"-mmin"参数
[admin@jfedu01 log]$ sudo find . -type f -mmin -10 -name "*.log" -o -name "*.txt" -mmin -10
./audit/audit.log
./jfedu.log
[admin@jfedu01 log]$ sudo find . -type f -mmin -10 -name "*.log" -o -name "*.txt"
./jfedu.txt
./audit/audit.log
./jfedu.log
[admin@jfedu01 log]$
SED
SED介绍
- SED是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与vim编辑器类似,它一次处理一行内容,SED可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。
- 在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间(pattern space)”,紧接用SED命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。
- 逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非你使用重定向存储输出或者写入文件。
- 语法:
sed [-options] [commands] filename
- SED工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加"-i"参数文件才能彻底修改。
- SED参数:
参数 | 含义 |
---|---|
x | 指定行号 |
x,y | 指定从x到y的行号范围 |
/pattern/ | 查询包含模式的行 |
/pattern/,x | 从与pattern的匹配行到x号行之间的行 |
x,/pattern/ | 从x号行到与pattern的匹配行之间的行 |
x,y! | 查询不包括x和y行号的行 |
r | 从另一个文件中读文件 |
w | 将文本系入到一个文件 |
y | 变换字符 |
q | 第一个模式匹配完成后退出 |
l | 显示与八进制ASCⅡ码等价的控制字符 |
{} | 在定位行执行的命令组 |
p | 打印匹配行 |
= | 打印文件行号 |
a\ | 在定位行号之后追加文本信息 |
i\ | 在定位行号之前追加文本信息 |
d | 删除定位行 |
c|用新文本替换定位文本 | |
s | 使用替换模式替换相应模式 |
n | 读取下一个输入行,用下一个命令处理新的行 |
N | 将当前读入行的下一行读取到当前的模式空间 |
SED示例
#sed命令不加-i参数之前,只是演示,而不是正式修改文本内容
[root@localhost 2023-01-30]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]# sed 's/adm/admin/g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]# sed -i 's/adm/admin/g' passwd
[root@localhost 2023-01-30]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#这报错是因为sed命令最多只能识别3个斜杠,可以通过反斜杠、井号、@进行转译
[root@localhost 2023-01-30]# sed 's//sbin/nologin//bin/bash/g' passwd
sed:-e 表达式 #1,字符 9:“s”的未知选项
[root@localhost 2023-01-30]# sed 's/\/sbin\/nologin/\/bin\/bash/g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
admin:x:3:4:admin:/var/admin:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
[root@localhost 2023-01-30]# sed 's#/sbin/nologin#/bin/bash#g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
admin:x:3:4:admin:/var/admin:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
#指定只修改第二行
[root@localhost 2023-01-30]# sed '2s#/sbin/nologin#/bin/bash#g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#修改第二行和第三行的内容
[root@localhost 2023-01-30]# sed '2,3s#/sbin/nologin#/bin/bash#g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
admin:x:3:4:admin:/var/admin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#指定只修改第一列对应的字符
[root@localhost 2023-01-30]# sed 's/adm/admin/1' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]# sed 's/adm/admin/2' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:admin:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#指定打印文件内容的第一行
[root@localhost 2023-01-30]# sed -n '1p' passwd
root:x:0:0:root:/root:/bin/bash
#指定打印文件内容的1~3行
[root@localhost 2023-01-30]# sed -n '1,3p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#指定打印文件内容的第一行和第三行
[root@localhost 2023-01-30]# sed -n '1p;3p' passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#指定打印文件内容的第一行和最后一行
[root@localhost 2023-01-30]# sed -n '1p;$p' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#删除第一行
[root@localhost 2023-01-30]# sed '1d' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#删除最后一行
[root@localhost 2023-01-30]# sed '$d' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
#删除最后三行(文件共5行)
[root@localhost 2023-01-30]# sed '3,5d' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost 2023-01-30]#
#使用for循环把sed删除最后一行的命令执行三次
[root@localhost 2023-01-30]# for i in $(seq 1 3);do sed '$d' passwd ;done
#sed多表达式,一次修改多行
#sed使用-e参数做一次修改多行
[root@localhost 2023-01-30]# sed -e 's/adm/admin/g' -e 's/lp/loop/g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
loop:x:4:7:loop:/var/spool/loopd:/sbin/nologin
#sed也可以用管道符一次修改多行
[root@localhost 2023-01-30]# cat passwd | sed 's/adm/admin/g' | sed 's/lp/loop/g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
loop:x:4:7:loop:/var/spool/loopd:/sbin/nologin
[root@localhost 2023-01-30]# cat passwd | sed 's/adm/admin/g' | sed 's/lp/loop/g'|sed 's/root/jfroot/g'
jfroot:x:0:0:jfroot:/jfroot:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
loop:x:4:7:loop:/var/spool/loopd:/sbin/nologin
[root@localhost 2023-01-30]#
#使用分号也是可以实现一次修改多行
[root@localhost 2023-01-30]# cat passwd | sed 's/adm/admin/g;s/lp/loop/g;s/root/jfroot/g'
jfroot:x:0:0:jfroot:/jfroot:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
loop:x:4:7:loop:/var/spool/loopd:/sbin/nologin
[root@localhost 2023-01-30]#
#匹配nginx.conf文件中的#号,在p前面加!就是不匹配#号
[root@localhost conf]# sed -n '/#/p' nginx.conf |more
[root@localhost conf]# sed -n '/#/!p' nginx.conf |more
#不匹配#号,不匹配空行,显示剩余内容
[root@localhost conf]# sed -n '/#/!p' nginx.conf | sed -n '/^$/!p'
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@localhost conf]#
#删除#号和空行
[root@localhost conf]# sed -e '/#/d' -e '/^$/d' nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@localhost conf]# sed -i -e '/#/d' -e '/^$/d' nginx.conf
[root@localhost conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@localhost conf]#
#删除由server开头的行至error开头的行
[root@localhost conf]# sed '/server/,/error/d' nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
location = /50x.html {
root html;
}
}
}
#删除由server开头的行至最后一行
[root@localhost conf]# sed '/server/,$d' nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
[root@localhost conf]#
#i参数在指定句上方添加,a参数在指定句下方添加
[root@localhost 2023-01-30]# sed -e '/adm/i----------------' -e '/adm/a---------------' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
----------------
adm:x:3:4:adm:/var/adm:/sbin/nologin
---------------
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#a参数在指定句下方添加字段
[root@localhost conf]# sed '/keepalive/a include domains#/*;' nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include domains#/*;
#i参数在指定句上方添加字段
[root@localhost conf]# sed '/keepalive/i include domains#/*;' nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
include domains#/*;
keepalive_timeout 65;
[root@localhost conf]#
#在指定句前加上1)
[root@localhost 2023-01-30]# sed '/adm/s/^/1)/g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
1)adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]# sed -e '/adm/s/^/1)/g' -e '/adm/s/$/\./g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
1)adm:x:3:4:adm:/var/adm:/sbin/nologin.
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#在文件内容前行号加上")"末尾加上"."
[root@localhost 2023-01-30]# cat -n passwd | sed 's/\t/)/g' |sed 's/ //g' |sed 's/$/\./g'
1)root:x:0:0:root:/root:/bin/bash.
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.
[root@localhost 2023-01-30]#
#sed调用变量
[root@localhost 2023-01-30]# A=admin
[root@localhost 2023-01-30]# echo $A
admin
[root@localhost 2023-01-30]# sed "s/adm/$A/g" passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
admin:x:3:4:admin:/var/admin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#修改某行行末的字段,需先匹配行首在替换字段
[root@localhost 2023-01-30]# sed '/adm/s/nologin/bash/g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-01-30]#
#sed默认模式是单行处理,如果要把列变成行,则需要开启多行模式
[root@localhost 2023-01-30]# echo -e "1\n2\n3\n4\n5\n6"
1
2
3
4
5
6
#以下面为例,因sed默认为单行模式,无法对多行进行同时处理,导致出现无法换行
[root@localhost 2023-01-30]# echo -e "1\n2\n3\n4\n5\n6" | sed 's/\n//g'
1
2
3
4
5
6
[root@localhost 2023-01-30]#
#"N"是sed的多行模式,一个"N"表示处理两行,如要做到多行合并,只能加多几个"N"
[root@localhost 2023-01-30]# echo -e "1\n2\n3\n4\n5\n6" | sed 'N;N;s/\n//g'| sed 'N;s/\n//g'
123456
#sed与tr -d对比,两条命令效果一样,但tr -d删除命令中某个字符相对比较简洁
[root@localhost 2023-01-30]# echo -e "1\n2\n3\n4\n5\n6" | tr -d "\n";echo
123456
[root@localhost 2023-01-30]#
#sed显示行号
[root@localhost 2023-01-30]# sed = passwd
1
root:x:0:0:root:/root:/bin/bash
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
[root@localhost 2023-01-30]# sed = passwd | sed 'N;s/\n/)/g'| sed 's/$/\./g'
1)root:x:0:0:root:/root:/bin/bash.
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.
[root@localhost 2023-01-30]#
AWK
AWK介绍
-
AWK是一个文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎值已,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK。
-
AWK是一个文本高级处理工具,AWK经过改进生成的新版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是AWK的GUN开源免费版本。
-
AWK基本原理是逐行处理文件中的数据,查找与命令中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。
-
语法:
awk 'pattern + {action}' file
-
AWK基本语法参数:
- 单引号**‘’**是为了和shell命令区分开
- 大括号{}表示一个命令的分组
- pattern是一个过滤器,表示匹配pattern条件的行才进行action处理。
- action是处理动作,常见动作为print
- 使用#号作为注释,pattern和action可以只有其一,但不能两者都都没有。
-
AWK内置变量:
变量 含义 FS 分隔符,默认是空格 OFS 输出分隔符 NR 统计当前行数,从1开始 NF 统计当前文件有多少列 $0 显示当前内容 $1~$
n当前记录第n个字段/列 -
AWK内置函数:
函数 含义 gsub(r,s) 在$0中用s代替r index(s,t) 返回s中t的第一个位置 length(s) 统计文件字符长度 match(s,r) s是否匹配r split(s,a,fs) 在fs上将s分成序列a substr(s,p) 返回s从p开始的子串 -
AWK常用操作符、运算符、判断符
符号 含义 ++ – 增加与减少(前置或后置) ^ ** 指数(右结合性) ! + - 非、一元(unary)加号、一元减号 + - * / % 加、减、乘、除、余数 < <= == != > >= 数字比较 && 逻辑end || 逻辑or = += -= *= /= %= ^= **= 赋值 -
AWK与流程控制语句
- if(condition){} else{};
- while {};
- do{}while(condition);
- for(init;confition;step){};
- break/continue
AWK示例
AWK示例一
- 创建一份有IP、用户、密码的文本
- 然后根据文本中的数据做匹配
#使用for语句创建一份文本 [root@localhost 2023-01-30]# for i in `seq 1 5`;do echo "$i) 192.168.21.$i root ${i}admin@123" ;done >> list.txt [root@localhost 2023-01-30]# ll 总用量 1060 -rw-r--r--. 1 root root 160 1月 30 16:53 list.txt drwxr-xr-x. 8 1001 1001 158 10月 19 16:02 nginx-1.22.1 -rw-r--r--. 1 root root 1073948 10月 19 17:23 nginx-1.22.1.tar.gz -rw-r--r--. 1 root root 183 1月 30 10:37 passwd [root@localhost 2023-01-30]# cat list.txt 1) 192.168.21.1 root 1admin@123 2) 192.168.21.2 root 2admin@123 3) 192.168.21.3 root 3admin@123 4) 192.168.21.4 root 4admin@123 5) 192.168.21.5 root 5admin@123 [root@localhost 2023-01-30]# ----------------------------------------------------------------- #使用awk匹配其中一个字段,没动作的情况下,print可以写可以不写 [root@localhost 2023-01-30]# awk '/21.4/ {print}' list.txt 4) 192.168.21.4 root 4admin@123 [root@localhost 2023-01-30]# awk '/21.4/' list.txt 4) 192.168.21.4 root 4admin@123 [root@localhost 2023-01-30]# #匹配多个字段,","表示由哪个字段到哪个字段 [root@localhost 2023-01-30]# awk '/21.2/,/21.4/' list.txt 2) 192.168.21.2 root 2admin@123 3) 192.168.21.3 root 3admin@123 4) 192.168.21.4 root 4admin@123 [root@localhost 2023-01-30]# #";"表示只匹配指定的两个或以上的字段 [root@localhost 2023-01-30]# awk '/21.2/;/21.4/' list.txt 2) 192.168.21.2 root 2admin@123 4) 192.168.21.4 root 4admin@123 [root@localhost 2023-01-30]# #匹配动作,每一列以空格为分隔符,$2就是只匹配第二列 [root@localhost 2023-01-30]# awk '/21.2/,/21.4/ {print $2}' list.txt 192.168.21.2 192.168.21.3 192.168.21.4 #匹配第二列和第三列 [root@localhost 2023-01-30]# awk '/21.2/,/21.4/ {print $2,$3}' list.txt 192.168.21.2 root 192.168.21.3 root 192.168.21.4 root [root@localhost 2023-01-30]# [root@localhost 2023-01-30]# awk '/21.2/,/21.4/ {print $2,$3,$4}' list.txt 192.168.21.2 root 2admin@123 192.168.21.3 root 3admin@123 192.168.21.4 root 4admin@123 [root@localhost 2023-01-30]# #""双引号中可以添加字符;例如添加".""--" [root@localhost 2023-01-30]# awk '/21.2/,/21.4/ {print $1,$2"."}' list.txt 2) 192.168.21.2. 3) 192.168.21.3. 4) 192.168.21.4. [root@localhost 2023-01-30]# [root@localhost 2023-01-30]# awk '/21.2/,/21.4/ {print "IP:" $2}' list.txt IP:192.168.21.2 IP:192.168.21.3 IP:192.168.21.4 [root@localhost 2023-01-30]# #使用sed命令都可以实现添加字符,但awk相对更简洁简单 [root@localhost 2023-01-30]# awk '/21.2/,/21.4/ {print $2}' list.txt | sed 's/^/IP:/g' IP:192.168.21.2 IP:192.168.21.3 IP:192.168.21.4 [root@localhost 2023-01-30]#
AWK示例二
[root@localhost 2023-01-30]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 898M 0 898M 0% /dev tmpfs 910M 0 910M 0% /dev/shm tmpfs 910M 9.4M 901M 2% /run tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/mapper/centos-root 17G 2.2G 15G 13% / /dev/sda1 1014M 151M 864M 15% /boot tmpfs 182M 0 182M 0% /run/user/0 /dev/sr0 4.4G 4.4G 0 100% /mnt [root@localhost 2023-01-30]# #匹配第一和第五行 [root@localhost 2023-01-30]# df -h | awk '{print $1,$5}' 文件系统 已用% devtmpfs 0% tmpfs 0% tmpfs 2% tmpfs 0% /dev/mapper/centos-root 13% /dev/sda1 15% tmpfs 0% /dev/sr0 100% #匹配包含tmpfs字眼的第一和第五行 [root@localhost 2023-01-30]# df -h | awk '/tmpfs/ {print $1,$5}' devtmpfs 0% tmpfs 0% tmpfs 2% tmpfs 0% tmpfs 0% [root@localhost 2023-01-30]# #匹配除了tmpfs以外的字段,在指定排除字段前面加"!" [root@localhost 2023-01-30]# df -h | awk '!/tmpfs/ {print $1,$5}' 文件系统 已用% /dev/mapper/centos-root 13% /dev/sda1 15% /dev/sr0 100% [root@localhost 2023-01-30]# df -h | awk '!/tmpfs/ {print $1,$5}' | awk 'NR>1' /dev/mapper/centos-root 13% /dev/sda1 15% /dev/sr0 100% [root@localhost 2023-01-30]# --------------------------------- #-F参数是用于自定义分割符;常用的可定义符号有": /t(tab) ;" [root@localhost 2023-01-30]# awk -F: '{print $1}' passwd root bin daemon adm lp [root@localhost 2023-01-30]# #定义多个分割符号,使用中括号括起来;以下示例是以":"和bin作为分割 [root@localhost 2023-01-30]# awk -F'[:bin]' '{print $1}' passwd root daemo adm lp [root@localhost 2023-01-30]# [root@localhost 2023-01-30]# cat list.txt 1) 192.168.91.1 root 1admin@123 2) 192.168.91.2 root 2admin@123 3) 192.168.91.3 root 3admin@123 4) 192.168.91.4 root 4admin@123 5) 192.168.91.5 root 5admin@123 [root@localhost 2023-01-30]# cat list.txt |awk -F'root' '{print $1}' 1) 192.168.91.1 2) 192.168.91.2 3) 192.168.91.3 4) 192.168.91.4 5) 192.168.91.5 [root@localhost 2023-01-30]# cat list.txt | awk -F '192.168.91.' '{print $2}' 1 root 1admin@123 2 root 2admin@123 3 root 3admin@123 4 root 4admin@123 5 root 5admin@123 [root@localhost 2023-01-30]# #匹配行 [root@localhost 2023-01-30]# awk 'NR==3' list.txt 3) 192.168.91.3 root 3admin@123 [root@localhost 2023-01-30]# awk 'NR==3','NR==5' list.txt 3) 192.168.91.3 root 3admin@123 4) 192.168.91.4 root 4admin@123 5) 192.168.91.5 root 5admin@123 [root@localhost 2023-01-30]# #||管道符是“与”的关系,使用";"也能得出相同效果 [root@localhost 2023-01-30]# awk 'NR==3 || NR==5' list.txt 3) 192.168.91.3 root 3admin@123 5) 192.168.91.5 root 5admin@123 [root@localhost 2023-01-30]# #$0是显示匹配条件后的所有内容 [root@localhost 2023-01-30]# awk 'NR==3 || NR==5 {print $0}' list.txt 3) 192.168.91.3 root 3admin@123 5) 192.168.91.5 root 5admin@123 [root@localhost 2023-01-30]# [root@localhost 2023-01-30]# awk -F'root' 'NR==3 || NR==5 {print $2}' list.txt 3admin@123 5admin@123 [root@localhost 2023-01-30]# #追加内容生成文件,在动作中追加,把文件名用双引号引起来 [root@localhost 2023-01-30]# awk 'NR==3 || NR==5 {print $0>>"sunlit2.txt"}' list.txt [root@localhost 2023-01-30]# cat sunlit2.txt 3) 192.168.91.3 root 3admin@123 5) 192.168.91.5 root 5admin@123 [root@localhost 2023-01-30]# #大于等于3行小于等于5行的字段后面都加上指定动作 [root@localhost 2023-01-30]# awk 'NR>=3&&NR<=5 {print $0 "www.jd.com"}' list.txt 3) 192.168.91.3 root 3admin@123www.jd.com 4) 192.168.91.4 root 4admin@123www.jd.com 5) 192.168.91.5 root 5admin@123www.jd.com [root@localhost 2023-01-30]# #在awk中引用变量需要在双引号中加上单引号才能引用变量内容 [root@localhost 2023-01-30]# awk 'NR>=3&&NR<=5 {print $0 "$WEB1"}' list.txt 3) 192.168.91.3 root 3admin@123$WEB1 4) 192.168.91.4 root 4admin@123$WEB1 5) 192.168.91.5 root 5admin@123$WEB1 [root@localhost 2023-01-30]# #awk引用变量方式一 [root@localhost 2023-01-30]# awk 'NR>=3&&NR<=5 {print $0 "'$WEB1'"}' list.txt 3) 192.168.91.3 root 3admin@123www.jd.com 4) 192.168.91.4 root 4admin@123www.jd.com 5) 192.168.91.5 root 5admin@123www.jd.com [root@localhost 2023-01-30]# #awk引用变量方式二 [root@localhost 2023-01-30]# awk -v WEB=www.jfedu.net 'NR>=3&&NR<=5 {print $ 0,WEB}' list.txt 3) 192.168.91.3 root 3admin@123 www.jfedu.net 4) 192.168.91.4 root 4admin@123 www.jfedu.net 5) 192.168.91.5 root 5admin@123 www.jfedu.net [root@localhost 2023-01-30]# #NF是统计文件中有多少列;以下示例显示5行4,4表示4列 [root@localhost 2023-01-30]# cat list.txt | awk '{print NF}' 4 4 4 4 4 [root@localhost 2023-01-30]# #统计第三行最后一列 [root@localhost 2023-01-30]# cat list.txt | awk 'NR==3 {print $NF}' 3admin@123 [root@localhost 2023-01-30]# #统计第三行倒数第二列 [root@localhost 2023-01-30]# cat list.txt | awk 'NR==3 {print $(NF-1)}' root #统计第三行倒数第三列 [root@localhost 2023-01-30]# cat list.txt | awk 'NR==3 {print $(NF-2)}' 192.168.91.3 [root@localhost 2023-01-30]# #使用length参数查看第6行一共有多少个字符 [root@localhost 2023-01-31]# cat list.txt 1) 192.168.91.1 root 1admin@123 2) 192.168.91.2 root 2admin@123 3) 192.168.91.3 root 3admin@123 4) 192.168.91.4 root 4admin@123 5) 192.168.91.5 root 5admin@123 6) 192.168.91.5 root 5admin@123 www.jd.com [root@localhost 2023-01-31]# awk 'NR==6 {print length($0)}' list.txt 42 [root@localhost 2023-01-31]# #注意,空格都算一个字符 [root@localhost 2023-01-31]# cat list.txt 1) 192.168.91.1 root 1admin@123 2) 192.168.91.2 root 2admin@123 3) 192.168.91.3 root 3admin@123 4) 192.168.91.4 root 4admin@123 5) 192.168.91.5 root 5admin@123 w jd.com [root@localhost 2023-01-31]# awk 'NR==6 {print length($0)}' list.txt 8 [root@localhost 2023-01-31]# #使用gsub参数把root改为admin,用斜杠和单引号强制找到root字段,再替换 #在不追加到任何文件中,这只是预览,并不是真正替换 [root@localhost 2023-01-31]# awk 'gsub('/root/',"admin")' list.txt 1) 192.168.91.1 admin 1admin@123 2) 192.168.91.2 admin 2admin@123 3) 192.168.91.3 admin 3admin@123 4) 192.168.91.4 admin 4admin@123 5) 192.168.91.5 admin 5admin@123 [root@localhost 2023-01-31]# #把awk替换字段的结果追加到文件,并覆盖源文件后才算替换完成 [root@localhost 2023-01-31]# awk 'gsub(/root/,"admin")' list.txt > list.txt.swp; \mv list.txt.swp list.txt ;cat list.txt 1) 192.168.91.1 admin 1admin@123 2) 192.168.91.2 admin 2admin@123 3) 192.168.91.3 admin 3admin@123 4) 192.168.91.4 admin 4admin@123 5) 192.168.91.5 admin 5admin@123 [root@localhost 2023-01-31]#
-
GREP
GREP介绍
- 权限搜索正则表达式(Global search regular expression(RE)),GREP是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
- Unix/Linux的grep家族包括grep、egrep、fgrep,其中egrep和fgrep的命令跟grep有细微的区别。
- egrep是grep的扩展,支持更多的re元字符,fgrep是finxed grep或fast grep简写,它们把所有的字母都看作单词,正则表达式中的元字符表示其自身的字面意义,不再有其他特殊的含义,一般使用比较少。
- 目前Linux系统默认使用GUN版的grep。可以通过-G、-E、-F命令选项来实现egrep和fgrep的功能。
- 语法:
grep -[acinv] 'word' filename
参数 | 含义 |
---|---|
-a | 以文本文件方式搜索 |
-c | 计算找到的符合行的次数 |
-i | 忽略大小写 |
-n | 顺便输出行号 |
-v | 反向选择,即显示不包含匹配文本的所有行 |
-h | 查询多文件时不显示文件名 |
-l | 查询多文件时只输出包含匹配字符的文件名 |
-s | 不显示不存在或误匹配文本的错误信息 |
-E | 允许使用egrep扩展模式 |
- 通配符类型(以下通配符常用于awk、grep、sed、vim、find)
通配符 | 含义 |
---|---|
* | 0个或者多个字符、数字 |
? | 匹配任意一个字符 |
# | 表示注释 |
| | 管道符号 |
; | 多个命令连续执行 |
& | 后台运行指令 |
! | 逻辑运算非 |
[] | 内容范围,匹配括号中内容 |
{} | 命令块,多个命令匹配 |
- 正则表达式
- 用到正则表达式的地方一般是:
- nginx的location字段
- grep、sed工具,匹配、过滤
- perl语言
- 用到正则表达式的地方一般是:
正则表达式 | 含义 |
---|---|
* | 前一个字符匹配0次或者多次 |
. | 匹配出了换行符以外的任意一个字符 |
.* | 代表任意字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
\(…\) | 标记匹配字符 |
[] | 匹配中括号里的任意指定字符(只匹配一个字符) |
[^] | 匹配除中括号以外的任意一个字符 |
\ | 转义符,取消特殊含义 |
\< | 锚定单词的开始 |
\> | 锚定单词的结束 |
{n} | 匹配字符出现n次 |
{n,} | 匹配字符出现大于等于n次 |
{n,m} | 匹配字符至少出现n次,最多出现m次 |
\w | 匹配文字和数字字符,不匹配符号 |
\W | 匹配一个或多个非单词字符,匹配符号 |
\b | 单词锁定符号 |
\s | 匹配任何空白字符 |
\d | 匹配一个数字字符,等价于[0-9] |
GREP示例
#统计admin字符的总数
[root@localhost 2023-01-31]# grep -c admin list.txt
5
[root@localhost 2023-01-31]#
#对全文本搜索并忽略大小写
[root@localhost 2023-01-31]# grep -ai "adm" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost 2023-01-31]#
#"."表示任意字符,所有字符都可以使用"."代替
[root@localhost 2023-01-31]# grep -ai "." list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost 2023-01-31]#
#如果只想作为普通符号进行匹配,需要加"\"反斜杠转义
[root@localhost 2023-01-31]# grep "\." list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-01-31]#
#[0-9]是专门用于匹配数字,匹配0-9之间的数字
[root@localhost 2023-01-31]# grep -ai "[0-9]" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
[root@localhost 2023-01-31]#
#匹配指定字符,该字符在文件内容中出现0次或多次,即可匹配上(按单个字符匹配,而不是按词组匹配)
[root@localhost 2023-02-01]# grep "no*" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost 2023-02-01]#
#"?"与"*"区别,"?"最多只能匹配1次,最小匹配0次;"*"可以匹配多次与指定字符相同的字眼
[root@localhost 2023-02-01]# grep -E "no?" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
admin administrator
nooooooo www.jfedu.net
[root@localhost 2023-02-01]# grep -E "no*" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
admin administrator
nooooooo www.jfedu.net
[root@localhost 2023-02-01]#
#查找时不区分大小写
[root@localhost 2023-01-31]# grep -i ADMIN list.txt
1) 192.168.91.1 admin 1admin@123
2) 192.168.91.2 admin 2admin@123
3) 192.168.91.3 admin 3admin@123
4) 192.168.91.4 admin 4admin@123
5) 192.168.91.5 admin 5admin@123
[root@localhost 2023-01-31]#
#打印有admin字眼的行及行号
[root@localhost 2023-01-31]# grep -n admin list.txt
1:1) 192.168.91.1 admin 1admin@123
2:2) 192.168.91.2 admin 2admin@123
3:3) 192.168.91.3 admin 3admin@123
4:4) 192.168.91.4 admin 4admin@123
5:5) 192.168.91.5 admin 5admin@123
[root@localhost 2023-01-31]#
#不打印含有admin的行
[root@localhost 2023-01-31]# grep -v admin list.txt
2) 192.168.91.2 adm 2adm@123
[root@localhost 2023-01-31]#
#筛出admin字眼后接5和3的字段
[root@localhost 2023-01-31]# grep "admin[53]" list.txt
192.168.91.3 root admin3123
192.168.91.5 root admin5123
[root@localhost 2023-01-31]#
#筛出非admin为首行的字段
[root@localhost 2023-02-01]# grep "^[^admin]" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#筛出拥有r或a开头字段的行
[root@localhost 2023-01-31]# grep "[ra]" list.txt
192.168.91.1 root admin1123
192.168.91.2 root admin2123
192.168.91.3 root admin3123
192.168.91.4 root admin4123
192.168.91.5 root admin5123
[root@localhost 2023-01-31]#
#匹配a,后面任意三个字符,紧接n的行;所以匹配到admin
[root@localhost 2023-01-31]# grep "a...n" list.txt
1)192.168.21.1 root admin1123
2)192.168.21.2 root admin2123
3)192.168.21.3 root admin3123
4)192.168.21.4 root admin4123
5)192.168.21.5 root admin5123
[root@localhost 2023-01-31]#
#筛出A-Z其中一个出现在内容中的大写字母,并后面紧接9D字眼
[root@localhost 2023-01-31]# grep "[A-Z][9]D" list.txt
1)192.168.21.1 root A9Ddmin1123
2)192.168.21.2 root A9Ddmin2123
3)192.168.21.3 root A9Ddmin3123
4)192.168.21.4 root A9Ddmin4123
5)192.168.21.5 root A9Ddmin5123
[root@localhost 2023-01-31]#
#匹配与0-9这个范围相关的字符(一个中括号只匹配一次)
[root@localhost 2023-02-01]# grep "[0-9]" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#匹配两次和三次0-9范围的数值
[root@localhost 2023-02-01]# grep "[0-9][0-9]" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]# grep "[0-9][0-9][0-9]" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#匹配三次0-9范围的简写,后面"{}"grep命令是不能识别的,需要加反斜杠转译才能识别
[root@localhost 2023-02-01]# grep "[0-9]\{3\}" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#使用"-E"参数可以不适用转译符
[root@localhost 2023-02-01]# grep -E "[0-9]{3}" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#匹配0-9范围内的数字,匹配次数是最少匹配1次最多匹配3次(这样出现1次的数值都能匹配)
[root@localhost 2023-02-01]# grep -E "[0-9]{1,3}" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#匹配整条IP地址
[root@localhost 2023-02-01]# grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#可以简写,"{3}"表示前面"()"的内容匹配三次,最后的是匹配地址最后8比特
[root@localhost 2023-02-01]# grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#可以指定匹配的开头和结尾
[root@localhost 2023-02-01]# grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#筛出字母"o"在文件内容中出现两次以上的行,2与反斜杠之间可加或不加逗号
[root@localhost 2023-01-31]# grep "o\{2,\}" list.txt
1)192.168.21.1 root A9Ddmin1123
2)192.168.21.2 root A9Ddmin2123
3)192.168.21.3 root A9Ddmin3123
4)192.168.21.4 root A9Ddmin4123
5)192.168.21.5 root A9Ddmin5123
#筛出"1"在文件内容中连续出现4次或6次的行
[root@localhost 2023-01-31]# grep "1\{4,6\}" list.txt
1)192.168.21.11111root A9Ddmin1123
[root@localhost 2023-01-31]#
#打印指定字眼的行号(不只能打印空行,指定的字眼都能打印)
[root@localhost 2023-01-31]# grep -n "^$" list.txt
2:
[root@localhost 2023-01-31]#
#不匹配空行和井号(除了空行和井号,不匹配其他字符也可以,不过是按行算)
[root@localhost 2023-01-31]# cat list.txt
1)192.168.21.11111root A9Ddmin1123
#
2)192.168.21.2 root A9Ddmin2123
3)192.168.21.3 root A9Ddmin3123
4)192.168.21.4 root A9Ddmin4123
5)192.168.21.5 root A9Ddmin5123
[root@localhost 2023-01-31]# grep -vE "#|^$" list.txt
1)192.168.21.11111root A9Ddmin1123
2)192.168.21.2 root A9Ddmin2123
3)192.168.21.3 root A9Ddmin3123
4)192.168.21.4 root A9Ddmin4123
5)192.168.21.5 root A9Ddmin5123
[root@localhost 2023-01-31]#
#匹配多个条件搜索目录下文件
[root@localhost 2023-01-31]# grep --color -ra -E "nginx|conf"
#".*"是匹配任意字符,在不指定的情况下默认匹配全部
#示例:在nginx中做动静分离后,会编写一个location单独匹配静态文件,在location中的.*就是正则
#location ~ .*\.(html|htm|txt|js|css|jpg|jpeg|png|gif)$
#例如test.html 这条location".*"匹配的是前缀test,而后缀由\.匹配html,$为结尾
[root@localhost 2023-02-01]# grep ".*" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
noooooo www.jfedu.net
#"^"匹配开头,$匹配结尾
[root@localhost 2023-02-01]# grep "^1" list.txt
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]# grep "n$" list.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 2023-02-01]#
#匹配含有adm的字符
[root@localhost 2023-02-01]# grep "\(adm\)" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
admin administrator
[root@localhost 2023-02-01]#
#"-w"匹配完整的adm字眼
[root@localhost 2023-02-01]# grep -w "\(adm\)" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
#标记匹配中\(\)可以不写,也能实现相同的结果
[root@localhost 2023-02-01]# grep -w "adm" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost 2023-02-01]# grep "adm" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
admin administrator
[root@localhost 2023-02-01]#
#"\w"参数是只匹配文字和数字,不匹配符号
[root@localhost 2023-02-01]# grep "\w" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#"\W"就是反过来,只匹配符号,不匹配文字和数字
[root@localhost 2023-02-01]# grep "\W" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
[root@localhost 2023-02-01]#
#"\<" "\>" 锚定开始和结束,表示固定指定的文字,只匹配指定的文字,其余相似的都不匹配
#锚定开始和结束的功能与"-w"参数一样
[root@localhost 2023-02-01]# grep "adm" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
admin administrator
[root@localhost 2023-02-01]# grep "\<adm\>" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost 2023-02-01]# grep -w "adm" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost 2023-02-01]#
#"\b"与锚定开始结束和"-w"参数的功能是一样的,都是只查询指定字符,其余相似的都不匹配
[root@localhost 2023-02-01]# grep "\badm\b" list.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost 2023-02-01]#
#"\s"用于匹配空白字符,空格都算空白字符,所以示例只筛出这行
[root@localhost 2023-02-01]# grep "\s" list.txt
admin administrator
[root@localhost 2023-02-01]#
#"\S"与"\s"相反,匹配出了空白字符的所有内容
[root@localhost 2023-02-01]# grep "\S" list.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
192.168.1.100
111.111.222.333
admin administrator
[root@localhost 2023-02-01]#