当前位置: 首页 > backend >正文

shell三剑客

了解三剑客

三剑客指的是: 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解释说明(带*的为重点)
aappend追加,在指定行后添加一行或多行文本*
cchange,取代指定的行
ddelete,删除指定的行*
iinsert插入,在指定行前添加一行或多行文本*
pprint,打印模式空间内容,通常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执行结束,用于实现收尾操作 ① 数学计算中,输出最终结果 ② 输出最后一行等等

http://www.xdnf.cn/news/14364.html

相关文章:

  • FileBrowser Quantum更丝滑的文件网盘共享FileBrowser的平替
  • Python命名空间与作用域:深入解析名称查找的艺术
  • halcon开发之我与阿莲的故事1
  • Web自动化测试详细流程和步骤
  • Vue框架详解与Element
  • Python Day51 学习(日志Day20复习)
  • Atcoder Beginner Contest 410 题解报告
  • 来自麻省理工和AI制药公司 Recursion 的结构与结合亲和力预测模型Boltz-2,解决小分子药物发现的关键问题
  • 高频计网面试题(附模板答案)
  • 电子计数跳绳加长改造
  • 多线程5(Thread)
  • wpa_supplicant:无线网络连接的“智能管家”
  • 龟兔赛跑算法(Floyd‘s Cycle-Finding Algorithm)寻找重复数
  • ResizeObserver的错误
  • Bootstrap 5学习教程,从入门到精通, Bootstrap 5 分页(Pagination)知识点及案例代码(13)
  • Android平台如何高效移动RTMP|RTSP直播流的录像文件?
  • Web端测试、App测试和小程序测试的主要内容、注意事项及三者区别
  • CocosCreator 之 ScrollView拓展:上拉、下拉及List的拓展
  • 人工智能学习20-Pandas-自定义的函数
  • FreeRTOS任务相关API简介
  • Linux操作系统批量装机实战
  • 03.利用显卡内核模块等特性为算法提速百倍
  • cannot allocate memory in static TLS block昇腾910报错
  • 图片优化方案
  • 【DVWA系列】——JavaScript——Medium详细教程
  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 商业化场景设计
  • Seata的TC(事务协调器)高可用如何实现?
  • keil一键烧录boot和app程序
  • pycharm2020.2版本给项目选择了虚拟环境解释器,项目文件都运行正常,为什么terminal文件路径的前面没有虚拟解释器的名称
  • 解决STM32H7系列串口DMA发送一次卡死