了解三剑客
三剑客指的是: grep、sed和awk这三个在linux系统中常用的命令行工具
shell三剑客
grep: 主要用于查找和过滤特定文本
sed:是一个流编辑器,可以对文本进行增删改查
awk:是一个文本处理工具,适合对列进行处理和分析。它不仅可以进行查找和替换,还能执行数学计算和数据统计
shell三剑客试用场景
1.日志处理与搜索:使用grep 搜索关键词,结合sed和awk进行进一步处理和分析
2.配置文件管理: 使用sed和awk进行批量修改、添加、或删除配置项。
3.数据提取和转换:利用awk提取、分析和转换结构化文本数据,处理CSV、JSON等格式
4.监控与报警:使用grep、sed和awk提取关键信息生成监控报告,监控系统状态和性能
5.日常运维任务:自动化任务如查找过期文件、清理日志、统计日志大小等。
6.系统管理:使用sed和awk处理系统状态信息,如用户信息、进程信息、磁盘使用情况等。
shell三剑客之grep指令
基本语法:grep 选项 内容 文件
记住:都是常见一些选项
支持的正则 | 描述 |
---|---|
-E,--extended-regexp | 模式是扩展正则表达式(ERE) => 字符簇、()、|或 |
-P,--perl-regexp | 模式是Perl正则表达式 => \d、\w、\s |
-i,--ignore-case | 忽略大小写 |
-w,--word-regexp | 模式匹配整个单词 |
-v,--invert-match | 打印不匹配的行(取反) |
了解:能记住最好,记不住,作为了解,使用的时候查看文档!
输出控制 | 描述 |
---|---|
-n,--line-number | 打印行号 |
-o,--only-matching | 只打印匹配的内容 |
-r,--recursive | 递归目录 |
-c,--count | 统计匹配行数 |
练习
准备数据集
# vim demo.txt
Hello, this is an example file.
It contains some lines of text.
Let's use grep to search for specific patterns.
在文件中搜索包含单词 "example" 的行
grep "example" demo.txt
shell三剑客之sed指令
语法格式:sed 【选项】 【sed命令】 【输入文件】
说明:
① 注意sed软件以及后面选项,sed命令和输入文件,每个元素之间都至少有一个空格。
② 为了避免混淆,笔记中称呼sed为sed软件。sed -commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令
③ sed -commands 既可以是单个sed命令,也可以是多个sed命令组合。
④ input -file (输入文件)是可选项,sed还能够从标准输入如管道获取输入。
sed软件有两个内置的存储空间:
☆ 模式空间(pattern space):是sed软件从文本读取一行文本然后存入的缓冲区(这个缓冲区是在内存中的),然后使用sed命令操作模式空间的内容。
☆ 保持空间(hold space):是sed软件另外一个缓冲区,用来存放临时数据,也是在内存中,但是模式空间和保持空间的用途是不一样的。sed可以交换保持空间和模式空间的数据(一般都是将保持空间的数据,拿到模式空间进行操作),但是不能在保持空间上执行普通的sed命令,也就是说我们可以在保持空间存储数据。
模式空间:临时存放数据,然后通过sed命令进行加工处理,处理完成后,打印到屏幕,然后清空模式空间
保持空间:存储数据(以后我们操作一行文本的时候,真的所有的时候都只能一行一行操作吗?答:有的时候会对多行内容进行操作,当然你对内容进行多行操作的时候,就可以把数据放在 保持空间)
sed选项说明
记住常用的三个选项:
option[选项] | 解释说明(带*的为重点) |
---|---|
-n | 取消默认的sed软件的输出,常与sed命令的p连用* |
-r | 使用扩展正则表达式(grep -E),默认情况sed只识别基本正则表达式* |
-i | 直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存(模式空间)中的数据,并不会影响磁盘上的文件* |
记住几个常用:
sed -commands | 解释说明(带*的为重点) |
---|---|
a | append追加,在指定行后添加一行或多行文本* |
c | change,取代指定的行 |
d | delete,删除指定的行* |
i | insert插入,在指定行前添加一行或多行文本* |
p | print,打印模式空间内容,通常p会与选项-n一起使用* |
q | 退出sed |
r | 从指定文件读取数据 |
s | 取代,s#old#new#g==>这里g是s命令的替代标志,注意和g命令区分。* |
重点记住:增删改查操作 => 增加a、删除d、修改c或s、查询p
sed添加操作
# cat >person.txt<<EOF
101,Tom,CEO
102,Rose,CTO
103,Alex,COO
104,Jack,CFO
105,Jennifer,CIO
EOF
命令说明:使用一条cat命令创建多行文本,文件包含上面的内容,后面的操作都会使用这个文件。
单行操作
sed '2a 106,Smith,CSO' person.txt
注:
2代表指定对第2行操作,其他的行忽略;
a代表追加的意思,2a即在第2行后追加文本;
2a后面加上空格,然后跟上你想要插入的多行文本即可。这里的每行文本使用"\n"连接就可以写成一行了。
注意:以上2a也可以调整为2i,代表在第2行的前面添加一行
多行操作
sed '2a 106,Eric,CSO\n107,Susan,CCO' person.txt
注:\n代表换行符
sed默认操作文件内容是在内存中的模式空间中进行实现,不会影响原文件内容。
增加操作有两种方式(行号 + i,指定行前面添加内容),(行号 + a,指定行后面添加内容)
如果希望增加操作影响原文件,可以添加一个选项-i
sed删除操作(记住d)
删除指定行文本。
注意:建议删除的时候 使用 单引号
案例1:下面用具体的例子演示一下sed删除操作实现
# sed 'd' person.txt
命令说明:如果在sed命令前面不指定地址范围,那么默认会匹配所有行,然后使用d命令删除功能就会删除这个文件的所有内容
案例2:
# sed '2d' person.txt
命令说明:这个单行删除想必大家能理解,指定删除第2行的文本
案例3:
# sed '2,5d' person.txt
命令说明:'2,5d' 指定删除第2行到第5行的内容,d代表删除操作。
案例4:
sed '/Jack/d' person.txt
命令说明:在sed软件中,使用正则的格式和awk一样,使用2个"/"包含指定的正则表达式,即"/正则表达式/"。
案例5:
# sed '/Tom/,/Alex/d' person.txt
命令说明:这是正则表达式形式的多行删除,也是以逗号分隔2个地址,最后结果是删除包含"Tom"的行到包含"Alex"的行
案例6:
# sed '3,$d' person.txt
命令说明:学过正则表达式后我们知道"$"代表行尾,但是在sed中就有一些变化了,"$"在sed中代表文件的最后一行。因此本例子的含义是删除第3行到最后一行的文本,包含第3行和最后一行,因此剩下第1,2行的内容。
案例7:在最后一行,追加 内容
# sed '$a 106,Tom,CSO' person.txt
命令说明:为了不造成同学们实验文本改来改去导致不同意,因此我用上面的命令语句只是临时修改内存数据,然后通过管道符号传给sed软件。
小结:
sed软件不仅可以添加数据行,也可以删除数据行,删除数据行必须使用(d)命令
sed删除软件 => (sed '范围d' 文件)=> 默认都是在内存中完成,需要影响原文件,则添加一个-i
sed匹配原则,匹配内容 + d,如3,5d :删除从第三行-第五行的内容
sed修改操作(重点,要记住c和s)
c:change缩写,替换指定行,以行为单位
s : s/旧的内容/替换后内容/g 或 s#旧的内容#替换后内容#g,以关键词为单位
注意:不建议使用 /,建议使用 #,因为,/ 容易 混淆,比如说,我的内容中就有 /,如果要替换了,那是不是要加,转移字符\/
为什么使用#作为标识符,因为如果文件路径的替换,/root、/etc,刚好与边界符号冲突了
sed修改操作,我们最常见的操作就是改配置文件,改参数等等 首先说一下按行替换,这个功能用的很少,所以大家了解即可。这里用到的sed命令是:"c":用新行取代旧行,记忆方法:c的全拼是change,意思是替换。
sed查询操作(记住-n+p)
sed命令:
"p":输出指定内容,但默认会输出2次匹配的结果,因此使用-n选项取消默认输出,记忆方法:p的全拼是print,意思是打印。
Shell三剑客之awk指令
awk格式
awk指令是由模式,动作,或者模式和动作的组合组成。
可以理解为:我们的模式和动作选项中,可以 只有模式(意味着,你要所有的内容),也可以只有动作,也可以有 模式+动作
模式既pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把他理解为一个条件。
动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。
options既参数,使用最多的参数为-F(Field,用于指定字段与字段之间的分隔符,列与列之间的分隔符,默认为空格)
pattern既模式,也可以理解为条件,也叫找谁,你找谁?高矮,胖瘦,男女?都是条件,既模式。
action既动作,可以理解为干啥,找到人之后你要做什么。
注意:awk -F"分隔符" '模式和动作' file
-F后面跟是双引号,模式和动作要使用单引号进行包裹!!!
基本模式与动作
# awk -F ":" 'NR>=2 && NR<=6{print NR,$1}' /etc/passwd
2 bin
3 daemon
4 adm
5 lp
6 sync
命令说明:
-F 指定分隔符为冒号,相当于以“:”为菜刀,进行字段的切割。
NR>=2 && NR<=6:这部分表示模式,是一个条件,表示取第2行到第6行。
{print NR,$1}:这部分表示动作,表示要输出NR行号和$1第一列。
$1代表第1列
$2代表第2列
依次类推
NR == Number(数字、号码)+ Record(记录、行)== 行号
awk执行过程
解析:
① awk读入第一行内容
② 判断是否符合模式中的条件NR>=2
如果匹配则执行对应的动作{print $0}
如果不匹配条件,继续读取下一行
③ 继续读取下一行
④ 重复过程1-3,直到读取到最后一行(EOF:end of file)
awk记录(行)
名称 | 含义 |
---|---|
record | 记录,行 => NR(Number Record)行号 |
field | 域,区域,字段,列 => NF(Number Field)列号,$NF代表最后一列 |
awk默认情况下每一行都是一个记录(record)
① RS既record separator输入输出数据记录分隔符,每一行是怎么没的,表示每个记录输入的时候的分隔符,既行与行之间如何分隔,默认为\n,可以调整为其他字符。
② NR既number of record 记录(行)号,表示当前正在处理的记录(行)的号码。
③ ORS既output record separator 输出记录分隔符。
awk使用内置变量RS来存放输入记录(行与行)分隔符,RS表示的是输入的记录分隔符,这个值可以通过BEGIN模块重新定义修改。
NR:行号,打印行号
NF:NF代表列号,如果前面添加了$,则代表最后一列
$0:整行内容
awk字段(列)
每条记录都是由多个区域(field)组成的,默认情况下区域之间的分隔符是由空格(即空格或制表符)来分隔,并且将分隔符记录在内置变量FS中,每行记录的区域数保存在awk的内置变量NF中。
awk分隔符
如果采用默认分隔符,切割内容,如果左边有一大批空白内容,则默认分隔符会自动忽略此内容。
如果采用人为设定分隔符,切割内容,如果左边有一大批空白内容,则人为设定的分隔符会对这块内容进行切割。
awk模式与动作进阶
awk模式与动作
接下来就详细介绍下,awk的模式都有几种:
☆ 正则表达式作为模式
☆ 比较表达式作为模式 NR>=2
☆ 范围模式 NR>=2 && NR <= 5
☆ 特殊模式BEGIN和END
BEGIN模式与END模式
BEGIN模块在awk读取文件之前就执行,一般用来定义我们的内置变量(预定义变量,eg:FS,RS),可以输出表头(类似excel表格名称)
BEGIN模式之前我们有在示例中提到,自定义变量,给内容变量赋值等,都使用过。需要注意的是BEGIN模式后面要接跟一个action操作块,包含在大括号内。awk必须在输入文件进行任何处理前先执行BEGIN里的动作(action)。我们可以不要任何输入文件,就可以对BEGIN模块进行测试,因为awk需要先执行完BEGIN模式,才对输入文件做处理。BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS等值
数据集:
# cat /server/files/awkfile.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
BEGIN模块完整写法:BEGIN{}
# awk -F: 'BEGIN{print "username","UID"}{print $1,$3}' awkfile.txt
username UID #这就是输出的表头信息
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
uucp 10
☆ END模式
作用:与BEGIN相呼应,在awk处理文件结束后,会自动触发END模块(只会触发1次)
基本语法:
awk '动作 END{print xxx}'
应用场景说明: awk执行结束,用于实现收尾操作 ① 数学计算中,输出最终结果 ② 输出最后一行等等