SHELL编程四剑客

SHELL编程四剑客

SHELL编程四剑客介绍

  1. 在SHELL编程工具中,四剑客工具的使用更加广泛,SHELL编程四剑客包括:Find、Sed、grep、awk,熟练掌握四剑客会对SHELL编程能力有极大的提升

Find

Find介绍及参数

  1. Find工具主要用于操作系统文件、目录的查找。
  2. 语法:find path -option [-print] [exec -ok command] {} \;
    • path:查找的范围
    • option:参数
    • print:打印
  3. 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查找目录级别深度
  1. Find工具"-name"示例
示例含义
find /data/ -name “.txt”查找/data/目录下后缀为.txt结尾的文件
find /data/ -name “[A-Z]*”查找/data/目录下大写字母开头的文件
find /data/ -name “test*”查找/data/目录以test开头的文件
  1. 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
  1. 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文件
  1. 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 129 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 129 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 129 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介绍

  1. SED是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与vim编辑器类似,它一次处理一行内容,SED可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。
  2. 在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间(pattern space)”,紧接用SED命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。
  3. 逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非你使用重定向存储输出或者写入文件。
  4. 语法:sed [-options] [commands] filename
  5. SED工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加"-i"参数文件才能彻底修改。
  6. 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介绍

  1. AWK是一个文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎值已,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK。

  2. AWK是一个文本高级处理工具,AWK经过改进生成的新版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是AWK的GUN开源免费版本。

  3. AWK基本原理是逐行处理文件中的数据,查找与命令中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。

  4. 语法:awk 'pattern + {action}' file

    1. AWK基本语法参数:

      • 单引号**‘’**是为了和shell命令区分开
      • 大括号{}表示一个命令的分组
      • pattern是一个过滤器,表示匹配pattern条件的行才进行action处理。
      • action是处理动作,常见动作为print
      • 使用#号作为注释,pattern和action可以只有其一,但不能两者都都没有。
    2. AWK内置变量:

      变量含义
      FS分隔符,默认是空格
      OFS输出分隔符
      NR统计当前行数,从1开始
      NF统计当前文件有多少列
      $0显示当前内容
      $1~$n当前记录第n个字段/列
    3. 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开始的子串
    4. AWK常用操作符、运算符、判断符

      符号含义
      ++ –增加与减少(前置或后置)
      ^ **指数(右结合性)
      ! + -非、一元(unary)加号、一元减号
      + - * / %加、减、乘、除、余数
      < <= == != > >=数字比较
      &&逻辑end
      ||逻辑or
      = += -= *= /= %= ^= **=赋值
    5. AWK与流程控制语句

      • if(condition){} else{};
      • while {};
      • do{}while(condition);
      • for(init;confition;step){};
      • break/continue

    AWK示例

    AWK示例一
    1. 创建一份有IP、用户、密码的文本
    2. 然后根据文本中的数据做匹配
    #使用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 130 16:53 list.txt
    drwxr-xr-x. 8 1001 1001     158 1019 16:02 nginx-1.22.1
    -rw-r--r--. 1 root root 1073948 1019 17:23 nginx-1.22.1.tar.gz
    -rw-r--r--. 1 root root     183 130 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介绍

  1. 权限搜索正则表达式(Global search regular expression(RE)),GREP是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
  2. Unix/Linux的grep家族包括grep、egrep、fgrep,其中egrep和fgrep的命令跟grep有细微的区别。
  3. egrep是grep的扩展,支持更多的re元字符,fgrep是finxed grep或fast grep简写,它们把所有的字母都看作单词,正则表达式中的元字符表示其自身的字面意义,不再有其他特殊的含义,一般使用比较少。
  4. 目前Linux系统默认使用GUN版的grep。可以通过-G、-E、-F命令选项来实现egrep和fgrep的功能。
  5. 语法:grep -[acinv] 'word' filename
参数含义
-a以文本文件方式搜索
-c计算找到的符合行的次数
-i忽略大小写
-n顺便输出行号
-v反向选择,即显示不包含匹配文本的所有行
-h查询多文件时不显示文件名
-l查询多文件时只输出包含匹配字符的文件名
-s不显示不存在或误匹配文本的错误信息
-E允许使用egrep扩展模式
  1. 通配符类型(以下通配符常用于awk、grep、sed、vim、find)
通配符含义
*0个或者多个字符、数字
匹配任意一个字符
#表示注释
|管道符号
;多个命令连续执行
&后台运行指令
!逻辑运算非
[]内容范围,匹配括号中内容
{}命令块,多个命令匹配
  1. 正则表达式
    1. 用到正则表达式的地方一般是:
      • 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]#
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值