Shell脚本文本三剑客------grep、sed

目录

一、grep命令选项详解

示例1:统计lsblk命令显示中磁盘总个数

示例2:在大量文件中快速过滤/etc/文件夹下包含root单词的所有文件

二、正则表达式

1、正则表达式是什么?

2、元字符

1.^ 表示匹配字符串开始的位置,匹配行首

2.$表示匹配字符串末尾的位置

3.* 匹配前面子表达式0次或者多次,贪婪模式所以尽可能长

4. . 匹配换行符以外的单个字符

3、扩展正则表达式元字符

①+表示匹配前面的子表达式1次以上

②?表示匹配前面子表达式0或者1次

③()将括号内的内容看成一个整体

④|以或的方式匹配字符串

三、sed

1、sed定义?

2、sed编辑器的工作流程

3、sed命令的格式

4、sed的常用选项

5、常用操作

6、使用示例

①打印内容

②查看文件,打印全部内容

③打印指定行内容

④打印指定多行内容

⑤打印多行后退出

⑥打印最后一行,使用通配符$

⑦支持正则表达式,打印范围内容

⑧过滤关键字

⑨'#,/关键字/p' 就是从第#行开始匹配

⑩'/关键字/,#'找到第#个关键字为止

11、打印文本的奇数和偶数行

7、删除内容

①删除指定行

②删除指定的多行

③删除文本中的空行

④删除以指定字符结尾的行或者取反

⑤先备份内容再删除

8、插入内容

①在指定行后插入

②插入空行,修改文件的换行,要多加一个\

9、替换行内容

10、取反(就是多加一个感叹号)

11、搜索替代

1、示例一、修改selinux开机不自启配置文件

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

3、修改全局,后面加g

4、查找几点到几点之间的日志

12、分组调用

①调用分组段

②提取ip地址


一、grep命令选项详解

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

grep全程是Global Regular Expression Print,表示全局正则表达式版本,它的使用权权限是所有用户。

选项介绍:

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

示例1:统计lsblk命令显示中磁盘总个数

lsblk |grep disk |wc -l

示例2:在大量文件中快速过滤/etc/文件夹下包含root单词的所有文件

grep -rw 'root' /etc

二、正则表达式

1、正则表达式是什么?

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

①正则表达式,又被称为正规表达式,常规表达式

②使用字符串来描述,匹配一系列符合某个规则的字符串

③正则表达式组成:普通字符包括大小写字母,数字以及标点符号

元字符是指在正则表达式中具有特殊意义的专用字符

2、元字符

①基础正则表达式常见的元字符

(支持的工具:grep egrep sed awk)

字符 作用
\

转义,把一些特殊的符号转换成普通的符号字符,还可以把一些普通字符转换成特殊功能,例:\!、\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:] 标点符号
1.^ 表示匹配字符串开始的位置,匹配行首

Shell脚本文本三剑客------grep、sed_第1张图片

2.$表示匹配字符串末尾的位置
3.* 匹配前面子表达式0次或者多次,贪婪模式所以尽可能长

Shell脚本文本三剑客------grep、sed_第2张图片

4. . 匹配换行符以外的单个字符

3、扩展正则表达式元字符

支持的工具(egrep awk grep-E sed-r)

字符 作用
+ 表示匹配前面的子表达式1次以上
? 表示匹配前面的子表达式0或者1次

( )

将括号里的内容看成一个整体
| 以或的方式匹配字符串
①+表示匹配前面的子表达式1次以上

Shell脚本文本三剑客------grep、sed_第3张图片

②?表示匹配前面子表达式0或者1次

③()将括号内的内容看成一个整体

④|以或的方式匹配字符串

三、sed

1、sed定义?

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

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

2、sed编辑器的工作流程

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

①读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区肿(又成模式空间,pattern space)

②执行:默认情况下,所有的sed命令都在模式空间中顺序的执行,除非指定了行的地址,否则sed命令将会在所有的行上执行。

③显示:发送修改后的内容到输出流(屏幕)在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将被重复执行,直到所有的内容都被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出或者sed -i

3、sed命令的格式

第一种:
sed -e '操作' 文件1 文件2
 
第二种:
sed -n -e '操作' 文件1 文件2 
 
