Linux三剑客(grep、sed、awk)

Linux运维的同学一定得熟练的三个linux命令,凡是遇到运维面试问linux命令的,大概率会问到。

文本处理工具,均支持正则表达式引擎

  • grep:文本过滤工具
  • sed:stream editor,流编辑器;文本编辑器
  • awk:Linux的文本报告生成器(格式化文本),Linux上是gawk

正则表达式的分类

linux三剑客主要分两类

  • 基本正则表达式(BRE、basic regular expression)
BRE ^ $.[]*
  • 扩展正则表达式(ERE、extended regular expression)
ERE BRE (){}?+|等字符

基本正则表达式BRE集合

  • 匹配字符
  • 匹配次数
  • 位置锚定
符号作用
^尖角号。用于模式的最左侧,如“^lucky”,匹配以lucky单词开头的行
$美元符,用于模式的最右侧,如”lucky$“,表示以lucky单词结尾的行
^$组合符,表示空行
.匹配任意一个且只有一个字符,不能匹配空行
\转义字符,让特殊含义的字符,现出原形,还原本意,列如\.代表小数点
*匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容
.*组合符,匹配任意长度的任意字符
^.*组合符,匹配任意多个字符开头的内容
.*$组合符,匹配以任意多个字符结尾的内容
【a,b,c】匹配【】集合内的任意一个字符,a或b或c,可以写【a-c】
【^abc】匹配除了^ 后面的任意字符,a或b或c,^表示对【abc】的取反
匹配完整的内容
<或>定位单词的左侧和右侧,如可以找出”The du ge“,却找不出”huadu“

扩展正则表达式ERE集合

扩展正则必须用grep -E才能生效

符号作用
+匹配前一个字符1次或多次,前面字符至少出现1次
【:/】+匹配括号内的" :"或者” / "字符1次或者多次
?匹配前一个字符0次或1次,前面字符可有可无
竖线表示或者,同时过滤多个字符串
()分组过滤,被括起来的内容表示一个整体
a{n,m}匹配前一个字符最少n次,最多m次
a{n,}匹配前一个字符最少n次
a{n}匹配前一个字符正好n次
a{,m}匹配前一个字符最多m次
Tip:
- grep命令需要使用参数-E即可支持正则表达式
- egrep不推荐使用,使用grep -E替代
- grep不加参数,得在特殊字符前面加”\“反斜杠,识别为正则

grep

全拼:Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定得模式(过滤条件)对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式的元字符文本字符所编写出的过滤条件

语法:
grep [options] [pattern] file
命令   参数     匹配模式   文件数据
               -i:ignorecase,忽略大小写
               -o:仅显示匹配到的字符本身
               -v:--invert-match,显示不能被模式匹配到的行
               -E:支持使用扩展的正则表达式元字符
               -q:--quiet,--silent 静默模式,即不输出任何信息

grep命令是linux系统中最重要的命令之一,功能是从文本文件管道数据流中筛选匹配的数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式

参数选项解释说明
-v排除匹配结果
-n显示匹配行与行号
-i不区分大小写
-c只统计匹配的行数
-E使用egrep命令
–color=auto为grep过滤结果添加颜色
-w只匹配过滤的单词
-o只输出匹配的内容

正则表达式grep实践

准备测试文件
在这里插入图片描述

^符号

1.输出所有以m开头的行

grep -i -n "^m" test.txt

在这里插入图片描述
2.输出所有以i开头的行

grep -i -n "^i" test.txt

在这里插入图片描述

$符号

1.输出所有以.结尾的行

grep -i -n "\.$" test.txt

在这里插入图片描述
注意添加转义字符,不加的话.$就是正则匹配所有内容
TIP

注意在Linux平台下,所有文件的结尾都有一个$符
可以用cat -A查看文件

在这里插入图片描述

^$

1.找出文件的空行,以及行号

grep -n "^$" test.txt

在这里插入图片描述

.符号

"."点表示任意一个字符,有且只有一个,不包含空行

grep -i -n "." test.txt

在这里插入图片描述
找出任意一个三位字符,包含on

grep -i -n ".on" test.txt

在这里插入图片描述

\转义字符

1.找出文中所有的点”.“

grep "\." test.txt

在这里插入图片描述

*符号

1.找出文中出现”i“的0次或多次

grep -i -n "i*" test.txt

在这里插入图片描述

.*组合符

.表示任意一个字符,*表示匹配前一个字符0次或多次,因此放在一起代表匹配所有内容,以及空格

grep ".*" test.txt

在这里插入图片描述

