关于文本三剑客(grep、sed、awk)的运用

1、简介

​        awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯地查找或匹配文本;sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

2、grep

2.1、grep介绍(egrep)

       ​ Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并将匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

​        grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看做是文件名。搜索的结果被送到标准输出,不影响原文件内容

      ​ grep可用于shell脚本,因为grep通过一个返回状态值来说明搜索的状态,如果模板搜索成功,则返回0;如果搜索不成功,则返回1;如果搜索的文件不存在,则返回2。可利用这些返回值进行一些自动化的文本处理工作。

​ egrep等同于grep -E:扩展的正则表达式(除了\<,\>,\b之外,使用其他正则都可以去掉\)

2.2、使用grep

2.2.1、命令格式

 
grep [option] pattern file

2.2.2、命令功能

用于过滤/搜索特定字符。可配合正则表达式来进行使用,使用上十分灵活。

2.2.3、命令参数

常用参数已加粗。

  • -A<显示行数>:除了显示符合样式的那一行之外,并显示该行之后的内容。
  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -c:统计匹配的行数
  • -e:实现多个选项间的逻辑or关系
  • -E:扩展的正则表达式
  • -f file:从file获取pattern匹配
  • -F:相当于fgrep
  • -i --ignore-case:忽略字符大小写的差别
  • -n:显示匹配的行号
  • -o:仅显示匹配到的字符串
  • -q:静默模式,不输出任何信息
  • -s:不显示错误信息
  • -v:显示不被pattern匹配到的行,相当于[^]反向匹配
  • -w:匹配整个单词

         

3、正则表达式

3.1 分类

POSIX规范将正则表达式分为了两种

  • 基本正则表达式(BRE,basic regular expression)
  • 高级功能:扩展正则表达式(ERE,extended regular expression)

BRE和ERE的区别仅仅是元字符的不同

  • BRE只承认的元字符有^$.[]*,其他字符识别为普通字符;
  • ERE则添加了(){}?+|等
  • 只用在用反斜杠“\”进行转义的情况下,字符串(){}才会在BRE被当做元字符处理,而在BRE中,任何元字符前面加上反斜杠反而会使其被当做普通字符来处理。

3.2、基本正则表达式

3.2.1、格式

字符描述
^^word:搜索以word开头的内容
$word$:搜索以word结尾的内容
^$表示空行,不是空格
.代表且只能代表任意一个字符(不匹配空行)
\转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
*匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*任意长度的任意字符,不包括0次
^.*以任意多个字符串开头,.*尽可能多,有多少算多少,贪婪性
[^abc]匹配不包含^后的任意字符a或b或c,是对[abc]的取反
a\重复前面a字符至少n次,至多m次(如使用egrep或sed -r可去掉斜线)

3.2.2、演练


 


 


 

3.3、扩展正则表达式

3.3.1、格式

特殊字符描述
+重复前一个字符一次或多次
重复前一个字符0次或1次(.是有且只有1个)
|表示或,查找多个字符串
()分组过滤被括起来的东西表示一个整体(一个字符)

3.3.2、演练

3.4、基本正则和扩展正则区别

所谓基础正则,实际上就是得需要转义字符配合表达的正则,而扩展正则就是让命令扩展它的权限让其直接就认识正则表达符号

BREERE
??
\++
\{}
\(\)()
\

3.5、补充说明

3.5.1、预定义

正则表达式描述示例
[:alnum:][a-zA-Z0-9]匹配任意一个字母或数字字符[[:alnum:]]+
[:alpha:]匹配任意一个字母字符(包括大小写字母)[[:alpha:]]
[:blank:]空格与制表符(横向纵向)[[:blank:]]*
[:digit:]匹配任意一个数字字符[[:digit:]]?
[:lower:]匹配小写字母[[:lower:]]
[:upper:]匹配大写字母([[:upper:]]+)?
[:punct:]匹配标点符号[[:punct:]]
[:space:]匹配一个包括换行符,回车等在内的所有空白符[[:space:]]+
[:graph:]匹配任何一个可以看得见的且可以打印的字符[[:graph:]]
[:xdigit:]任何一个十六进制数[[:xdigit:]]+
[:cntrl:]任何一个控制字符(ASCII字符集中的前32个字符)[[:cntrl:]]
[:print:]任何一个可以打印的字符[[:print:]]

