shell脚本:正则表达与sed、awk

正则表达式

正则表达式,又称正规表达式、常规表达式,使用字符串来描述、匹配一系列符合某个规则的字符串。
正则表达式分为基础正则表达式和扩展正则表达式。

正则表达式元字符

基础元字符:
!:否定的意思
\:转义字符,\!、\n等,将特殊字符的特殊含义转成普通含义,或将普通含义转成特殊含义
^:匹配字符串开始的位置,例如a、the、^#,表示以什么为开头
$:匹配字符串结束的位置,例如word$,表示以什么为结尾,^$表示空行
.:匹配除\n之外的任意一个字符,一个.代表一个字符
*:匹配前面的字符0至多次
[list]:匹配list列表中的字符,例如[Aa-Zz][0-9]
[^list]:匹配不在列表中的字符,例如匹配特殊字符[^Aa-Zz0-9]
{n,m}:匹配前面的字符n到m次,可以写成{n}\匹配n次、{n,}\最少匹配n次、{,m}\最多匹配m次,可以出现0次
<:匹配以什么开头的行
>:撇配以什么结尾的行
<…>:精确匹配有什么单词的行
扩展元字符:
扩展元字符
+:匹配前面的字符最少一次
?:匹配前面的字符最多一次
():将括号内的字符串作为一个整体进行匹配等操作
|:以或的方式匹配字符串,或者用于命令后表示将前面命令执行的结果交给后面的命令处理

sed

sed和grep一样按行操作
sed首先将第一行内容放入模式空间,然后做第一个命令输出到屏幕,再做第二个命令输出到屏幕,
第一行做完后,做第二行,
一行一行的逐行放进模式空间,然后每行做完一个命令就输出到屏幕一次,直到做完所有命令,这一行结束,然后对下一行进行操作,如果下一行没有需要执行的命令那么直接显示到屏幕,再对下下一行进行操作。

sed的选项

sed如果要使用扩展元字符要加上-r
sed -n 'p' passwd.txt |head			-n只显示执行过命令后的行,读入的不显示 p  打印的意思,显示在屏幕上
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

sed -e 'p' passwd.txt				-e指定要执行的命令,后面只跟一个命令时可以省略,执行多个命令时,每个命令前都要加上-e
sed -i 'p' passwd.txt				-i将输出结果覆盖至原文件,通常在i后加上.bak先对原文件进行备份
sed 's/原内容/新内容/p' passwd.txt	将原内容替换成新内容
sed '=' passwd.txt					显示每行的行号
sed 'w/etc/passwd' passwd.txt		将passwd.txt文件中的内容以覆盖的形式写入/etc/passwd中
sed 'ihello world' passwd.txt一		在每一行的上面插入hello world
sed '3ihello\nworld' passwd.txt		在第3行的上面插入hello换行再插入world
sed '1a999' passwd.txt				在第1行下面插入999
sed '$a999' passwd.txt 				在最后一行下面插入999
sed '1d' passwd.txt					删除第一行
sed '1,4d' passwd.txt 				删除1-4

awk

同样是文本处理工具,但是更高级。已经几乎变成一种编程语言,主要做一些筛选,过滤,统计总结。
awk不能替换,不能修改文件,awk能对整行进行切分,更加精细,awk同样是按行输出,但是不会默认输出,awk用’{}'来指定命令部分,格式为 awk 选项 ‘{}’ 文件名。
awk有一些内置变量,这些内置变量只在awk中生效
比如:
$0 代表整行
$1 一行中的第一列 显示的时候默认以空格或者tab键作为分隔
$n 一行中的第n列 如果需要以其他的字符分隔需要自己指定 这个n代表数字
NF 通常和-F一起使用,显示的是用分隔符分隔后,一行有多少列,$NF表示用分隔符分隔后的最后一列
NR 显示每一行的行号
FS 指定分隔符 FS=" " 里面跟分隔符
OFS 输出数据时,指定每列之间用什么分隔,默认是空格,在awk中看到,会识别成OFS中的分隔字符,所以为什么用,分隔会变成用空格分隔
RS 在原来每一行分隔的基础上,每一行遇到RS指定的分隔符就切分(分隔)一次
ORS 指定每一行之间以什么来分隔

awk -F 		指定分隔符
awk -F: '$1~/ daemon/{print $NF}' p.txt		~表示模糊匹配,$1~表示对于第一列进行模糊匹配,匹配后面/ /中的内容
awk 'END{print NR}’ p.txt					END在处理完所有行后对最后进行处理的行执行什么
awk 'BEGIN{FS=: }{print $1}’p.txt			BEGIN在处理行之前执行什么,FS=:在处理行之前定义好分隔符为:
awk 'NR>3 && NR<10{print NR,$0}'p.txt		awk也可以进行逻辑判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值