第三种:
sed -f 脚本文件 文件1 文件2 
 
第四种:
sed -i -e '操作' 文件1 文件2

4、sed的常用选项

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

5、常用操作

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

6、使用示例

①打印内容
sed ' '      #交互模式输入一行,自动打印一行相同的
 
sed -n ' '   #交互模式输入一行,关闭自动打印
 
sed -n ' p'  #加上p又恢复自动打印,与sed ' '相同

Shell脚本文本三剑客------grep、sed_第4张图片

②查看文件,打印全部内容
sed ' ' /etc/fstab
 
sed -n ' p' /etc/fatab
③打印指定行内容
sed -n '4p' /etc/fstab
#打印第四行内容

④打印指定多行内容
ifconfig ens33 |sed -n '2,4p'
#打印网卡信息的2至4行
 
cat -n /etc/passwd |sed -n '2,+4p'
#打印第2至6行,即第二行开始往后四行

Shell脚本文本三剑客------grep、sed_第5张图片

⑤打印多行后退出
sed  '3q' /etc/passwd
#打印三行后退出

⑥打印最后一行,使用通配符$
sed -n '$p' /etc/passwd

⑦支持正则表达式,打印范围内容
sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
 
sed -n '/^r/,/^f/p' /etc/passwd
#以r开头 f开头结尾 第二轮以r开头 后面没有以f开头结尾 则显示全部

Shell脚本文本三剑客------grep、sed_第6张图片

⑧过滤关键字
sed -n '/root/p' /etc/passwd
#从第二行开始,找到root为止

Shell脚本文本三剑客------grep、sed_第7张图片

⑨'#,/关键字/p' 就是从第#行开始匹配
sed -n '2,/root/p' /etc/passwd
#从第二行开始,找到root为止

Shell脚本文本三剑客------grep、sed_第8张图片

⑩'/关键字/,#'找到第#个关键字为止
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'
#打印偶数行 

Shell脚本文本三剑客------grep、sed_第9张图片

7、删除内容

①删除指定行
#删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
cat 1.txt |sed '3d'
#删除第三行并显示出来

Shell脚本文本三剑客------grep、sed_第10张图片

②删除指定的多行
sed '2,4d' seq.txt 
#删除连续的2到4行

Shell脚本文本三剑客------grep、sed_第11张图片

③删除文本中的空行
sed '/^$/d' /opt/seq.txt 

Shell脚本文本三剑客------grep、sed_第12张图片

④删除以指定字符结尾的行或者取反
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行

Shell脚本文本三剑客------grep、sed_第13张图片

⑤先备份内容再删除
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份

Shell脚本文本三剑客------grep、sed_第14张图片

8、插入内容

①在指定行后插入
sed -i '2a charu' 1.txt
#在第二行后插入内容

Shell脚本文本三剑客------grep、sed_第15张图片

②插入空行,修改文件的换行,要多加一个\
sed -i '2a\\n charu' 1.txt

Shell脚本文本三剑客------grep、sed_第16张图片

9、替换行内容

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

Shell脚本文本三剑客------grep、sed_第17张图片

10、取反(就是多加一个感叹号)

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

Shell脚本文本三剑客------grep、sed_第18张图片

11、搜索替代

格式:格式:sed 行范围 s/旧字符串/新字符串/替换标记

替换标记:

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

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

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

④w文件:将替换的结果写道文件中

1、示例一、修改selinux开机不自启配置文件
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 

Shell脚本文本三剑客------grep、sed_第19张图片

2、修改多行,使用r以及-e
sed -ri -e 's/SELINUX=disabled/SELINUX=enabled/' /etc/selinux/config  -e 's/SELINUXTYPE=targeted/SELINUXTYPE=111/' /etc/selinux/config 

-e等同于or是或者的意思

Shell脚本文本三剑客------grep、sed_第20张图片

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

12、分组调用

①调用分组段
#分组使用()(),调用第一段使用\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/'

Shell脚本文本三剑客------grep、sed_第21张图片

②提取ip地址
ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+)  (netmask) ([0-9.]+)  (broadcast) ([0-9.]+).*/\2/p'

你可能感兴趣的:(服务器,运维)