^.*o符号

^以某字符开头
.任意0或多个字符
.*代表匹配所有内容
o普通字符,一直到字母o结束
这种匹配相同字符到最后一个字符的特点,称之为贪婪匹配

grep "I.*o" test.txt

在这里插入图片描述

[abc]中括号

中括号表达式,【abc】表示匹配中括号中任意一个字符。a或b或c,常见形式如下:

  • [a-z]匹配所有小写字母
  • [A-Z]匹配所有大写字母
  • [a-zA-Z]匹配所有大小写字母
  • [0-9]匹配所有单个数字
  • [a-zA-Z0-9]匹配所有数字和字母
grep "[a-z]" test.txt

在这里插入图片描述

grep参数-o

使用”-o“选项,可以只显示被匹配到的关键字,而不是将整行的内容都输出

显示文件中有多少字符a

grep -o "a" test.txt |wc -l

在这里插入图片描述

[ ^abc]中括号取反

[ ^abc]或[ ^a-c]这样的命令,” ^“符号在中括号第一位表示排除,就是排除字母a或b或c
出现在中括号里的尖角号表示取反
1.找出除了小写字母外的字符

grep -n "[^a-z]" test.txt

在这里插入图片描述

拓展正则表达式实践

此处使用grep -E进行实践扩展正则,egrep官网已经弃用

+号

+号表示匹配前一个字符1次或多次,必须使用grep -E扩展正则

grep -E "l+" test.txt

在这里插入图片描述

?符

匹配前一个字符0次或1次
1.找出文件中包含ti或qq的行

grep -E "ti?f" test.txt

在这里插入图片描述

|符

竖线|在正则中是或者的意思
1.找出系统中的txt文件,且名字里包含p或者o的字符

find / -name "*.txt" -maxdepth 3 | grep -i "p" | grep -i "o"

()小括号

将一个或多个字符捆绑在一起,当作一个整体进行处理:

  • 小括号功能之一是分组过滤被括起来的内容,括号内的内容表示一个整体
  • 括号()内可以被后面的”\n“正则引用,n为数字,表示引用第几个括号
    - \1:表示从左侧起,第一个括号中的模式所匹配到的字符
    - \2:从左侧起,第二个括号中的模式所匹配到的字符
    1.找出包含good和glad的行
grep -E "g(oo|la)d" test.txt
grep -E "g..d" test.txt

{n,m}匹配次数

重复前一个字符各种次数,可以通过-o参数显示明确的匹配过程
在这里插入图片描述

sed

注意sed和awk使用单引号,双引号有特殊解释

sed是操作、过滤和转换文本内容的强大工具
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)

语法:
sed [选项] [sed内置命令字符] [输入文件]
参数选项解释
-n取消默认sed的输出,常与sed内置命令p一起用
-i直接将修改结果写入文件,不用-i,sed修改的是内存数据
-e多次编辑,不需要管道符了
-r支持正则扩展

sed的内置命令符用于对文件进行不用的操作功能,如对文件增删改查
sed常用内置命令符

sed的内置命令符解释
aappend,对文本的追加,在指定行后面添加一行/多行文本
ddelete,删除匹配行
iinsert,表示插入文本,在指定行前添加一行/多行文本
pprint,打印匹配行的内容,通常p与-n一起用
s/正则/替换内容/g匹配正则内容,然后替换内容,结果g代表全局匹配

sed匹配范围

范围解释
空地址全文处理
单地址指定文件某一行
/pattern/被模式匹配到的每一行
范围区间10,20 十到二十行,10,+5 第10行往下5行
步长1~2,表示1、3、5、7、9行,2 ~ 2两个步长,表示2、4、6、8、10偶数行

sed案例

准备测试数据
在这里插入图片描述
1.输出文件第2,3行的内容

sed -n '2,3p' test.txt

在这里插入图片描述
2.过滤出含有linux的字符串行

sed -n '/linux/p' test.txt

在这里插入图片描述
3.删除含有game的行
注意sed想要修改文件内容,还得用-i参数

sed -i '/game/d' test.txt

在这里插入图片描述
删除2、3两行

sed -i '2,3d' test.txt

删除第5行到结尾

sed -i '5,$d' test.txt

4.将文件中的My全部替换为His

  • s内置符配合g,代表全局替换,中间的”/“可以替换为”#@/“
sed 's/My/His/g' test.txt

在这里插入图片描述

5.替换所有My为His,同时换掉QQ号为888888

sed -e 's/His/My/g' -e 's/877348180/888888/g' test.txt