3.5.2、元字符

元字符是一种Perl风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。

正则表达式描述示例
\b单词边界\bcool\b匹配cool,不匹配coolant
\B非单词边界cool\B匹配coolant不匹配cool
\d单个数字字符b\db匹配b2b,不匹配bcb
\D单个非数字字符b\Db匹配bcb不匹配b2b
\w单个单词字符(字母,数字与_)\w匹配1或a,不匹配&
\W单个非单词字符\W匹配&,不匹配1或a
\n换行符\n匹配一个新行
\s单个空白字符x\sx匹配xx,不匹配xx
\S单个非空白字符x\S\x匹配xkx,不匹配xx
\r回车\r匹配回车
\t横向制表符\t匹配一个横向制表符
\v垂直制表符\v匹配一个垂直制表符
\f换页符\f匹配一个换页符

4、sed

4.1、认识sed

​ sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下一行,执行下一个循环。如果没有使用诸如“D”的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出或-i。

​ 功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作。

4.2、使用sed

4.2.1、命令格式

 
sed [选项] [command] 文件名

4.2.2、常用选项

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • -e:多点编辑,对每行处理时,可以有多个script
  • -f:把script写到文档中,在执行sed时,-f指定文件路径;如果有多个script,换行写入
  • -r:支持扩展的正则表达式
  • -i:直接将处理的结果写入文件
  • -i.bak:在将处理的结果写入文件之前备份一份

4.2.3、地址定界

  • 不给地址:对全文进行处理
  • 单地址:
    • #: 指定的行
    • /pattern/:被此处模式所能够匹配到的每一行
  • 地址范围:
    • #,#
    • #,+#
    • /pat1/,/pat2/
    • #,/pat1/
  • ~:步进
    • sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)
    • sed -n '2~2p' 只打印偶数行

4.2.4、编辑命令

  • d:删除模式空间匹配的行,并立即启用下一轮循环
  • p:打印当前模式空间内容,追加到默认输出之后
  • a:在指定行后面追加文本,支持使用\n实现多行追加
  • i:在行前面插入文本,支持使用\n实现多行追加
  • c替换行为单行或多行文本,支持使用\n实现多行追加
  • w:保存模式匹配的行至指定文件
  • r:读取指定文件的文本至模式空间中匹配到的行后
  • =:为模式空间中的行打印行号
  • !:模式空间中匹配行取反处理
  • s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
    • 加g表示行内全局替换;
    • 在替换时,可以加一下命令,实现大小写转换
    • \l:把下个字符转换成小写。
    • \L:把replacement字母转换成小写,直到\U或\E出现。
    • \u:把下个字符转换成大写。
    • \U:把replacement字母转换成大写,直到\L或\E出现。
    • \E:停止以\L或\U开始的大小写转换

4.3、演练

4.3.1、常用选项options

 
[root@aliyun shell]# cat demo
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed -n "/aaa/p" demo #仅打印匹配的行,-n,不显示没匹配的行
aaa
[root@aliyun shell]# sed -e "s/a/A/" -e "s/b/B" demo
sed:-e 表达式 #2,字符 5:未终止的“s”命令
[root@aliyun shell]# sed -e "s/a/A/" -e "s/b/B/" demo #-e多点编辑
Aaa
Bbbb
AABBCCDD
[root@aliyun shell]# cat sedscript.sed
s/a/A/g
[root@aliyun shell]# sed -f sedscript.sed demo #-f 使用文件处理
AAA
bbbb
AABBCCDD
[root@aliyun shell]# sed -i.bak "s/a/A/g" demo #-i.bak直接对文本进行处理,同时将原文本备份为.bak文件
[root@aliyun shell]# cat demo
AAA
bbbb
AABBCCDD
[root@aliyun shell]# cat demo.bak
aaa
bbbb
AABBCCDD

