shell之文本处理三剑客grep、sed、awk


1.grep

1. grep作用

  • Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
  • grep家族包括grep、egrep和fgrep。
    • egrep和fgrep的命令只跟grep有很小不同。
    • egrep是grep的扩展,支持更多的re元字符
    • fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。
    • linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能

2.格式及主要参数

grep 匹配条件 处理文件 (grep --help可查看)

-c只输出匹配行的计数。
-i不区分大小写。
-h查询多文件时不显示文件名。
-l查询多文件时只输出包含匹配字符的文件名。
-n显示匹配行及行号。
-s不显示不存在或无匹配文本的错误信息。
-v显示不包含匹配文本的所有行。反向过滤
grep -数字##显示过滤行以及上面几行和下面几行
grep -A##显示过滤行以及下面几行
grep -B##显示过滤行以及上面几行
–color=auto可以将找到的关键词部分加上颜色的显示。

pattern正则表达式主要参数:

\转义符,忽略正则表达式中特殊字符的原有含义。
^指匹配的字符串在行首
$指匹配的字符串在行尾
\ <匹配字符之前不能有字符
\ >匹配字符之后不能有字符
[ ]单个字符,如[A]即A符合要求 。
[ - ]范围,如[A-Z],即A、B、C一直到Z都符合要求 。
.所有的单个字符。
*所有字符,长度可以为0。

例子:

grep root passwd		#过滤root关键字
grep ^root passwd		##以root开头
grep root$ passwd		##以root结尾
grep -i root passwd 		##后略大小写
grep -E "\<root" passwd		##root字符之前不能有字符
grep -E "root\>" passwd		##root字符之后不能有字符
grep -E "\<root\>" passwd       ##root字符前后都不能有字符
grep root  -数字			##显示过滤行以及上面几行和下面几行
grep root -n 			##显示过滤root行以及上面和下面n行
grep root  -An				##显示过滤行以及下面n行
grep root  -Bn				##显示过滤行以及上面n行
grep root  -v				##反向过滤
^westos		    以westos开头
westos$			以westos结尾
w....s				w开头s结尾中间4个任意字符
.....s				s结尾前面5个任意字符
*				字符出现任意次
?				0到1次
+				1次到任意次
{n}			n次
{m,n}		m到n次
{0,n}		0-n次
{,n}			0-n次
{m,}			最少m次
(lee){2}	lee字符串出现2次

2.sed

命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件

选项

-e直接在命令行模式上进行sed动作编辑,此为默认选项;
-f将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i直接修改文件内容;
-n只打印模式匹配的行;
-r支持扩展表达式;
-h或–help显示帮助;
-V或–version显示版本信息。

参数

文件:指定待处理的文本文件列表。

sed常用命令

p打印模板块的行。 P(大写) 打印模板块的第一行;
a\在当前行下面插入文本;
i\在当前行上面插入文本;
c\把选定的行替换为新的文本;
d删除,删除选择的行;
D删除模板块的第一行;
-s替换指定字符;
=打印当前行号;
h拷贝模板块的内容到内存中的缓冲区;
H追加模板块的内容到内存中的缓冲区;
g获得内存缓冲区的内容,并替代当前模板块中的文本;
G获得内存缓冲区的内容,并追加到当前模板块文本的后面;
l列表不能打印字符的清单;
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
q退出Sed;
blable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
rfile 从file中读行;
tlabel if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
Tlabel 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
w file写并追加模板块到file末尾;
W file写并追加模板块的第一行到file末尾;
!表示后面的命令对所有没有被选定的行发生作用;
#把注释扩展到下一个换行符以前;

例如:对字符的处理

#p #显示

#sed -n  5p westos		#显示第五行
#sed -n  3,5p westos		#显示3到5行
#sed -ne  '3p;5p' westos		#显示3和5行
#sed -ne 1,5p westos		#1-5行
#sed -ne '5,$p'	westos		#5到最后以行
#sed -n '/^#/p' fstab		#显示以#开头的行	

#d #删除

sed '/^$/d' file 删除空白行
#sed 5d	westos			#删除第五行
#sed '/^#/d'	fstab		#把#开头的行删除
#sed '/^UUID/!d' fstab		#除了UUID以外的行都删除
#sed -e '5,$d' westos		#删除5到最后以行

#a #添加

#sed -e '$a hello world' fstab#添加到最后一行的下面
sed -e  '1ahello'  -e '5ahello' passwd#添加到第一行和五行的下面
sed '1,5ahello' passwd #添加到password文件的第一至五行的下面
sed '/sync/ahello' passwd #添加到sync关键字的下面一行
#sed -e '/^#/a hello world' fstab##添加到以#开头的下面一行
#sed -e '$a hello\nworld' fstab

#c #替换

#sed -e '/^#/c hello world' fstab#替换以#开头的行
#sed '5chello world' westos#替换第5行

#w #把符合的行写到指定文件中

#sed '/^UUID/w westofile' westos	#把westos中UUID开头的行写入westosfile中

#i #插入

#sed '5ihello westos' westos	

#r #整合文件

#sed '5r haha' westos#把haha文件整合到westos文件的第五行后面

3.awk

  • awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

  • awk处理过程: 依次对每一行进行处理,然后输出

  • awk命令形式:awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file

[-F/-f/-v]大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
- ’ ’引用代码块
- BEGIN初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
- //匹配代码块,可以是字符串或正则表达式
- {}命令代码块,包含一条或多条命令
- ;多条命令使用分号分隔
- END结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

awk -F 分隔符 BEGIN{}{}END{} FILENAME

NR行数
NF列数
FILENAME文件名称本身
westoswestos变量值
“westos”westos字符串,要用引号引起来

/bash$/ #条件
/条件1 条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/#条件1并且条件2

常用

$0所有的列
`$1第一列
FNR与NR类似,不过多文件记录不递增,每个文件都从1开始
\t制表符
\n换行符
FSBEGIN时定义分隔符
RS输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~匹配,与==相比不是精确比较
!~不匹配,不精确比较
==等于,必须全部相等,精确比较
!=不等于,精确比较
&&逻辑与
+匹配时表示1个或1个以上
/[0-9][0-9]+/两个或两个以上数字
/[0-9][0-9]*/一个或一个以上数字
FILENAME文件名
OFS输出字段分隔符, 默认也是空格,可以改为制表符等
ORS输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F’[:#/]’定义三个分隔符
[root@node2 mnt]# awk '{print NR}' passwd  #显示行号
[root@node2 mnt]# awk '{print $0}' passwd #显示内容
[root@node2 mnt]# awk '{print NR $0}' passwd #显示行号和内容
[root@node2 mnt]# awk '{print NR" " $0}' passwd #$是所有行,NR是行号,空格要用引号引起来,带引号就是字符串,不引号就是变量
[root@node2 mnt]# awk '{print NF}' passwd #显示列数
[root@node2 mnt]# awk -F: '{print NF}' passwd #指定分割副为冒号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值