Shell脚本⑥grep、正则表达式与sed

目录

一.grep

1.定义

2.选项

二.正则表达式

1.定义

2.元字符

(1)常见元字符

(2)扩展元字符

三.sed

1.定义

2.工作流程

3.选项

4.常用操作

四.sed实例

1.打印内容

(1)打印全部内容

(2)查看文件,打印全部内容

(3)打印指定内容

(4)打印指定多行内容

(5)打印多行后退后

[(6)打印最后一行,使用通配符](#(6)打印最后一行,使用通配符)

(7)支持正则表达式,打印范围内容

(8)过滤关键词

[(9)'#,/关键字/p' 从第#行开始匹配](#,/关键字/p’ 从第#行开始匹配)

[(10)'/关键字/,#' 找到第#个关键字为止](#’ 找到第#个关键字为止)

(11)打印文本的奇数和偶数行

2.删除内容

(1)删除指定行

(2)删除指定的多行

(3)删除文本中的空行

(4)删除以指定字符结尾的行及取反

(5)先备份内容再删除

3.插入内容

(1)在指定行后插入

[(2)插入空行,要多加一个\](#(2)插入空行,要多加一个)

4.替换行内容

5.取反

6.搜索替代

(1)修改selinux开机不自启配置文件

(2)修改多行,使用r以及-e

(3)修改全局,后面加g

(4)查找几点到几点之间的日志

7.分组调用

(1)调用分组段

(2)提取IP地址


一.grep

格式:

grep [选项]... 查找条件 目标文件

1.定义

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

2.选项

|----|--------------------------|
| -m | 匹配几次后停止 |
| -v | 反选 |
| -i | 忽略字符大小写 |
| -n | 显示匹配行号 |
| -c | 统计匹配行数 |
| -o | 仅显示匹配到的字符串 |
| -q | 静默模式 |
| -A | 后几行 |
| -B | 前几行 |
| -C | 前后各几行 |
| -e | 多个选项之间"或者"关系 |
| -w | 匹配整个单词 |
| -E | 启用扩展正则表达式 =egrep |
| -F | 不支持正则表达式 =fgrep |
| -f | 处理两个文件的相同内容,以第一个文件作为匹配条件 |
| -r | 递归,但不处理软链接 |
| -R | 递归,处理软链接 |

二.正则表达式

1.定义

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板,Linux工具可以用它来过滤文本。

2.元字符

(1)常见元字符
字符 作用
\ 转义,把一些特殊的符号转换成普通的符号字符,还可以把一些普通字符转换成特殊功能,例:\!、\n、\$等
^ 表示匹配字符串开始的位置,匹配行首,例: ^a、 ^#
$ 表示匹配字符串末尾的位置,匹配行尾,例: word、 # ;^$表示空行
. 匹配任意的单个字符,例: go.d、g..d
* 匹配前面子表达式0次或者多次,贪婪模式所以尽可能长,例: goo*d、go.*d
.* 表示任意长度的任一字符,不包括0次
\? 匹配其前面字符0或1次,可有可无
\+ 匹配其前面字符最少1次,有且大于等于1次
\{n\} 匹配前面的子表达式n次,例:mo\{2\}y、'[0-9]\{ 2\ }'匹配两位及两位以上数字
\{n,\} 匹配前面的子表达式不少于n次,例: mo\{2,\}y、'[0-9]\{2,\}'匹配两位及两位以上数字
\{,n\} 匹配前面的子表达式不多于n次
\{n,m\} 匹配前面的子表达式n到m次(m>=n),例: mo\{2,3\}y、'[0-9]\{2,3\}'匹配两位到三位数字
注: egrep(grep-E)、awk使用{n }、{n, }、{n,m}匹配时"{}"前不用加"\"
\w 匹配包括下划线的任何单词字符
\W 匹配任何非单词字符。等价于"[^A-Za-z0-9_]"。
\d 匹配一个数字字符
\D 匹配一个非数字字符。等价于[^0-9]。
\s 空白符
[:alpha:] 字母,即A-Z,a-z
[:alnum:] 字母和数字
[:lower:] 小写字母,即a-z
[:upper:] 大写字母,即A-Z
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符、换行符、回车符等各类型空白
[:print:] 可打印字符
[:punct:] 标点符号
  • ^ 表示匹配字符串开始的位置,匹配行首
  • $ 表示匹配字符串末尾的位置,匹配行尾
  • * 匹配前面子表达式0次或者多次,贪婪模式所以尽可能长
  • . 匹配除\n之外的任意的一个字符
  • .* 表示任意长度的任一字符,不包括0次
  • \{n\} 匹配前面的子表达式n次
(2)扩展元字符
字符 作用
+ 表示匹配前面的子表达式1次以上
? 表示匹配前面的子表达式0或者1次
( ) 将括号里的内容看成一个整体
| 以或的方式匹配字符串
    • 表示匹配前面的子表达式1次以上
  • ? 表示匹配前面的子表达式0或者1次
  • ( ) 将括号里的内容看成一个整体
  • | 以或的方式匹配字符串

三.sed

格式:

第一种:

sed -e '操作' 文件1 文件2

第二种:

sed -n -e '操作' 文件1 文件2

第三种:

sed -f 脚本文件 文件1 文件2

第四种:

sed -i -e '操作' 文件1 文件2

1.定义

  • sed编辑器时一种流编辑器 ,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流

  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要存储在一个命令文本文件中

2.工作流程

sed 的工作流程主要包括读取、执行和显示三个过程:

  • 读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
  • 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

3.选项

|-------|---------------------------|
| -n | 不输出模式空间内容,即不自动打印,加p恢复自动打印 |
| -e | 多点编辑 |
| -f | 从指定文件中读取编辑脚本 |
| -r -E | 使用扩展正则表达式 |
| -i | 备份文件并原处编辑 |

4.常用操作

|--------|-------------------------------------------------------------------------|
| 操作 | 作用 |
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下面增加一行指定内容 |
| i | 插入,在选定行上面插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| Y | 字符转换,转换前后的字符长度必须相同 |
| p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。 |
| = | 打印行号 |
| l(小写L) | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |

四.sed实例

1.打印内容

(1)打印全部内容
sed ' '      #交互模式输入一行,自动打印一行相同的
 
sed -n ' '   #交互模式输入一行,关闭自动打印
 
sed -n ' p'  #加上p又恢复自动打印,与sed ' '相同
(2)查看文件,打印全部内容
sed ' ' /etc/fstab
 
sed -n ' p' /etc/fatab
(3)打印指定内容
sed -n '4p' /etc/fstab
#打印第四行内容
(4)打印指定多行内容
ifconfig ens33 |sed -n '2,4p'
#打印网卡信息的2至4行
 
cat -n /etc/passwd |sed -n '2,+4p'
#打印第2至6行,即第二行开始往后四行
(5)打印多行后退后
sed  '3q' /etc/passwd
#打印三行后退出
(6)打印最后一行,使用通配符$
sed -n '$p' /etc/passwd
(7)支持正则表达式,打印范围内容
sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
 
sed -n '/^r/,/^f/p' /etc/passwd
#以r开头 f开头结尾 第二轮以r开头 后面没有以f开头结尾 则显示全部
(8)过滤关键词
sed -n '/root/p' /etc/passwd
#从第二行开始,找到root为止
(9)'#,/关键字/p' 从第#行开始匹配
sed -n '2,/root/p' /etc/passwd
#从第二行开始,找到root为止
(10)'/关键字/,#' 找到第#个关键字为止
sed -n '/root/,3p' /etc/passwd
#找到第三个root位置
(11)打印文本的奇数和偶数行
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
 
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行 

2.删除内容

(1)删除指定行
#删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
cat 1.txt |sed '3d'
#删除第三行并显示出来
(2)删除指定的多行
sed '2,4d' seq.txt 
#删除连续的2到4行
(3)删除文本中的空行
sed '/^$/d' /opt/seq.txt 
(4)删除以指定字符结尾的行及取反
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
(5)先备份内容再删除
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份

3.插入内容

(1)在指定行后插入
sed -i '2a charu' 1.txt
#在第二行后插入内容
(2)插入空行,要多加一个\
sed -i '2a\\n charu2' 1.txt

4.替换行内容

sed -i '2ctihuan' 1.txt
#将第二行的内容替换成tihuan

5.取反

seq 10|sed -n '2!p'
#不显示第二行

6.搜索替代

替换标记:

  • 数字:表明新字符串将替换第几处匹配的地方

  • g : 表明新字符串将会替换所有匹配的地方

  • p : 打印与替换命令匹配的行,与 -n 一起使用

  • w 文件 :将替换的结果写到文件中

(1)修改selinux开机不自启配置文件
(2)修改多行,使用r以及-e
(3)修改全局,后面加g
sed -i 's/root/admin/g' /etc/passwd 
#将全局出现的root修改为admin
(4)查找几点到几点之间的日志
sed -n '/2023:08:09/,/2023:09:42:37/p' access_log

7.分组调用

(1)调用分组段
#分组使用()(),调用第一段使用\1
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/'
 
#调用第2个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/'
 
#调用所有分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2\3/'
(2)提取IP地址
ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+)  (netmask) ([0-9.]+)  (broadcast) ([0-9.]+).*/\2/p'
相关推荐
IT机器猫40 分钟前
Docker完整技术汇总
运维·docker·容器
无所不在的物质1 小时前
Jenkins基础教程
运维·云原生·自动化·jenkins
广而不精zhu小白1 小时前
CentOS Stream 9 挂载Windows共享FTP文件夹
linux·windows·centos
一休哥助手1 小时前
全面解析 Linux 系统监控与性能优化
linux·运维·性能优化
二进制杯莫停1 小时前
掌控网络流量的利器:tcconfig
linux
watl01 小时前
【Android】unzip aar删除冲突classes再zip
android·linux·运维
团儿.2 小时前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
赵大仁2 小时前
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc
linux·运维·服务器·ide·ubuntu·centos·计算机基础
vvw&2 小时前
Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程
linux·运维·服务器·ubuntu·docker·容器·开源
李白你好2 小时前
家用无线路由器的 2.4GHz 和 5GHz
运维·网络