Shell编程之正则表达式与文本处理器

本文介绍了正则表达式的概念、基础与扩展,重点讲解了grep、egrep、sed、awk等工具在Linux中的使用,包括元字符的应用、基础和扩展正则表达式实例,以及sed的强大文本处理功能,如替换、删除和插入操作。
摘要由CSDN通过智能技术生成

本章结构

正则表达式

基础正则表达式
扩展正则表达式

文件处理器

sed
awk
sort
uniq
tr

正则表达式概述
  • 正则表达式,又称正规表达式、常规表达式
  • 使用字符串来描述、匹配一系列符合某个规则的字符串
  • 正则表达式组成
    1、普通字符
    大小写字母、数字、标点符号及-些其他符号
    2、元字符
    在正则表达式中具有特殊意义的专用字符
  • 正则表达式层次
    1、基础正则表达式
    2、扩展正则表达式
  • Linux中文本处理工具
    1、grep
    2、egrep
    3、sed
    4、awk
基础正则表达式元字符
  • 基础正则表达式是常用的正则表达式部分
  • 除了普通字符外,常见到以下元字符
    1、\:转义字符,\ ! 、\ n 等
    2、^: 匹配字符串开始的位置
    例:^a 、 ^the 、 ^#
    3、$: 匹配字符串结束的位置
    例: word $
    4、.:匹配除\n之外的任意的一个字符
    例:go.d 、 g…d
  • 常见元字符(续)
    1、:匹配前面子表达式0次或者多次
    ◆例: goo
    d、 go.*d
    2、[list]:匹配list列表中的一 个字符
    ◆例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]
    3、[^ list]:匹配任意不在list列表中的一一个字符
    ◆例: [^a-z]、 [^0-9]、 [^A-Z0-9]
    4、{n,m)}:匹配前面的子表达式n到m次,有{n}、 {n,\}.
    {n, m\}三种格式
    ◆例: go{2}d、 go{2,3}d、 go{2,}d
[root@localhost ~]# echo ABC/0 | grep ^[a-zA-Z0-9]
ABC/0
[root@localhost ~]# echo 522dd/0 | grep ^[a-zA-Z0-9]
522dd/0
[root@localhost ~]# echo 522dd/0 | grep ^[^a-zA-Z0-9]
[root@localhost ~]# echo 522dd/0 | grep ^[^a-zA-Z0-9]
[root@localhost ~]# echo /522dd/0 | grep ^[^a-zA-Z0-9]
/522dd/0


[root@localhost ~]# echo good | grep "go\{1,3\}d"
good            o字符的一个到三个
[root@localhost ~]# echo good | grep "go\{1\}d"
[root@localhost ~]# echo god | grep "go\{1\}d"
god              最少一个
[root@localhost ~]# echo good | grep "go\{,1\}d"
[root@localhost ~]# echo good | grep "go\{,2\}d"
good              至多两个
[root@localhost ~]# echo goood | grep "go\{,2\}d"
[root@localhost ~]# echo good | grep "\<g"
good              以g开头的字符串
[root@localhost ~]# echo good | grep "d\>"
good               以d结尾的字符串
[root@localhost ~]# echo good | egrep "go+d"
good              o至少出现一次
[root@localhost ~]# echo goodfoodcool | egrep "good|cool"
goodfoodcool           含有good或者cool 的字符串
[root@localhost ~]# echo goodfoodcool | egrep "go(ol|od)"
goodfoodcool      包含   以go后面为ol或od的字符串
[root@localhost ~]# echo goodfoodcool | grep -E "go(ol|od)"
goodfoodcool

[root@localhost ~]# echo godgoigdigosgosd | egrep "g.{1}d"
godgoigdigosgosd          查找g和d之间至少一个字符

[root@localhost ~]# egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.94.100
NETMASK=255.255.255.0
GATEWAY=192.168.94.2
DNS1=114.114.114.114
DNS2:1114.1114.1114.1114     查看本机网卡任意

[root@localhost ~]# egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.94.100
NETMASK=255.255.255.0
GATEWAY=192.168.94.2
DNS1=114.114.114.114        过滤掉 DNS2:1114.1114.1114.1114

Sed 流编辑器
sed工具概述
  • 文本处理工具,读取文本内容,根据指定的条件进行处
    理,如删除、替换、添加等
  • 可在无交互的情况下实现相当复杂的文本处理操作
  • 被广泛应用于Shell脚本,以完成自动化处理任务
  • sed依赖于正则表达式
工作原理

在这里插入图片描述

sed命令的格式
  • sed 选项 ‘动作’ 文件名
  • cat 文件名 | sed 选项 '动作
选项:
  • -n :只显示被修改的行的内容
  • -e :直接在命令列模式上进行 sed 的动作编辑;
  • -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
  • -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
  • -i :直接修改读取的文件内容,而不是输出到终端。
动作:
  • a :在指定行后 新增一行或多行内容
  • c :替换指定行的内容
  • d :删除指定行的内容
  • i :在指定行之前 插入一行或多行内容
  • s :替换指定内容
[root@localhost ~]# sed '' zz.txt     打印文本
[root@localhost ~]# sed 'p' zz.txt   对文本逐行打印
[root@localhost ~]# sed -n 'p' zz.txt   只输出不打印