4.3.2、地址界定

 
[root@aliyun shell]# cat demo
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed -n "p" demo #不指定行,打印全部内容
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed "2s/b/B/g" demo #替换第2行的b为B
aaa
BBBB
AABBCCDD
[root@aliyun shell]# sed -n "/aaa/p" demo
aaa
[root@aliyun shell]# sed -n "1,2p" demo #打印1-2行
aaa
bbbb
[root@aliyun shell]# sed -n "/aaa/,/DD/p" demo #打印aaa-DD行
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed -n "2,/DD/p" demo #打印2-DD行
bbbb
AABBCCDD
[root@aliyun shell]# sed "1~2s/[aA]/E/g" demo #将奇数行的a或A替换为E
EEE
bbbb
EEBBCCDD

4.3.3、编辑命令command

 
[root@aliyun shell]# cat demo
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed "2d" demo #删除第2行
aaa
AABBCCDD
[root@aliyun shell]# sed -n "2p" demo #打印第二行
bbbb
[root@aliyun shell]# sed "2a123" demo #将123添加到第二行后面
aaa
bbbb
123
AABBCCDD
[root@aliyun shell]# sed "1i123" demo #将123添加到第一行前面
123
aaa
bbbb
AABBCCDD
[root@aliyun shell]# sed "3c123\n456" demo #将123\n456替换第三行
aaa
bbbb
123
456
[root@aliyun shell]# sed -n "3w/home/shell/demo3" demo #将第三行写到/home/shell/demo3文件中
[root@aliyun shell]# cat demo3
AABBCCDD
[root@aliyun shell]# sed "1r/home/shell/demo3" demo #将/home/shell/demo3文件中内容读取到第一行后面
aaa
AABBCCDD
bbbb
AABBCCDD
[root@aliyun shell]# sed -n "=" demo #打印行号
1
2
3
[root@aliyun shell]# sed "s@[a-z]@\u&@g" demo #将所有小写字母转换为大写
AAA
BBBB
AABBCCDD
[root@aliyun shell]# sed -n '2!p' demo #除第二行内容外,全部打印
aaa
AABBCCDD

4.4、sed高级编辑命令

4.4.1、格式

  • h:将模式空间中的内容覆盖至保持空间中
  • H:将模式空间中的内容追加至保持空间中
  • g:从保持空间取出数据覆盖至模式空间
  • G:从保持空间取出数据追加至模式空间
  • x:将模式空间中的内容与保持空间中的内容进行互换
  • n:读取匹配到的行的下一行覆盖至模式空间
  • N:读取匹配到的行的下一行追加至模式空间
  • d:删除模式空间中的行
  • D:删除当前模式空间开端到\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

4.4.2、案例+示意图

 
#倒叙输出文件内容
[root@aliyun shell]# cat num.txt
1
2
3
[root@aliyun shell]# sed '1!G;h;$!d' num.txt
3
2
1

示意图:

4.4.3、总结

​ 保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理

4.4.4、演练

 
#显示偶数行
[root@aliyun shell]# seq 9 | sed -n "n;p"
2
4
6
8
#倒叙显示
[root@aliyun shell]# seq 9 | sed '1!G;h;$!d'
9
8
7
6
5
4
3
2
1
#显示奇数行
[root@aliyun shell]# seq 9 | sed "H;n;d"
1
3
5
7
9
#打印最后一行
[root@aliyun shell]# seq 9 | sed "N;D"
9
#每行之间加空行
[root@aliyun shell]# seq 9 | sed "G"
1
2
3
4
5
6
7
8
9
#将每行内容替换成空行
[root@aliyun shell]# seq 9 | sed "g"
#确保每一行下面都有一个空行
[root@aliyun shell]# seq 9 | sed '/^$/d;G'
1
2
3
4
5
6
7
8
9

5、awk

5.1、简介

​ awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自于标准输入、一个或多个文件、或其他命令的输出。它支持用户自定义函数和动态正则表达式等功能,是linux/unix下的一个强大的编程工具。它在命令行中使用,但更多是作为脚本使用。awk有很多内建的功能,比如数组、函数等。