在这里插入图片描述
6.在文件第二行追加a字符功能,写入到文件,还得添加-i

sed -i '2a I am useing sed command' test.txt

在这里插入图片描述
7.在第二行上面插入内容

sed '2i i am 18' test.txt

在这里插入图片描述

sed配合正则表达式企业案例

取出linux的IP地址

ifconfig | sed -n '18s#^.*inet##gp' | sed -n 's/net.*$//gp'
ifconfig eth0 | sed -n -e '2s/^.*inet//g' -e '2s/net.*$//gp'

awk

awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式

awk早期在Unix上实现,我们用的awk是gawk,是GUN awk的意思
在这里插入图片描述
awk更是一门编程语言,支持条件判断、数组、循环等功能

再谈三剑客

  • grep,擅长单纯的查找或匹配文本内容
  • sed,更适合编辑、处理匹配到的文本内容
  • awk,更适合格式化文本内容,对文本进行复杂处理

三个命令称之为Linux的三剑客

awk基础

awk语法

awk [option] 'pattern[action]' file ...
awk  参数        ’条件动作‘     文件
  • Action指的是动作,awk擅长文本格式化,且输出格式化的结果,因此最常用的动作就是print和print
  • awk场景

在这里插入图片描述
我们执行的命令是awk ‘{print $2}’,并没有使用参数和模式,$2表示输出文本的第二列信息

awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符

awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格

指定分隔符后,awk把每一行切割后的数据对应到内置变量
在这里插入图片描述

  • $0表示整行
  • $NF表示当前分割后的最后一列
  • 倒数第二列可以写成$(NF-1)

awk案例

显示文件第五行

awk 'NR==5' pwd.txt

显示文件2-5行

awk 'NR==2,NR==5' pwd.txt

给每一行的内容添加行号

awk '{print NR,$0}' alex.txt

显示文件3-5行且输出行号

awk 'NR==3,NR==5 {print NR,$0}' alex.txt

显示pwd.txt文件的第一列,倒数第二和最后一列

awk -F ':' '{print $1,$(NF-1),$NF}' pwd.txt

在这里插入图片描述

awk分隔符

awk的分隔符有两种

  • 输入分隔符,awk默认是空格,空白字符,英文是field separator,变量名是FS
  • 输出分割符,output field separator,简称OFS

FS输入分隔符

awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格

当我们处理特殊文件,没有空格的时候,可以自由指定分隔符特点
在这里插入图片描述

OFS输出分隔符

awk执行完命令,默认用空格隔开每一列,这个空格就是awk的默认输出分隔符
通过OFS设置输出分隔符,记住修改变量必须搭配选项-v
在这里插入图片描述

输出分隔符与逗号

awk是否存在输出分隔符,特点在于'{print $1,$3}'逗号的区别

  • 添加逗号,默认是空格分隔符
    在这里插入图片描述

  • 不加逗号 在这里插入图片描述

  • 修改分隔符,改为\t(制表符,四个空格)或者任意字符
    在这里插入图片描述

awk参数与变量

参数解释
-F指定分割字段符
-v定义或修改一个awk内部的变量
-f从脚本中读取awk命令
对于awk而言,变量分为
  • 内置变量
  • 自定义变量
内置变量解释
FS输入字段分隔符,默认为空白字符
OFS输出字段分隔符,默认为空白字符
RS输入记录分隔符(输入换行符),指定输入时的换行符
ORS输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF当前行的字段的个数
NR行号,当前处理的文本的行号
FNR各文件分别计数的行号
FILENAME当前文件名
ARGC命令行参数的个数
ARGV数组,保存的是命令行所给定的个参数
  • awk的内置变量NR、NF是不用添加$符号的
  • 而$0 $1 $2是需要添加 $符号的

输出每行行号,以及字段总个数

awk '{print NR,NF}' alex,txt

输出每行行号以及指定的列

awk '{print NR,$1,$5}' alex,txt

处理多个文件显示行号

# 普通的NR变量,会将多个文件按照顺序排序
awk '{print NR,$0}' alex,txt
# 使用FNR变量,可以分别对文件行数计数
awk '{print FNR,$0}' alex,txt

内置变量RS

RS变量的作用是输入分隔符,默认是回车符,也就是换行符
我们也可以自定义空格作为行分隔符,每遇到一个空格,就换行处理
在这里插入图片描述

内置变量ORS

ORS是输出分隔符的意思,awk默认认为,每一行结束了,就得添加回车换行符

ORS变量可以更改输出符

在这里插入图片描述

