Linux-正则三剑客

目录

一、正则简介

1.正则表达式分两类:

2.正则表达式的意义

二、Linux三剑客简介

1.文本处理工具,均支持正则表达式引擎

2.正则表达式分类

3.基本正则表达式BRE集合

4.扩展正则表达式ere集合

三、grep

1.简介

2.实践

3.贪婪匹配

四、sed

1.sed简介

2.输出文件的第2,3行的内容

5.替换

6.写入对应行

7.实例

五、awk

1.awk基础

2.举例

3.NF和NR

4.字符串占位

5.awk参数

6.awk变量

7.awk的分隔符

8.awk的变量


一、正则简介

1.正则表达式分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

2.正则表达式的意义

  • 处理大量字符串
  • 处理文本

通过特殊符号的辅助,可以让linux管理员快速过滤、替换、处理所需要的字符串、文本,让工作高效。

通常Linux运维工作,都是面临大量带有字符串的内容,如:

  • 配置文件
  • 程序代码
  • 命令输出结果
  • 日志文件

正则表达式应用广泛,Linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用

通配符是大部分普通命令都支持的,用于查找文件或者目录,而正则表达式 是通过三剑客命令在文件(数据流)中过滤内容。


二、Linux三剑客简介

1.文本处理工具,均支持正则表达式引擎

  • grep:文本过滤工具,(模式:pattern)工具
  • sed:stream editor,流编辑器:文本编辑工具
  • awk:Linux的文本报告生成器(格式化文本),Linux上是gawk

2.正则表达式分类

Linux三剑客主要分两类

  • 基本正则表达式(BRE)

BRE对应元字符有^$.[]*

  • 扩展正则表达式(ERE)

ERE在BRE基础上,增加上 (){}?+|等字符

3.基本正则表达式BRE集合

  • 匹配字符
  • 匹配次数
  • 位置锚定

4.扩展正则表达式ere集合

扩展正则表达式必使用grep -E才能生效


三、grep

1.简介

作用:文本搜索工具,格局用户指定的"模式(过滤条件)"对目标文本逐行进行匹配检查,打印匹配到的行

模式:有正则表达式的元字符及文本字符所编写出的过滤条件;

语法:

2.实践

复制代码
cat /etc/passwd > ./passwd.txt grep -i "root" passwd.txt

反选

复制代码
grep -i "root" passwd.txt -v -c 
root@ou-virtual-machine:~# grep -i "root" passwd.txt -v

找空行

复制代码
grep '^$' passwd.txt -n

过滤注释行

复制代码
grep '^#' passwd.txt -v -n

或者

复制代码
grep '^[a-zA-Z]' passwd.txt -n

匹配w+前一个任意字符,或者w+后一个任意字符

复制代码
grep 'w.' passwd.txt 
grep '.w' passwd.txt

3.贪婪匹配

复制代码
grep ".*e" passwd.txt

+号匹配1次或者多次

复制代码
grep -E "w+" passwd.txt -n

复合实例


四、sed

1.sed简介

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。

sed是操作、过滤和转换 文本内容的强大工具。

常用功能包括结合正则表达式对文件实现快速增删改查,其中穿功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。

由于sed还会输出没匹配到的字符行,我们需要-n来处理

常用参数

sed的内置命令字符用于文件进行不同的操作功能,如对文件增删改查

sed常用内置命令字符:

sed匹配范围

2.输出文件的第2,3行的内容

p为打印的意思

复制代码
sed -n '2,3p' passwd.txt

如果不加-n那么不匹配的也会输出

3.匹配root字符串

复制代码
sed -n '/root/p' passwd.txt

4.删除的问题

复制代码
sed '/root/d' passwd.txt

但是查看文件却发现root字符串所在的行还在文件内

这里是因为sed删除的 是内存中的内容,并没有真正对文件内容进行操作。

写入文件加-i

5.替换

复制代码
sed "s/www/nihaoshijie/g" passwd.txt.bak

但文件内容还是没用修改

-i参数写入文件内

