shell中的文本处理正则表达式(grep+sed+awk linux三剑客)

1.正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一定字符、及这些特定字符的组合,组成一个“规则字符串”这个“规则字符串”用来表达对字符串的一种过滤逻辑

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串

正则表达式是由一串字符串和元字符构成的字符串,主要的功能是文本查询和字符串操作

(1)基本正则表达式元字符的集合以及意义

符号 描述的意义
* 0个或多个在*之前的那个普通字符
. 匹配任意字符
^ 匹配行首,或后面字符的非
$ 匹配行尾
[] 匹配任意字符
\ 转义符,屏蔽元字符的特殊含义
<> 精确匹配符号
{n} 匹配前面出现字符n次
{n,} 匹配前面的字符 至少出现n次
{n,m} 匹配前面的字符出现n~m次

2.grep命令

(1)基本描述

grep命令是一种强大的文本搜索工具,根据用户指定的模式对目标文件进行匹配检查,并打印匹配到的行。
模式:事由正则表达式或字符以及基本的文字字符所编写的过滤条件。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板
如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名,搜索的结果被送到屏幕,不影响原文件内容
grep可用于shell脚本,因为grep通过返回一个==状态值==来说明搜索的状态
**如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2**
我们利用这些返回值就可进行一些自动化的文本处理工作

(2)grep 匹配条件 处理文件

-c 输出匹配行的数量
-i 忽略大小写
-n 列出所有匹配行,并显示每一行的行号
-v 忽略匹配行,输出不匹配的内容
-s 不显示错误信息或不匹配的内容
-r 递归搜索,不仅搜索目标目录,还搜有其子目录
-w 匹配整词
-x 匹配整行
-q 禁止输出任何结果,以退出状态表示是否搜索成功
-l 只列出匹配的文件名,不列出具体的文件内容
grep   root   passwd搜索全文中的root
grep  ^root  passwd搜索全文中以root开头的
grep  root$  passwd搜索全文中以root结尾的
grep -i root   passwd忽略大小写
grep -E "root|ROOT" passwd同时匹配多个条件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

grep -c root /etc/passwd
结果:2
grep -n root /etc/passwd 
结果:
1:root:x:0:0:root:/root:/bin/bash
10:operater:x:11:0:operater:/root/sbin/nologin
gerp -v  root /etc/passwd
结果:不显示1和10行,其余显示
gerp -vc  root /etc/passwd
结果:26
gerp -s root westos
结果:为输出,未报错
grep root westos
结果:报错,不存在westos文件
grep -w roo* /etc/passwd
结果:没有输出
原因:-w是匹配整个词,*为一个普通的符号
grep -w world world.txt
结果:
world cub
world
heheh world
grep -x  world world.txt
结果:
world
grep -q -x  world world.txt
echo $?
结果:0

(3)grep 中字符的匹配位置设定

^ 关键字  寻找以什么开头的关键字
关键字 $  寻找以什么结尾的关键字
\< 关键字
关键字 \>
\< 关键字 \>

在这里插入图片描述
(4)grep 中的正则表达式

^westos打印以westos开头的行
westos$打印以westos结尾的行
'w....s'打印w和s中间包括四个字符的行
'w.....'打印w开头,后面四个字符的行
'.....s'打印s结尾,前面四个字符的行

在这里插入图片描述
在这里插入图片描述
(5)grep 中字符的匹配次数设定

*字符出现 [0- 任意次 ]
\?字符出现 [0-1 次 ]
\+字符出现 [1- 任意次 ]
\{n\}字符出现 [n 次 ]
|{m,n\} 字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\}字符出现 [0-n 次 ]
\{m,\}字符出现 [ 至少 m 次 ]
\(xy\)\{n\}xy 关键字出现 [n 次 ]
.*关键字之间匹配任意字符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.sed命令

(1)基本描述

sed称为交互式编辑器,是一种在线编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区内,称为“模式空间”,接着用sed编辑命令去处理缓冲区内的内容,处理完成后,把缓冲区的内容送到屏幕,接着处理下一行,重复操作

原来的内容是在磁盘当中放着,现在用sed命令处理的时候将内容调入内存的一个地方处理,这个处理空间也叫模式空间

(2)调用 sed 命令有两种形式

sed     [options]       'command' file(s)
sed     [options]   -f   scriptfile file(s)

(3)命令选项

-e script 处理多条语句
-f file 在处理输入时 ,将file指定命令添加到运行的命令中
-n 不要为i每一命令进行输出,等待print命令来输出
echo "this is test" | sed 's/test/testing /'
输出结果: this is testing
cat data1
the aaa is one
the aaa is one
the aaa is one
the aaa is one
the aaa is one
sed 's/one/two/' data1
输出结果:
the aaa is two
the aaa is two
the aaa is two
the aaa is two
the aaa is two
cat data1
the aaa is one
the aaa is one
the aaa is one
the aaa is one
the aaa is one
sed -e  's/one/two/ ;s/aaa/bbb/'data1
输出结果:
the bbb is two
the bbb is two
the bbb is two
the bbb is two
the bbbis two
cat data1
the aaa is one
the aaa is one
the aaa is one
the aaa is one
the aaa is one
vim script
cat script
s/aaa/bbb/
s/one/three
sed -f script data1
输出结果:
the bbb is three
the bbb is three
the bbb is three
the bbb is three
the bbbis three

(4)sed 对字符的处理

p-----------显示
d-----------删除
a-----------添加
c-----------替换
w-----------写入
i-----------插入

(5)p 模式操作(按照要求显示行)

