shell脚本——正则表达式与文本三剑客Grep、AWK以及Sed

一、正则表达式

1.1 正则表达式的含义

由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。

1.2 正则表达式的分类

通配符匹配文件(而且是已存在的文件)

  • 基本正则表达式

  • 扩展正则表达式

1.3 元字符

 . :代表任意字符

 [ ] :匹配指定范围内的任意单个字符

[^]  :匹配指定范围外的任意单个字符( 取反)

常见元字符:

[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S     #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s     #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符

1.4 表示次数

*    #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*    #任意长度的任意字符,不包括0次
\?   #匹配其前面的字符出现0次或1次,即:可有可无
\+    #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}    #匹配前面的字符n次
\{m,n\}   #匹配前面的字符至少m次,至多n次
\{,n\}     #匹配前面的字符至多n次,<=n
\{n,\}     #匹配前面的字符至少n次

提取网卡信息:IP地址、子网掩码及网关

1.5 位置锚定

^ 开头

$ 结尾

\b 字符串的开头 \ <

\b 字符串的结尾 \ >

1.6 分组或

分组:( ) 将多个字符捆绑在一起,当作一个整体处理

或者:\ |

二、扩展正则表达式

将斜杠去掉

表示次数:
*  匹配任意字符,任意次
? 0或1次
+ 1次或多次
{n}  匹配n次
{m,n} 至少m次,最多n次
{,n}  匹配前面的字符至多n次,<=n n可以为0

表示分组:
分组:( )将多个字符捆绑在一起,当作一个整体处理
向后引用:\1,\2....
|   或者
a|b   a或者b

#表示qq号

#表示邮箱

#表示手机号

三、grep

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

选项:
-color=auto    #对匹配到的文本着色显示
-m      # 匹配#次后停止
grep -m 1 root /etc/passwd   #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
grep -c root /etc/passwd    #统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行 
grep -A3 root /etc/passwd   #匹配到的行后3行业显示出来
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -E root|bash  /etc/passwd
-w 匹配整个单词
grep -w root /etc/passwd
useradd rooter
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f   file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r   递归目录,但不处理软链接
-R   递归目录,但处理软链接
 

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

面试题:

 # 统计当前主机的连接状态

ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c

# 统计当前连接主机数

ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c

四、awk

4.1 awk的基础用法

awk 文本处理工具 加载一行处理一行

vim 文本处理工具 ,内存不足 打不开超级大的文件

awk 选项 ’表达式(处理动作)‘

选项

-F 指定分隔符

-v 指定变量

表达式:awk的语言的表达式

1.不写没有

2.找到特定的行

处理动作

print 打印

printf 打印

awk 内置变量

$0 全文

$1 第一列

$2 第二列

awk   '{print $1}'

awk 内置变量和 shell环境中的变量 会有冲突 ‘{ }’

awk  '{print $n}'

以空格为分隔符 取第n列 (n>=0)

示例: 打印磁盘已经使用情况

df |awk '{print $5}'

4.2 awk 常见的内置变量

awk 选项 '模式{print }'

FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"

OFS:输出时的分隔符

NF:当前处理的行的字段个数

NR:当前处理的行的行号(序数)

$0:当前处理的行的整行内容

$n:当前处理行的第n个字段(第n列)

FILENAME:被处理的文件名

RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

FS:

awk -v FS=':' '{print $1FS$3}'  /etc/passwd
#此处FS 相当于变量  -v 变量赋值

NF:

awk -F:'{print NF}' /etc/passwd
#表示字段
awk -F:'{print $NF}' /etc/passwd
#$NF表示最后一个字段
df|awk -F: '{print $(NF-1)}'
#倒数第二行

NR:

awk  '{print $1,NR}' /etc/passwd
#NR 表示当前处理的行号
awk  'NR==2{print $1}' /etc/passwd
#只取第二行的第一个字段

4.3 面试题

1.取出奇数行与偶数行

seq 10 | awk 'i=!i'
#奇数行
seq 10 | awk '!(i=!i)'
#偶数行

2.使用for循环计算1到100的和

awk 'BEGIN{sum=0;for(i=0;i<=100;i++){sum+=i}print sum}'

3.awk 数组计算

awk 建立数组
awk 'BEGIN{a[1]="lisi";a[2]="liwu";print a[1],a[2]}'
awk 'BEGIN{a[1]="lisi";a[2]="liwu";for(i in a)print a[i]}'

4.统计/etc/fstab文件中每个文件系统类型出现的次数

cat /etc/fstab | grep -v '^#' | grep -v '^$' | awk '{print $3}' |sort | uniq -c

5.统计/etc/fstab文件中每个真单词出现的次数

grep -Eo "\b[a-zA-Z]+\b" /etc/fstab 

6.查出/tmp/的权限,以数字方式显示

stat /tmp/ |awk -F"[(/]"  'NR==4{print $2}'

7.查出用户UID最大值的用户名,UID及shell类型

cat /etc/passwd |sort -t:   -k3 -n|tail -n1

五、sed

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。

5.1 格式

sed [选项]... {脚本(如果没有其他脚本)} [输入文件]..

常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p'  -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑

#说明: 
-ir 不支持
-i -r 支持
-ri   支持
-ni   会清空文件

举例:

seq 3|sed       #生成1-3数字传给sed
#该格式报错,基本格式中的'{自身脚本语法}'不可以不写,可以写空则是默认打印全部内容如下
seq 3 | sed ' '
1
2
3

5.2 sed语法及命令

sed脚本语法:地址+sed自己脚本命令,地址即范围例如全文或第一行,第一行至第三行等范围

sed脚本命令:

p 将内容打印到屏幕,使用时关闭自动打印功能,-n选项

q 到指定的内容即退出,例如打印到第二行直接退出

d 删除指定内容

a 在指定位置添加内容

c 替换指定内容

~ 步进,0~2,2个间隔,1~2,1个间隔 seq 10 |sed -n '0~2p'每间隔2个打印一次

seq 10 |sed -n '0~2p'
#打印偶数行
 
seq 10 |sed -n '1~2p'
#打印奇数行 

5.3 sed选项

  • -n 选项,sed默认有自动打印功能,-n选项是关闭打印功能,一般配合脚本命令p使用
  • -r  选项,开启扩展正则表达式
  • -i  选项,在文件中添加内容,可以在-i是加.bak后缀备份修改的文件。例如 sed -i.bak  a.txt会在同目录下生成一个a.txt.bak文件

5.4 搜索替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写

5.5查找几点到几点之间的日志

sed -n '/2023:08:09/,/2023:09:42:37/p' access_log

5.6 分组后项引用

sed 's//\/'

提取IP地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值