复制代码
sed "s/www/nihaoshijie/g" passwd.txt.bak -i

多次替换

复制代码
sed -e "s/nihaoshijie/www/g" -e "s/test/wwwwwwwwwwwwwwwwwwwwww/g" passwd.txt.bak -i

6.写入对应行

复制代码
sed "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" passwd.txt.bak -i

每行都加个分隔符

复制代码
sed "a ----------------------------------------------------" passwd.txt.bak -i

7.实例

拿出ip和子网掩码和广播地址

复制代码
ifconfig ens33 | sed "2p" -n | sed "s/^.*inet//"

五、awk

awk更像一门编程语言,支持条件判断、数组、循环等功能

三剑客的各个特点

  • grep,擅长单纯的查找或匹配文本内容
  • awk,更适合编辑、处理匹配到的文本内容
  • sed,更适合格式化文本内容,对文本进行复杂处理

三个命令称之为Linux的三剑客

1.awk基础

awk语法:

awk [option] 'pattern[action]' file...

awk 参数 '条件动作' 文件

2.举例

空格作为分隔符

$0 代表一整行

$1 代表第一列

$2 代表第二列

...

复制代码
awk '{print $1}' 1.txt

3.NF和NR

复制代码
awk '{print $NF}' 1.txt 
awk '{print $NR}' 1.txt

NR显示文件第五行

复制代码
awk 'NR==5' 1.txt

NR显示文件第二行到第五行

复制代码
root@ou-virtual-machine:~# awk 'NR==2,NR==5' 1.txt 
a6 a7 a8 a9 a10
a11 a12 a13 a14 a15
a16 a17 a18 a19 a20
a21 a22 a23 a24 a25

4.字符串占位

输出默认不带分隔符

复制代码
root@ou-virtual-machine:~# awk '{print $1 $2 $3}' 1.txt 
a1a2a3
a6a7a8
a11a12a13
a16a17a18
a21a22a23

root@ou-virtual-machine:~# awk '{print $1__$2__$3}' 1.txt 
a1a2a3
a6a7a8
a11a12a13
a16a17a18
a21a22a23

逗号会默认加空格分隔符

复制代码
root@ou-virtual-machine:~# awk '{print $1,$2,$3}' 1.txt 
a1 a2 a3
a6 a7 a8
a11 a12 a13
a16 a17 a18
a21 a22 a23

"字符串"分隔符

复制代码
root@ou-virtual-machine:~# awk '{print "1 List: "$1,"2 List: "$2,"3 List: "$3}' 1.txt 
1 List: a1 2 List: a2 3 List: a3
1 List: a6 2 List: a7 3 List: a8
1 List: a11 2 List: a12 3 List: a13
1 List: a16 2 List: a17 3 List: a18
1 List: a21 2 List: a22 3 List: a23
1 List:  2 List:  3 List: 

5.awk参数

前面的文件分隔符是空格,awk自动识别空格作为分隔符

但是如果我们用其他的分割符,那么awk并不会自动识别

复制代码
root@ou-virtual-machine:~# cat 1.txt
a1 a2 a3 a4 a5
a6 a7 a8 a9 a10
a11 a12 a13 a14 a15
a16 a17 a18 a19 a20
a21 a22 a23 a24 a25

root@ou-virtual-machine:~# cat 1.txt.bak 
a1#a2#a3#a4#a5
a6#a7#a8#a9#a10
a11#a12#a13#a14#a15
a16#a17#a18#a19#a20
a21#a22#a23#a24#a25



root@ou-virtual-machine:~# awk "{print $1}" 1.txt.bak 
a1#a2#a3#a4#a5
a6#a7#a8#a9#a10
a11#a12#a13#a14#a15
a16#a17#a18#a19#a20
a21#a22#a23#a24#a25

通过-F来修改识别分隔符

复制代码
cat 1.txt.bak | awk -F"#" '{print $1}'

小写f

复制代码
root@ou-virtual-machine:~# echo '"{print}"' > 1
root@ou-virtual-machine:~# awk -f 1 1.txt 
a1 a2 a3 a4 a5
a6 a7 a8 a9 a10
a11 a12 a13 a14 a15
a16 a17 a18 a19 a20
a21 a22 a23 a24 a25

