您的位置:首页 > 运维架构 > Shell

shell中的文本处理正则表达式

2019-02-27 21:52 99 查看

1.grep 文本过滤命令

1).grep

Global search regular expression and print out theline:全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行由正则表达式或者字符及基本文本字符所编写的过滤条件

2).grep 的格式

例如

grep 匹配条件 处理文件
grep root passwd
grep ^root passwd
grep root$ passwd
grep -i root passwd
grep -E "root|ROOT" passwd


默认过滤root
不区分大小写过滤root

不区分大小写过滤root前无字符的字符串

不区分大小写过滤root后无字符的字符串

不区分大小写过滤只是root的字符串

不区分大小写过滤以root开头的且只是root的

不区分大小写过滤以root开头的

不区分大小写过滤以root结尾的且只是root的

不区分大小写过滤只以root开头的或只是root结尾的,“|”是扩展过滤命令,所以要加 -E,或用egrep命令

不区分大小写过滤除去只以root开头的或只是root结尾的

不区分大小写过滤除去只以root开头的或只是root结尾的且只含有root的

3).grep中的正则表达式

^ 关键字
关键字 $
< 关键字
关键字 >
< 关键字 >

4).grep 中字符的匹配次数设定
* 字符出现 [0- 任意次 ]
? 字符出现 [0-1 次 ]
+ 字符出现 [1- 任意次 ]
{n} 字符出现 [n 次 ]
{m,n} 字符出现 [ 最少出现 m 次,最多出现 n 次 ]
{0,n} 字符出现 [0-n 次 ]
{m,} 字符出现 [ 至少 m 次 ]
(xy){n} xy 关键字出现 [n 次 ]
. 关键字之间匹配任意字符


默认过滤x

过滤出现0-1次的x

过滤出现1到任意次的x

过滤出现2次的x

过滤出现1-3次的x

过滤出现1-3次的x


过滤出现0-1次的x和任意次y

过滤以x开始的出现0-1次的x和一次
过滤出现2次的x和任意次y

过滤出现0-2次的x和任意次y

过滤出现2次以上的x和任意次y

过滤出现1次的x和多次y


过滤出现多次的xy

过滤出现多次的xy并且以xy结尾

5).grep 正则表达式与扩展正则表达式

正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”或”的扩展正则表达式元字符 , 正规的 grep 无法识别加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp和grep -E 一样

2.sed 行编辑器

1).stream editor

用来操作纯 ASCII 码的文本
处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行sed 符合模式条件的处理 不符合条件的不予处理处理完成之后把缓冲区的内容送往屏幕接着处理下一行 , 这样不断重复 , 直到文件末尾

2).sed命令格式

调用 sed 命令有两种形式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)

2).sed对字符的处理
参数 含义
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
3).p模式操作

eg:

sed -n ‘/:/p’ fstab 显示有“:“的行
sed -n ‘/UUID$/p’ fstab 显示有UUID结尾的字符串的行
sed -n ‘/^UUID/p’ fstab 显示以UUID开头的行
sed -n ‘2,6p’ fstab 显示2,6行
sed -n ‘2,6!p’ fstab 显示除了2,6行的所有


忽略空白行

不忽略空白行

显示以#开头的行

显示不是#开头的行

不忽略空白行,显示2-6行

不忽略空白行,只显示第6行

不忽略空白行,显示第6行和第2行(-e表示执行,两次-e表示执行两次)
方法1:

方法2:

不忽略空白行,显示除去第2行和第6行

4).d模式操作
sed ‘/^UUID/d’ /etc/fstab 显示除去UUID开头的行
sed ‘/^#/d’ /etc/fstab 显示除去#开头的行
sed ‘/^$/d’/etc/fstab 显示除去空白行的行
sed ‘1,4d’/etc/fstab 显示除去1-4行的行
sed –n ‘/^UUID/!d’ /etc/fstab 显示UUID开头的行

显示除去#开头的行


显示除去#开头的行和空白行

显示除去4-6行的行

显示除去第4行的行

显示除去第4行和第6行的行

显示除去UUID开头的行

显示UUID开头的行

5).a模式操作
sed ‘/^UUID/ahello’ fstab 显示在UUID开头后加上hello的fstab
sed ‘/^UUID/ahello\nwestos’ fstab 显示在UUID开头后加上两行hello行和westos行的fstab


默认添加hello会添加到fstab的每一行之后
追加到最后一行可以使用echo命令


删除最后一行hello
显示在UUID开头后加上两行hello行和westos行的fstab

6).i 模式操作
sed ‘/^UUID/ihello’ fstab 在以UUID开头的行的前一行加入hello
sed ‘/^UUID/ihello\nwestos’ fstab 在以UUID开头的行的前两行加入hello行和westos行


7).c 模式操作
sed ‘/^#/c\hello\nwestos’ fstab 将以#开头的行换成hello行和westos行并将换后的文件内容显示出来
sed ‘/^#/c\hello’ fstab 将以#开头的行换成hello并将换后的文件内容显示出来

将以#开头的行换成hello并将换后的文件内容显示出来

将以#开头的行换成hello行和westos行并将换后的文件内容显示出来