内置变量FILENAME

显示awk正在处理文件的名字

awk '{print FILENAME,FNR,$0}' chaoge.txt alex.txt

变量ARGC、ARGV

ARGV表示的一个数组,数组中保存的是命令行所给的参数

数组是一种数据类型,如同一个盒子

盒子有他的名字,且盒子内部有N个小格子,标号从0开始

给一个盒子起名字叫做months,月份是1~12
在这里插入图片描述
在这里插入图片描述

自定义变量

顾名思义,是我们自己定义的变量

  • 方法一, -v
  • 方法二,在程序中直接定义

awk格式化

前面我们接触到的awk的输出功能,是print,只能对文本简单的输出,并不能美化或者修改格式

printf格式化输出

  • printf和print的区别
format的使用
要点:
1.其中print命令的最大不同是,printf需要指定format
2.format用于指定后面的每个item的输出格式
3.printf语句不会自动打印换行符: \\n

format格式的指示符都以%开头,后跟一个字符
% c:显示字符的ASCII
% d, % i:十进制整数
% e, % E:科学计数法显示数值
% f: 显示浮点数
% g, % G: 以科学计数法的格式或浮点数的格式显示数值
% s: 显示字符串
% u: 无符号整数
% % : 显示%自身

printf修饰符:
-: 左对齐,默认右对齐
+:显示数值符号: printf "% +d"
  • printf动作默认不会添加换行符
  • print默认添加空格换行符

在这里插入图片描述

  • 给print添加格式

格式化字符串%s代表字符串的意思
在这里插入图片描述
对多个变量进行格式化
当我们使用linux命令printf,一个%s格式化替换符,可以对多个参数进行重复格式化
在这里插入图片描述

awk模式pattern

再回顾一下awk的语法

awk [option] 'pattern[action]' file ...
awk  参数        ’条件动作‘     文件

awk是按行处理文本,刚才讲解了print动作,现在讲解特殊的pattern:BEGIN和END

  • BEGIN模式是处理文本之前需要执行的操作
  • END模式是处理完所有行之后执行的操作
    在这里插入图片描述
    在这里插入图片描述
    awk结合BEGIN和END模式
    在这里插入图片描述
    awk模式pattern讲解

再看一下awk的语法,模式也可以理解为是条件

awk [option] 'pattern[action]' file ...

刚才我们学了两个模式(条件)

  • BEGIN
  • END
    awk默认是按行处理文本,如果不指定任何模式(条件),awk默认一行行处理
    如果指定了模式,只有符合模式的才会被处理

模式(条件)案例在这里插入图片描述

awk模式

关系运算符解释示例
<小于x<y
<=小于等于x<=y
==等于x==y
!=不等于x!=y
>=大于等于x>=y
>大于x>y
~匹配正则x~/正则/
!~不匹配正则x!~/正则/

在这里插入图片描述

awk基础总结

  • 空模式,没有指定任何的模式,因此每一行都执行了对应的动作,空模式会匹配文档的每一行,每一行都满足了(空模式)
    在这里插入图片描述
  • 关系运算符模式,awk默认执行打印输出动作
    在这里插入图片描述
  • BEGIN/END模式
    在这里插入图片描述

awk与正则表达式

正则表达式最主要与awk的pattern模式结合使用

  • 不指定模式,awk每一行都会执行对应的动作
  • 指定了模式,只有被模式匹配到的、符合条件的行才会执行动作

找出pwd.txt中有games开头的行

1.用grep过滤

grep "^games" pwd.txt

2.用awk

awk '/^games/{print $0}' pwd.txt
awk '/^games/' pwd.txt

awk有强大的格式化文本
在这里插入图片描述

awk命令执行流程

解读需求:从pwd.txt文件中,寻找我们想要的信息,按照以下顺序执行

awk 'BEGIN{commands} patterm{commands} END{commands}'
  1. 优先执行BEGIN{}模式中的语句
  2. 从pwd.txt中读取第一行,然后执行pattern{commands}进行正则匹配/^n/ 寻找n开头的行,找到了执行{print}进行打印
  3. 当awk读取文件数据流的结尾时,会执行END{commands}

找出pwd.txt文件中禁止登录的用户

正则表达式中如果出现了"/"则需要进行转义
找出pwd.txt文件中禁止登录的用户(/sbin/nologin)
1.用grep找出

grep '/sbin/nologin$' pwd.txt

2.awk用正则得用双斜杠/正则表达式/

awk '/\/sbin\/nologin$/{print $0}' pwd.txt

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值