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的内置命令符 | 解释 |
---|---|
a | append,对文本的追加,在指定行后面添加一行/多行文本 |
d | delete,删除匹配行 |
i | insert,表示插入文本,在指定行前添加一行/多行文本 |
p | print,打印匹配行的内容,通常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 参数 ’条件动作‘ 文件
我们执行的命令是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}'
- 优先执行BEGIN{}模式中的语句
- 从pwd.txt中读取第一行,然后执行pattern{commands}进行正则匹配/^n/ 寻找n开头的行,找到了执行{print}进行打印
- 当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