8).w 模式操作
sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab 将fstab中的以UUID开头的行整合到tmp下的fstab中并显示出来
sed -n’/^UUID/w /tmp/fstab.txt’ /etc/fstab 将fstab中的以UUID开头的行整合到tmp下的fstab中,不显示出来
sed ‘/^UUID/=’/etc/fstab 将fstab中的以UUID开头的行的行数显示出来
sed ‘5r /etc/issue’ /etc/fstab 将issue文件中的内容整合到fstab中的第5行开始

将fstab中的以#开头的行整合到mnt下的testfile中并显示出来


将hello文件中的内容整合到fstab中的第5行开始

9).sed 的其他用法
sed -n ‘/^UUID/=’ fstab 只显示以UUID开头的行的行号
sed -n -e ‘/^UUID/p’ -e ‘/^UUID/=’ fstab 显示以UUID开头的行的行以及行号
sed -e ‘s/brown/green/; s/dog/cat/’ data 将brown换成green,将dog换成cat并显示data中所有的内容
sed -f rulesfile file 对file执行rulesfile中的规则并显示出来
sed ‘s/^//#/’ /etc/fstab 将以/开始的行的/换成#并显示出来
sed ‘s@^/@#@g’ /etc/fstab 将以/开始的行的/换成#并显示出来
sed ‘s///#/’/etc/ fstab 将/换成#并显示出来
sed ‘G’ data 在每一行后添加一行空白行
sed ‘$!G’ data 在每一行后添加一行空白行,最后一行不添加
sed ‘=’ data sed ‘N; s/\n/ /’
sed -n ‘$p’ data 输出最后一行

只显示以UUID开头的行的行号
显示以UUID开头的行的行以及行号

显示以UUID开头的行的行以及行号显示在每一行之前

显示以UUID开头的行的行以及行号显示在每一行之前且空一格

将以/开始的行的/换成#并显示出来



rule中的规则是显示以UUID开头的并显示出行号

将nologin修改为bash


将1-5行中的nologin变成bash其他不变

修改第5行中的nologin成bash

修改第5行和第3行,将nologin变成bash

修改从daemon行到mail行中的nologin成dash

将:修改为#####,将nologin修改为redhat

修改/为空

修改/为空(可以将/变成@,但是转义的/不能变)

修改nologin成bash

在每一行后添加一行空白行

在每一行后添加一行空白行,最后一行不添加


显示行号且和每一行有个空格

3.awk 报告生成器

1).awk
awk 处理机制:awk 会逐行处理文件,支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式上分别体现如下 :

BEGIN{} 读入第一行文本之前执行 , 一般用来初始化操作
{} 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令快
END{} 处理完最后一行文本之后执行 , 一般用来输出处理结果

2).awk 基本用法
linux 上面默认使用 gawk

awk ‘{print FILENAME}’ /etc/passwd 每一行都显示出目录的名字
awk ‘{print NR}’ /etc/passwd 每一行输出行号,默认以空格为分隔符
awk ‘{print NF}’ /etc/passwd 每一行输出有多少列
awk ‘BEGIN{print “NAME”}’ 在开始的时候输出NAME这个字符串
awk ‘END{print “WESTOS”}’ 在结尾输出WESTOS这个字符串
awk -F : ‘BEGIN{print “NAME”}{print $1}END{print “WESTOS”}’ 以":"为分隔符,输出第一列,在开头输出NAME,结尾输出WESTOS
awk ‘/bash$/’ /etc/passwd 输出以bash结尾的行
awk -F : ‘/bash$/{print $1}’ 以“:”为分隔符,输出以bash结尾的第一列

以:为分隔符,输出hello

以":"为分隔符,输出第一列,在开头输出hello,结尾输出end


输出以bash结尾的人的个数

目录中的每一行都显示出目录的名字

以:为分隔符输出行号

以:为分隔符输出每一行有几列

在开始的时候输出NAME这个字符串

“:”为分隔符,输出第一列

以“:”为分隔符,输出以bash结尾的第一列

以“:”为分隔符,输出不以bash结尾的第一列

计算100+50

awk 'BEGIN{a=34;print a+12}'  #计算34+12
awk -F : '/^ro/{print}' /etc/passwd  #输出以ro开头的行
awk -F : '/^[a-d]/{print $1,$6}' passwd.txt  #以:为分隔符输出以a到d开头的行的第1和第6列
awk -F : '/^a|nologin$/{print $1,$7}' passwd.txt  #以:为分隔符输出以a开头的或以nologin结尾的行的第1和第6列
awk -F : '$6~/bin$/{print $1,$6}'  #以:为分隔符,输出第6列是bin结尾的行的第1和第6列
awk -F : '$7!~/nologin$/{print $1,$7}' passwd.txt  #以:为分隔符,输出第7列不是nologin结尾的行的第1和第7列

计算100+50

输出以a到d开头的行



输出不是以a到d开头的行(两种方法)


输出不是以a开头的或以bash结尾的行

输出以a开头的或以bash结尾的行

输出不是以a开头但是以bash结尾的行

以:为分隔符,输出第6列是bin结尾的行

以:为分隔符,输出第6列只是bin结尾的行

以:为分隔符,输出第6列不是bin结尾的行

输出第6列是/home开头且以bash结尾的行的第一列

输出第6列是/home开头且以bash结尾的行的人数(可以登陆系统的人数)(循环)

3).awk测试
抓取网卡的ip
此台主机网卡名称为ens3


在系统中可以登陆系统的用户

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: