Linux 文本三剑客三大利器 grep、sed、awk

简介

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

1、grep

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

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

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

egrep = grep -E:扩展的正则表达式 (除了**< , > , \b** 使用其他正则都可以去掉\)

grep使用

用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

 命令格式:grep [option] pattern file

命令参数详解

-  -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-  -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
-  -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。

在这里插入图片描述

-  -c:统计匹配的行数

在这里插入图片描述

-  -e :实现多个选项间的逻辑or 关系

在这里插入图片描述

-  -f FILE:从FILE获取PATTERN匹配

在这里插入图片描述

-  -i --ignore-case #忽略字符大小写的差别。

在这里插入图片描述

-  -n:显示匹配的行号

在这里插入图片描述

-o:仅显示匹配到的字符串

在这里插入图片描述

-q: 静默模式,不输出任何信息
就是什么也不输出到屏幕上

在这里插入图片描述

-v:显示不被pattern 匹配到的行,相当于[^] 反向匹配

在这里插入图片描述

-w :匹配 整个单词
意味着必须准确写出你需要匹配的单词否则皮配不到

在这里插入图片描述

正则表达式 :
匹配字符
-  . 匹配任意单个字符,不能匹配空行
-  [] 匹配指定范围内的任意单个字符
-  [^] 取反
-  [:alnum:] 或 [0-9a-zA-Z]
-  [:alpha:] 或 [a-zA-Z]
-  [:upper:] 或 [A-Z]
-  [:lower:] 或 [a-z]
-  [:blank:] 空白字符(空格和制表符)
-  [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
-  [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
-  [:digit:] 十进制数字 或[0-9]
-  [:xdigit:]十六进制数字
-  [:graph:] 可打印的非空白字符
-  [:print:] 可打印字符
-  [:punct:] 标点符号
匹配次数
-  * 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
-  .\ 任意前面长度的任意字符,不包括0次
-  \?  匹配其前面的字符 0 或 1次
-  \+匹配其前面的字符至少1次
-  \{n\}  匹配前面的字符n次
-  \{m,n\}  匹配前面的字符至少m 次,至多n次
-  \{,n\}  匹配前面的字符至多n次
-  \{n,\}  匹配前面的字符至少n次
位置锚定:定位出现的位置
-  ^  行首锚定,用于模式的最左侧
-  $  行尾锚定,用于模式的最右侧
-  ^PATTERN$,用于模式匹配整行
-  ^$ 空行
-  ^[[:space:]].*$  空白行
-  \< 或 \b  词首锚定,用于单词模式的左侧
-  \> 或 \b  词尾锚定;用于单词模式的右侧
-  \<PATTERN\>

演示:
在这里插入图片描述

sed

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

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

命令格式:sed  [options]     [地址定界]/command   file(s)

命令参数详解

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

演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编辑命令command
- 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开始的大小写转换
演示:
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2d" demo  #删除第2行
aaa
AABBCCDD
[root@along ~]# sed -n "2p" demo  #打印第2行
bbbb
[root@along ~]# sed "2a123" demo  #在第2行后加123
aaa
bbbb
123
AABBCCDD
[root@along ~]# sed "1i123" demo  #在第1行前加123
123
aaa
bbbb
AABBCCDD
[root@along ~]# sed "3c123\n456" demo  #替换第3行内容
aaa
bbbb
123
456
[root@along ~]# sed -n "3w/root/demo3" demo  #保存第3行的内容到demo3文件中
[root@along ~]# cat demo3
AABBCCDD
[root@along ~]# sed "1r/root/demo3" demo  #读取demo3的内容到第1行后
aaa
AABBCCDD
bbbb
AABBCCDD
[root@along ~]# sed -n "=" demo  #=打印行号
1
2
3
[root@along ~]# sed -n '2!p' demo  #打印除了第2行的内容
aaa
AABBCCDD
[root@along ~]# sed 's@[a-z]@\u&@g' demo  #将全文的小写字母替换为大写字母
AAA
BBBB
AABBCCDD

3.4 sed高级编辑命令

(1)格式

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

(2)一个案例+示意图演示

① 案例:倒序输出文本内容

[root@along ~]# cat num.txt
One
Two
Three
[root@along ~]# sed '1!G;h;$!d' num.txt
Three
Two
One

1!G 第一行不执行G命令,从第二行开始执行

$!d 最后一行不删除

③ 总结模式空间与保持空间关系:
保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理
(3)演示

① 显示偶数行

[root@along ~]# seq 9 |sed -n 'n;p'
2
4
6
8

② 倒序显示

[root@along ~]# seq 9 |sed  '1!G;h;$!d'
9
8
7
6
5
4
3
2
1

③ 显示奇数行

[root@along ~]# seq 9 |sed 'H;n;d'
1
3
5
7
9

④ 显示最后一行

[root@along ~]# seq 9| sed 'N;D'
9

⑤ 每行之间加空行

[root@along ~]# seq 9 |sed 'G'
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
---

⑥ 把每行内容替换成空行

[root@along ~]# seq 9 |sed "g"
 
 
 
 
 
 
 
 
 
---

⑦ 确保每一行下面都有一个空行

[root@along ~]# seq 9 |sed '/^$/d;G'
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9

awk

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

awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。

命令语法演示

常用命令选项:

常用命令选项:
-  -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-  -v var=value:赋值一个用户定义变量,将外部变量传递给awk
-  -f scripfile:从脚本文件中读取awk命令
内置变量:
-  FS :输入字段分隔符,默认为空白字符
-  OFS :输出字段分隔符,默认为空白字符
-  RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
-  ORS :输出记录分隔符,输出时用指定符号代替换行符
-  NF :字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列
-  NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
-  FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行从1开始
-  FILENAME :当前文件名
-  ARGC :命令行参数的个数
-  ARGV :数组,保存的是命令行所给定的各参数,查看参数
[root@along ~]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@along ~]# awk -v FS=':' '{print $1,$2}' awkdemo  #FS指定输入分隔符
hello world
linux redhat
along love
[root@along ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo  #OFS指定输出分隔符
hello---world
linux---redhat
along---love
[root@along ~]# awk -v RS=':' '{print $1,$2}' awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
[root@along ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo
hello world---linux redhat---along love---
[root@along ~]# awk -F: '{print NF}' awkdemo
2
4
3
[root@along ~]# awk -F: '{print $(NF-1)}' awkdemo  #显示倒数第2列
hello
lalala
love
[root@along ~]# awk '{print NR}' awkdemo awkdemo1
1
2
3
4
5
[root@along ~]# awk END'{print NR}' awkdemo awkdemo1
5
[root@along ~]# awk '{print FNR}' awkdemo awkdemo1
1
2
3
1
2
[root@along ~]# awk '{print FILENAME}' awkdemo
awkdemo
awkdemo
awkdemo
[root@along ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1
3
[root@along ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1
awk
[root@along ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1
awkdemo
[root@along ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1
awkdemo1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值