6.awk变量

取出本机的ip

第一步先取出ifconfig第二行的数据

复制代码
ifconfig | awk 'NR==2{print $0}'
复制代码
ifconfig | awk 'NR==2{print $0}' | awk '{print $2}'

7.awk的分隔符

  • 输入分隔符,awk默认是空格,空白字符,变量名是FS
  • 输出分隔符,OFS

FS输入分隔符

awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格

当我们处理特殊文件,没用空格的时候,可以自由指定分隔符

复制代码
awk -F '#' '{print $1}' 1.txt.bak

修改默认输出符

复制代码
root@ou-virtual-machine:~# awk -F '#'  '{print $1,$2,$4}' 1.txt.bak 
a1 a2 a4
a6 a7 a9
a11 a12 a14
a16 a17 a19
a21 a22 a24  
root@ou-virtual-machine:~# awk -F '#' -v OFS=': ' '{print $1,$2,$4}' 1.txt.bak 
a1: a2: a4
a6: a7: a9
a11: a12: a14
a16: a17: a19
a21: a22: a24
: : 
root@ou-virtual-machine:~# 

8.awk的变量

NR、NF和FNR变量

复制代码
[root@localhost ~]# awk -F "#" '{print NR,NF,$1,$2}' 1
1 5 a1 a2
2 5 a6 a7
3 5 a11 a12
4 5 a16 a17
5 5 a21 a22

NR和FNR的区别

复制代码
[root@localhost ~]# awk -F "#" '{print FNR,$1,$2}' 1 1
1 a1 a2
2 a6 a7
3 a11 a12
4 a16 a17
5 a21 a22
1 a1 a2
2 a6 a7
3 a11 a12
4 a16 a17
5 a21 a22
[root@localhost ~]# awk -F "#" '{print NR,$1,$2}' 1 1
1 a1 a2
2 a6 a7
3 a11 a12
4 a16 a17
5 a21 a22
6 a1 a2
7 a6 a7
8 a11 a12
9 a16 a17
10 a21 a22

ORS和RS

复制代码
[root@localhost ~]# awk -F "#" '{print RS="-------",$1,$2}' 1 
------- a1 a2
------- a6 a7
[root@localhost ~]# awk -F "#" '{print ORS="-------",$1,$2}' 1 
------- a1 a2-------------- a6 a7-------------- a11 a12-------------- a16 a17-------------- a21 a22-------[
[root@localhost ~]# 

FILENAME

数组

默认数组

复制代码
[root@localhost ~]# awk "{print ARGV[0],$0}" 1
awk 0
awk 0
awk 0
awk 0
awk 0
[root@localhost ~]# awk "{print ARGV[1]}" 1
1
1
1
1
1
[root@localhost ~]# awk "{print ARGV[2]}" 1





[root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2]}' 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
[root@localhost ~]# 

自定义变量

复制代码
[root@localhost ~]# awk -v myname='o' 'BEGIN{print "myname=",myname}'
myname= o
[root@localhost ~]# 

9.awk格式化输出

print和printf的区别

printf需要自定义格式

复制代码
awk '{printf $0}' 1
a1#a2#a3#a4#a5a6#a7#a8#a9#a10a11#a12#a13#a14#a15a16#a17#a18#a19#a20a21#a22#a23#a24#a25[root@localhost ~]# 
[root@localhost ~]# 

自定义格式

复制代码
[root@localhost ~]# printf "%s\n" a b c d e
a
b
c
d
e

[root@localhost ~]# awk 'BEGIN{printf "%s\n%s\n",1,2,3,4,5}'
1
2

区别

相关推荐
宁zz12 小时前
乌班图安装jenkins
运维·jenkins
无名之逆13 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
大丈夫立于天地间13 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
cg501713 小时前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影13 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain13 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon13 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu14 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
xujiangyan_15 小时前
nginx的反向代理和负载均衡
服务器·网络·nginx