Shell脚本三剑客(grep、sed、awk)

目录

正则表达式定义

Linux三剑客(grep、sed、awk)

一、grep和元字符

1、grep

元字符

二、sed

1、工作流程

2、命令格式

3、常用选项

使用地址

删除行

三、awk

1、工作原理:

2、命令格式

3、常见的内置变量


正则表达式定义

正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

正则表达式是:由普通字符与元字符组成的文字模式

普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符

正则表达式一般用于脚本编程与文本编辑器中

Linux三剑客(grep、sed、awk)

支持的正则表达式

脚本的内容一般都会比较多,但是我们不会每次都通过vim命令进入脚本来对其进行查询或修改,因此我们可以通过命令直接对脚本的内容来进行查询、过滤与修改。

支持正则的shell命令正则类型
grep默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符)
egrep 或grep -E使用扩展的正则表达式(ERE)
sed默认使用基本正则表达式(BRE)
awk使用扩展正则表达式(ERE)

一、grep和元字符

1、grep

grep [选项]  [查找条件(正则)]  [目标文件]

常用选项功能
-n列出所匹配的文本行,并显示行号
-i匹配时忽略字符大小写
-v反向匹配,匹配的字符串与搜索的不相符
-w精确匹配。匹配整个单词、 一个字符
-o只显示匹配的部分
-c显示匹配内容的行数
-E开启扩展的正则表达式
--color=auto可以将找到的关键词部分加上颜色的显示!

元字符

^    匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配"^"字符本身,需要转移"\^"
$   匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则"$"也匹配'\n'或'r'
.   “.”代表除"\n\s"之外的任何单个字符
\   反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的 特殊意义
   匹配前面的子表达式零次或多次。要匹配"*"字符,要进行\转移
[ ]   字符集合,匹配所包含的任意的一个字符
[^]   复制字符集。匹配未包含在[ ]内的任意一个字符
[n1-n2]字符范围。匹配指定范围内的任意一个字符。例如[a-z]可以匹配到a到z范围内的任意一个小写字母字符
{n}   n是一个非负整数,匹配确定的n次,例如“o{2}”不能匹配“Bob”中的“o”,但是能匹配到“food”中的“oo”
{n,}    n是一个非负整数,至少(最少)匹配n次。例如,“o{2,}”不能匹配"Bob"中的“o”,但是能匹配“fooooood”中的所有o。“o{1.}”等于“o+”
{n,m}    n和m均为非负整数,其中n<=m,最少匹配n次,最多匹配m次

 -v取反

 查找并显示行号-n

二、sed

1、工作流程

  • 读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
  • 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完

2、命令格式

sed -e '编辑指令' 文件1 文件2...
sed -n -e '编辑指令' 文件1 文件2...
sed -i -e '编辑指令' 文件1 文件2...

###编辑命令格式
	地址:可数字、正则表达式、$,没有地址代表是所有行
	操作:可以使a、c、d、p、r、w、s、y等
	参数:一般有g,代表只要符合条件的全部进行处理

3、常用选项

##参数说明:
	-e:指定要执行的命令,只有一个编辑命令时可以省略
	-n:只输出处理后的行,读入时不显示
	-i:直接编辑文件,而不输出结果
	-f:用指定的脚本文件来处理输入的文本文件
	-s:将多个文件视为独立文件,而不是单个连续的长文件流
	
##动作说明
	a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
	c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
	d :删除,因为是删除啊,所以 d 后面通常不接任何东西;
	i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
	p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
	s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
例如 1,20s/old/new/g

使用地址

sed编辑器有两种寻址方式

1.以数字形式表示行区间

2.用文本模式来过滤出行

[root@localhost ~]# sed -n '1p' one.sh #打印第一行内容
one
[root@localhost ~]# sed -n '$p' one.sh #打印最后一行的内容
five
[root@localhost ~]# sed -n '1,3p' one.sh #打印1~3行的内容
one
two
three
[root@localhost ~]# sed -n '3,$p' one.sh #打印第3行到最后一行的内容
three
four
five
[root@localhost ~]# sed -n '1,+3p' one.sh #打印1之后的连续3行,即1~4行
one
two
three
four
[root@localhost ~]# sed '5q' one.sh #打印前5行信息后退出,q表示退出
one
two
three
four
five
[root@localhost ~]# 
[root@localhost ~]# sed -n 'p;n' one.sh #打印奇数行
one
three
five
[root@localhost ~]# sed -n 'n;p' one.sh #打印偶数行
two
four
[root@localhost ~]# sed -n '2,${n;p}' one.sh 
three
five
#从第二行开读取到最后一行,但是碰到n就是直接移动到下一行遇到p打印,开始读取形成了循环,以此类推打印奇数行
[root@localhost ~]# sed -n 'p;n;p' one.sh 
one
two
three
four
five
[root@localhost ~]# sed -n 'n;p;n' one.sh 
two
five
#简单来说n是不打印p是打印,循环就是npnnp,所以2和5就打印出来了

删除行

sed 'd' 文件名 #全删
sed '3d' 文件名 #删除第3行
sed '1d;$d' 文件名 #删除第一行与最后一行
去除空行:
grep -v "^$" 文件名
cat 文件名 | tr -s "\n"
sed '/^$/d' 文件名 #加i执行

sed '/nologin$/!d' /etc/passwd #删除/etc/passwd中除了nologin结尾以外所有的行
sed '/2/,/3/d' 文件名 #从第一个位置打开行删除功能,到第二个位置关闭行删除功能

自动打印

 关闭自动打印,只显示自己想要的

 

 

 

 

 

 

三、awk

1、工作原理:

逐行读取文本,默是认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

  • awk是是一个强大的编辑工具
  • 是无交互情况下实现复杂的文本操作

2、命令格式

awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …

3、常见的内置变量

FS:指定每行文本的字段分隔符,缺省为空格或制表位(tab)

OFS:输入字段的分割符(默认是空格)

NF:当前处理的行的字段个数

NR:当前处理的行的行号(序数)

FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)

ORS:输出行的分割符,默认为换行符

RS:行分隔符,根据RS的定义把资料切割成许多条记录

$0:当前处理的行的整行内容

$n:当前处理行的第n个字段(第n列)

输出UID号大于等于1000的行号

#打印出所有内容并且输出行号
[root@yzy ~]# awk -F: '{print NR,$0}' one.sh 
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
10 ten
11 eleven
12 twelve

 查看当前内存使用百分比

打印出/etc/passwd中所有带有root的行数并且输出行号,输出每行内容和行号,每处理完一条记录,NR值加1 

 查看设备存储情况并去除%

 

 

 查看网卡的IP地址

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值