[root@localhost ~]# sed -n '1,3p' zz.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     打印1-3[root@localhost ~]# cat -n zz.txt | sed -n '1,3p'   
     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
                                     
                                     打印1-3行并显示行号
[root@localhost ~]# cat -n zz.txt | sed -n '$p'   打印最后一行
    10	ROOT:x:0:0:root:/root:/bin/bash  
[root@localhost ~]# cat -n zz.txt | sed -n '1,+4p'
     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	1p:x:4:7:1p:/var/spoo1/1pd:/sbin/nologin
                                             打印1-5行内容 
[root@localhost ~]# cat -n zz.txt | sed -n '1~2p'
     1	root:x:0:0:root:/root:/bin/bash
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5	1p:x:4:7:1p:/var/spoo1/1pd:/sbin/nologin
     7	rot:x:0:0:rot:/rot:/bin/bash
     9	roooot:x:0:0:roooot:/roooot:/bin/bash
                      间隔两行打印  ,打印奇数行
[root@localhost ~]# cat -n zz.txt | sed -n '2~2p'  间隔两行打印,打印偶数行

[root@localhost ~]# sed -n '/^root\|bash$/p' zz.txt
打印以root开头 或 以bash结尾的行
[root@localhost ~]# sed -n '2p;4p' zz.txt    打印24[root@localhost ~]# sed -ne '2p' -e '4p' zz.txt    有多条命令输入,满足任意一个都可以输出
[root@localhost ~]# sed -n '/ /p' zz.txt    打印有空格的行
[root@localhost ~]# cat -n zz.txt | sed -n '/ROOT/Ip'
     1	root:x:0:0:root:/root:/bin/bash
    10	ROOT:x:0:0:root:/root:/bin/bash
打印含有ROOT的行,忽略大小写
[root@localhost ~]# sed -n '/^root\|nologin$/p' zz.txt   |是扩展元字符,需要转义
[root@localhost ~]# sed -n -r '/^root|nologin$/p' zz.txt   -r在不转义的时候使用,等同于转义
[root@localhost ~]# sed -ne '/^root/p' -e '/nologin$/p' zz.txt  -e为或的意思
[root@localhost ~]# sed -n '/^$/p' zz.txt   打印空行
[root@localhost ~]# sed -n '/  /p' zz.txt   打印有空格的行
[root@localhost ~]# sed  '/\\/p' zz.txt     打印有\的行
[root@localhost ~]# sed  '/\/bin\/bash/p' zz.txt   打印/bin/bash的行
[root@localhost ~]# sed  '/\/bin\/bash/ccc/p' zz.txt   查找并替换
[root@localhost ~]# sed -n 's/ROOT/XXX/pi' aa.txt        替换的时候忽略大小写,默认第一个
[root@localhost ~]# sed -n 's/ROOT/XXX/gpi' aa.txt       全部替换并忽略大小写
[root@localhost ~]# sed -n 's/[0-9]/x/gp' aa.txt         把数字全部替换成x
[root@localhost ~]# sed '/root/cxxxx'  aa.txt            //c为整行替换,c后面的东西都是要替换的东西
[root@localhost ~]# sed ' = ' aa.txt                     打印行号
[root@localhost ~]# sed -n  ' = ' aa.txt                 不输出打印,只显示行号
[root@localhost ~]# sed -n  '$ = ' aa.txt                打印最后一行的行号
[root@localhost ~]# sed -n  '$ =;3p ' aa.txt             打印第三行内容,并显示最后一行行号  //sed是逐行打印的,所有3p在前
[root@localhost ~]# sed  '5q' aa.txt                     从第5行退出,后面不做处理
  

使用sed命令删除

[root@localhost ~]# cat -n zz.txt | sed -n 'd'  全部删除
[root@localhost ~]# sed -n '10d' zz.txt   删除第10[root@localhost ~]# sed  '1,3d' aa.txt                  删除第13[root@localhost ~]# sed '/root/d'                       删除包含root的行
[root@localhost ~]# sed '/^root/d' aa.txt               删除已root开头的行
[root@localhost ~]# sed -n '10s/ROOT/XXX/gpi'           定位到第10行忽略大小写把root替换为XXX
[root@localhost ~]# sed -n '1,10s/ROOT/XXX/gpi'1行和第10

使用sed命令插入和附加文本

sed '1a hello word'  aa.txt               在第一行的下面插入hello word
sed '1i hello word'  aa.txt               在第一行上面插入
sed 'a IPADDR=192.168.80.1' aa.txt        每一行的下面都插
sed '/root/a IPADDR=192.168.80.1' aa.txt  有root的的行插入
sed '1,3a IPADDR=192.168.80.1' aa.txt     13行插入
sed -i '1,3a  IPADDR=192.168.1.1' aa.txt 直接编辑文件,而不输出结果
sed -i.bak '1,3a  IPADDR=192.168.1.1'  aa.txt 编辑文件的时候备份文件
sed  'r /etc/hosts' aa.txt               r读取一个文件
sed '1r /etc/hosts' aa.txt               第1行读过来
sed '1,3r /etc/hosts' aa.txt             13行
sed '/root/r /etc/hosts'  aa.txt         在有root的行读取
sed 'w /opt/bak'  aa.txt                 写入另外一个文件/另存
sed '1w /opt/bak'  aa.txt                再次写入就覆盖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值