sed -n '/\:/p' fstab
sed -n '/UUID$/p' fstab
sed -n '/^UUID/p' fstab
sed -n '2,6p' fstab
sed -n '2,6!p' fstab

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(6)d 模式操作(按照要求删除行)

sed  '/^UUID/d' /etc/fstab
sed  '/^#/d' /etc/fstab
sed  '/^$/d'/etc/fstab
sed   '1,4d'/etc/fstab
sed  –n '/^UUID/!d' /etc/fstab

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(7)a 模式操作(按照要求添加)

sed '/^UUID/a \hello sed /etc/fstab
sed '/^UUID/a \hello sed\nwestos /etc/fstab'

在这里插入图片描述
在这里插入图片描述
(8)i 模式操作(按照要求插入行)

sed '/^UUID/i\hello sed\nwestos /etc/fstab'

在这里插入图片描述
(9)c 模式操作(按照要求改变行)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(10)w 模式操作(按照要求写入行)

sed  '/^UUID/w /tmp/fstab.txt' /etc/fstab
sed  -n'/^UUID/w /tmp/fstab.txt' /etc/fstab
sed  '/^UUID/='/etc/fstab
sed  '6r /etc/issue' /etc/fstab

在这里插入图片描述
在这里插入图片描述
(11)sed 的其他用法

sed  -n  '/^UUID/=' fstab
sed  -n -e ‘/^UUID/p'    -e    '/^ UUID/=' fstab
sed   -e 's/brown/green/; s/dog/cat/' data
sed  -f rulesfile file
sed  's/^\//#/'/etc/fstab
sed  's@^/@#@g'/etc/fstab
sed  's/\//#/'/etc/fstab
sed  's/\//#/g/'/etc/fstab
sed  'G' data
sed  '$!G' data
sed  '=' data | sed 'N; s/\n/ /'
sed -n '$p' data

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.awk 命令

(1)基本描述

awk适合文本处理和报表的生成
awk的程序由一个主输入循环维持民主输入循环反复执行,直到条件被触发,主循环无须由程序员去写
在命令格式上分别体现如下 :
BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
{}:逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令
END{}:处理完最后一行文本之后执行 , 一般用来输出处理

awk编程模型
在这里插入图片描述
(2)awk模式匹配

任何awk语句都是由模式和动作组成,模式是由一组用于测试输入行是否需要执行动作的规则,动作是包含语句,函数和表达式的执行过程
简言之:模式决定动作何时触发和触发事件动作执行对输入行的处理。

awk定义了一组关系运算符用于awk的模式匹配

运算符 意义
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式

例子1:

vim input





awk '/^$/{print "this is blank line"}' input
输出结果:
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line

例子2:

vim scr.awk
/^$/{print "this is blank line"}
awk -f scr.awk input
输出结果:
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line

例3:

vim scr.awk
#!/usr/bin/awk -f
/^$/{print "this is a blank line"}
./scr.awk input
输出结果:
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
this is blank line
awk -F(指定分隔符) : '{print $1}' passwd
打印passwd文件的以:为分隔符的第一列字符
awk -F :'{print $1}' passwd

在这里插入图片描述
在这里插入图片描述

awk -F :  'BEGIN{print "linux"}{print $2} ' passwd

在这里插入图片描述

##在第二行上添加 :1
awk  -F :'BEGIN{n=1}{print $2 ,n }' passwd

在这里插入图片描述

##打印第二列,并编号
awk -F:'BEGIN{n=1}{print $2,n++}' passwd

在这里插入图片描述

#在第二列中前进行编号
awk -F :'{BEGIN {n=1}}{print n++, $2}' passwd

在这里插入图片描述

awk -F :'BEGIN {n=1}{print n++,$2} END{print "over"}' passwd

在这里插入图片描述

##在结尾上输出行数
awk -F :‘BEGIN{n=1}{print n++,$1}END{print NR}’ passwd

在这里插入图片描述

#输出列数
awk -F :‘BEGIN{n=1}{print n++,$1}END{print NR}’ passwd

在这里插入图片描述

awk -F : '/bash/print{$1}'  ##输出包含bash的行的第一个字符

在这里插入图片描述

awk -F : 'NR>=4&&NR<=6{print}' #输出passwd456行

在这里插入图片描述

#输出文件名
awk -F:‘{print FILENAME}’ passwd
输出结果:
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
awk -F:‘{print $0}’ passwd ##输出所有行

在这里插入图片描述

awk '/^[a-d]/{print}' /etc/passwd  输出以a到d开头的行

在这里插入图片描述

awk '/^[^a-d]/{print}' /etc/passwd  输出不是以a到d开头的所有的行
****************注:[^]中的^为非的意思*******************
awk '/^[^a-d]/{print }' /etc/passwd

在这里插入图片描述

#以s开头或以bash结尾所有的行
awk '/s|bash$ {print }' /etc/passwd

在这里插入图片描述

awk '/^r/&&/bash$/{print}' /etc/passwd
#以r开头并且bash结尾的所有行

在这里插入图片描述

awk '/^r/||/bash$/{print}' /etc/passwd
#以r开头或bash结尾的行

在这里插入图片描述

#匹配第六行以bin的结尾的行
awk -F : '$6~/bin$/{print}' /etc/passwd 

在这里插入图片描述
#NF:为记录的域数量数
#NR:显示当前的记录数,该值根据读入输入文件的进度而变化,读取第一条记录时,NR=1,
#$0打印记录的所有域
#FILENAME:保存当前输入的文件名

发布了111 篇原创文章 · 获赞 0 · 访问量 2539

猜你喜欢

转载自blog.csdn.net/qq_42024433/article/details/104344582