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

‘?

正则表达式

正则表达式定义

正则表达式又称正规表达式、常规表达式。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,如Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。

元字符

^ : 匹配输入字符串的开始位置,除非再方括号表达式中使用,表示不包含该字符集合

. : 匹配除“\r\n”之处的任何单个字符

\ : 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义

*: 匹配前面的子表达式零次或多次

[ ] : 字符集合,匹配所包含的任意一个字符

[^] : 赋值字符集合,匹配未包含的一个任意字符

[n1-n2] : 字符范围,匹配指定范围内的任意一个字符

{n} : n是一个非负整数,匹配确定的n次

{n,} : n是一个非负整数,至少匹配n次

{n,m} : m和n均为非负整数,其中n<=m,最少匹配n次最多匹配m次

\<....\>  :匹配某一个单词的行

\> : 匹配以..结尾的行

\< 匹配以....开头的行

grep

  • -n :表示显示行号
  • -l表示不区分大小写
  • -v 表示过滤
  • [ ] 查找集合字符
[root@localhost ~]# grep -n 'root' xy.txt   查找带有root的行并显示行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n '[ a ]' xy.txt   查找带有a的字符
1:root:x:0:0:root:/root:/bin/bash
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin

sed

文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等,并且可在五交互的情况下实现相当复杂的文本处理操作,被广泛应用与shell脚本,以完成自动化处理任务,且sed依赖于正则表达式
工作原理
读取---------执行--------显示

sed命令格式

sed -n '编辑指令' 文件1 文件2
sed -n -e '编辑指令' 文件1 文件2
sed -i -e '编辑指令' 文件1 文件2

常用选项

  • -e :指定要执行的命令,只有一个编辑命令时可省略
  • -n : 只输出处理后的行,读入时不显示
  • -i : 直接编辑文件,而不输出结果
  • -f :用指定的脚本文件来处理输入的文本文件
    p :打印指定的行
    d :删除指定的行
    s :字串替换,格式: “行范围s/原字符串/新字符串/g”
    g :表示只要符合条件,全部进行处理
    r :可以将另一个文件内容读取到文件中
    w :可以将另一个文件内容覆盖到文件中
    i :插入,在当前行上面插入一行或多行
    a :插入,在当前行后面插入一行或多行
    c :将选定行替换成指定内容
    y :字符转换
[root@localhost ~]# sed  '1p' xy.txt         #不加选项是输出执行后和显示的结果
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost ~]# echo hello world gg | sed -nr 's/(hello) (world) (gg)/ \2 \1 \3/p'
 world hello gg

[root@localhost ~]# sed -n '1p' xy.txt   #加-n显示的是执行后的结果不过显示的结果
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# sed -n '/^root\|nologin$/p' xy.txt   #输出执行后的结果,以root开头或者nologin结尾的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

awk

筛选、过滤、匹配

awk关键字 选项 命令部分 '{xxxx}'  文件名
awk {'print "'$变量名'"}'         #映入awk外部变量

内建变量

  • NF :当期处理的行的字段个数
  • NR :当前处理的行的行号
  • $0 :当前处理的行的整行内容
  • $n :当前处理的行的第n个字段
  • FS :指定每行文本的字段分隔符,默认为空格或制表位
  • OFS :指定输出时文本列之间的连接符
  • RS :数据记录分隔符,默认为\n,即每行为一条记录
  • ORS :指定每行之间连接型
[root@localhost ~]# awk '{print}' p.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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# awk -F: '{print $1 }' p.txt  #以:为分隔符查看文件的第一行内容
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@localhost ~]# awk -F: '{print $1,$2 }' p.txt   #以:为分隔符,打印第一行第二行
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x

[root@localhost ~]# awk -F: '{print NR }' p.txt   #打印行号
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# awk  '(NR%2)==1{print}'  p.txt ¥打印奇数行的内容
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值