5.2、使用awk

5.2.1、语法

 
[root@localhost ~]# awk [选项] '脚本命令' 文件名

5.2.2、常用命令选项

  • -F fs:指定以fs作为输入行的分隔符,awk命令默认分隔符为空格或制表符
  • -v var=value:在执行处理过程之前,设置一个变量var,并给其设置初始值
  • -f scriptfile:从脚本文件中读取awk命令,以取代直接在命令行中输入指令

awk的强大之处

​ awk的强大之处在于脚本命令,它由两部分组成,分别为匹配规则和执行命令,如下所示:

 
'匹配规则{执行命令}'

​ 这里的匹配规则,用来指定脚本命令中可以作用到文本内容中的具体行,可以使用字符串(比如/demo/,表示查看含有demo字符串的行)或正则表达式指定。

​ 注:整个脚本命令是用单引号括起来,而其中的执行命令部分需要用大括号括起来

5.3、awk变量

5.3.1、内置变量

变量描述
FS输入字符分隔符,默认为空白字符
OFS输出字段分隔符,默认为空白字符
RS输入记录分隔符,指定输入时的换行符,原换行符仍有效
ORS输出记录分隔符,输出时用指定符号代替换行符
NF字符数量,共有多少个字段,$NF引用最后一列,$(NF-1)引用倒数第二列
NR行号,后可跟多个文件,第二个文件行号则继续从第一个文件最后行号开始
FNR各文件分别计数,行号;后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
FILENAME当前文件名
ARGC命令行参数的个数
ARGV数组,保存的是命令行所给定的各参数,查看参数

示例:

 
[root@aliyun shell]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:you
[root@aliyun shell]# awk -v FS=":" '{print $1,$2}' awkdemo #FS指定输入分隔符
hello world
linux redhat
along love
[root@aliyun shell]# awk -v FS=":" -v OFS="---" '{print $1,$2}' awkdemo #OFS指定输出分隔符
hello---world
linux---redhat
along---love
[root@aliyun shell]# awk -v RS=":" '{print $1,$2}' awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
[root@aliyun shell]# awk -v FS=":" -v ORS="---" '{print $1,$2}' awkdemo
hello world---linux redhat---along love---
[root@aliyun shell]# awk -F: '{print NF}' awkdemo
2
4
3
[root@aliyun shell]# awk -F: '{print $(NF-1)}' awkdemo
hello
lalala
love
[root@aliyun shell]# awk END'{print NR}' awkdemo
3

5.3.2、自定义变量

1、先定义变量,后执行动作

 
[root@aliyun shell]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:you
[root@aliyun shell]# awk -v name="along" -F: '{print name":"$0}' awkdemo
along:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you

2、先执行动作,后定义变量

 
[root@aliyun shell]# awk -F: '{print name":"$0;name="along"}' awkdemo
:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you

3、调用脚本进行定义

 
[root@aliyun shell]# cat awk.txt
{name="along";print name,$1}
[root@aliyun shell]# awk -F: -f awk.txt awkdemo
along hello
along linux
along along
[root@aliyun shell]#

6、grep、sed、awk对比

  • grep主要用于搜索某些字符串;sed和awk用于处理文本。
  • grep基本是以行为单位处理文本的
  • sed是一个非交互性文本流编辑器,它编辑文件或标准输入导出的文本拷贝。sed编辑器按照一次处理一行的方式来处理文件(或输入)并将输出送到屏幕上。sed把当前正在处理的行保存在一个临时缓存里,这个缓存叫做模式空间;一旦sed完成了对模式空间里的行的处理,就把模式空间的行送到屏幕上(除非该命令要删除该行或禁止打印);处理完该行之后,从模式空间中删除它,然后把下一行读入模式空间,进行处理并显示。当输入文件的最后一行处理完后,sed终止。通过将每一行存到一个临时缓存里并编辑该行,初始文件不会被修改或被破坏。
  • awk和sed一样,也是逐行读取,是以字段为单位来处理文本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值