• 学习目标

                                使用cut可以切割提取指定列\字符\字节的数据

                                使用sed编辑文件增删改查

                                使用awk对文件分析

                                使用sort对文件进行字符串或数字或多列排序

                                能够理解场景面试题

                                 

                                 

                                Shell好用的工具: cut

                                目标

                                使用cut可以切割提取指定列\字符\字节的数据

                                 

                                介绍

                                cut 译为“剪切, 切割” , 是一个强大文本处理工具,它可以将文本按列进行划分的文本处理。cut命令逐行读入文本,然后按列划分字段并进行提取、输出等操作。

                                 

                                语法

                                options参数说明

                                选项参数功能
                                -f 提取范围列号,获取第几列
                                -d 自定义分隔符自定义分隔符,默认为制表符。
                                -c 提取范围以字符为单位进行分割
                                -b 提取范围以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
                                -n与“-b”选项连用,不分割多字节字符;

                                提取范围说明

                                提取范围说明
                                n-提取指定第n列或字符或字节后面所有数据
                                n-m提取指定第n列或字符或字节到第m列或字符或字节中间的所有数据
                                -m提取指定第m列或字符或字节前面所有数据
                                n1,n2,...提前指定枚举列的所有数据

                                 

                                示例:切割提取指定列数据

                                cut1.txt文件数据准备

                                编辑文件添加内容

                                提取文件中第一列数据

                                image-20200707230710596

                                提取文件中第一列,第三列, 枚举查找

                                image-20200707232926482

                                提取文件中第二列,第三列,第四列, 范围查找

                                image-20200707233024564

                                提取文件中第一列后面所有列的数据

                                image-20200709220852618

                                提起文件中结束列前面所有列的数据

                                运行效果

                                image-20200711142437017

                                示例: 切割提取指定字符数据

                                提取每行前3个字符

                                运行效果

                                image-20200711142653293

                                提取每行第4个字符以后的数据

                                运行效果

                                image-20200711143324756

                                提取每行第3个字符前面所有字符

                                运行效果

                                image-20200711143438631

                                示例:切割提取指定字节数据

                                提取字符串"abc传智播客" 前3个字节

                                运行效果

                                image-20200711143706340

                                提取字符串"abc传智播客" 前4个字节

                                运行效果

                                image-20200711143754196

                                提取字符串"abc传智播客" 前6个字节

                                运行效果

                                image-20200711143926461

                                提取字符串"abc传智播客" 前4个字节, 就可以将汉字 "传"输出,

                                运行效果

                                image-20200711144139142

                                示例:切割提取指定单词数据

                                在cut1.txt文件中切割出"itheima"

                                image-20200708003059162

                                 

                                示例:切割提取bash进程的PID号

                                命令

                                运行效果

                                image-20200711120636232

                                 

                                示例:切割提取IP地址

                                运行效果

                                image-20200711115310554

                                 

                                小结

                                cut的作用

                                一个强大文本处理工具,它可以将文本按列进行划分的文本处理。cut命令逐行读入文本,然后按列划分字段并进行提取、输出等操作。

                                cut切割提取列

                                cut 文件或数据 -d 分隔符切割 -f 提取第X列

                                cut切割提取字符

                                cut 文件或数据 -c 提取字符范围

                                cut切割提取字节

                                cut 文件或数据 -nb 提取直接范围

                                Shell好用的工具:sed

                                目标

                                使用sed编辑文件替换文件中的单词

                                编写在文件中插入或修改行的sed程序

                                使用sed作为过滤器来过滤管道数据命令

                                 

                                介绍

                                sed (stream editor, 流编辑器) 是Linux下一款功能强大的非交互流式文本编辑器(vim是交互式文本编辑器),可以对文本文件的每一行数据匹配查询之后进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑.

                                sed是一种流编辑器,它一次处理一行内容, 将这行放入缓存(存区空间称为:模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。

                                sed处理数据原理

                                image-20200711095515087

                                 

                                语法

                                选项参数说明

                                选项参数功能
                                -e直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令
                                -i直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
                                -f后跟保存了sed指令的文件
                                -n取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
                                -r ruguler使用扩展正则表达式,默认情况sed只识别基本正则表达式 *

                                 

                                sed程序命令功能描述

                                命令功能描述
                                aadd新增,a的后面可以接字串,在下一行出现
                                cchange更改, 更改匹配行的内容
                                ddelete删除, 删除匹配的内容
                                iinsert插入, 向匹配行前插入内容
                                pprint打印, 打印出匹配的内容,通常与-n选项和用
                                ssubstitute替换, 替换掉匹配的内容
                                =用来打印被匹配的行的行号
                                n读取下一行,遇到n时会自动跳入下一行

                                特殊符号

                                命令功能描述
                                !就像一个sed命令,放在限制条件后面, 对指定行以外的所有行应用命令(取反)
                                {sed命令1;sed命令2}多个命令操作同一个的行

                                 

                                数据准备

                                sed.txt文件内容

                                 

                                示例:向文件中添加数据

                                演示1: 指定行号的前或后面添加数据

                                向第三行后面添加hello

                                3 , 代表第三行

                                a, 代表在后面添加, 出现在下一行

                                注意这里没有修改源文件

                                运行效果

                                image-20200710000018446

                                向第三行前面添加hello

                                3 , 代表第三行

                                i, 代表在前面添加, 出现在上一行

                                注意这里没有修改源文件

                                运行效果

                                image-20200710000824539

                                演示2: 指定内容前或后面添加数据

                                向内容 itheima 后面添加 hello ,如果文件中有多行包括 `itheima `,则每一行后面都会添加

                                运行效果

                                image-20200710000117275

                                向内容 itheima 前面添加 hello ,如果文件中有多行包括 `itheima `,则每一行前面都会添加

                                运行效果

                                image-20200710001012028

                                演示3: 在最后一行前或后添加hello

                                在最后一行后面添加hello

                                $a: 最后一行后面添加

                                运行效果

                                image-20200710000330765

                                在最后一行前面添加hello

                                $i: 最后一行前面添加

                                运行效果

                                image-20200710001219163

                                 

                                示例: 删除文件中的数据

                                演示1: 删除第2行

                                命令

                                运行效果

                                image-20200710165604688

                                命令: 删除第1行,第4行数据

                                运行效果

                                image-20200711112046339

                                 

                                演示2: 删除奇数行

                                从第一行开始删除,每隔2行就删掉一行

                                运行效果

                                image-20200710170036140

                                演示3: 删除指定范围的多行数据

                                删除从第1行到第3行的数据

                                运行效果

                                image-20200710170338110

                                 

                                演示3: 删除指定范围取反的多行数据

                                删除从第1行到第3行取反的数据

                                运行效果

                                image-20200710171410645

                                演示4: 删除最后一行

                                命令

                                运行效果

                                image-20200710173137962

                                演示5: 删除匹配itheima的行

                                命令

                                运行效果

                                image-20200710173601573

                                演示6: 删除匹配行到最后一行

                                删除匹配itheima行到最后一行 , 命令

                                运行效果

                                image-20200710174149348

                                演示7: 删除匹配行及其后面一行

                                删除匹配itheima行及其后面一行

                                运行效果

                                image-20200710174655691

                                演示9: 删除不匹配的行

                                删除不匹配 itheimaitcast 的行

                                 

                                运行效果

                                image-20200711105205862

                                示例:更改文件中的数据

                                演示1:将文件的第一行修改为hello

                                命令

                                运行效果

                                image-20200710110433788

                                演示2: 将包含itheima的行修改为hello

                                命令

                                运行效果

                                image-20200710110651523

                                演示3: 将最后一行修改为hello

                                命令

                                运行效果

                                image-20200710111014651

                                演示4: 将文件中的itheima替换为hello

                                将文件中的itheima替换为hello,默认只替换每行第一个itheima

                                运行效果

                                image-20200710154359291

                                注意 's/itheima/hello/' 最后一个/ 不可少

                                将文本中所有的itheima都替换为hello, 全局替换

                                image-20200710154642832

                                演示5: 将每行中第二个匹配替换

                                将每行中第二个匹配的itheima替换为hello 命令

                                运行效果

                                image-20200710154829235

                                演示6: 替换后的内容写入文件

                                将每行中第二个匹配的itheima替换为hello , 将替换后的内容写入到sed2.txt文件中

                                运行效果

                                image-20200710161127555

                                演示7: 正则表达式匹配替换

                                匹配有 i 的行,替换匹配行中 t 后的所有内容为空

                                运行效果

                                image-20200710162013813

                                演示8: 每行末尾拼接test

                                运行效果

                                image-20200710164435499

                                演示9: 每行行首添加注释 #

                                命令

                                运行效果

                                image-20200711111533278

                                 

                                示例: 查询文件或管道中的数据

                                需求1: 查询含有 itcast 的行数据

                                命令

                                运行效果

                                image-20200711113348831

                                需求2: 管道过滤查询

                                管道查询所有进程中含有sshd的进程信息命令

                                运行效果

                                image-20200711113226364

                                 

                                示例: 多个sed程序命令执行

                                将sed.txt文件中的第1行删除并将 itheima 替换为 itcast

                                运行效果

                                image-20200711105707546

                                sed高级用法: 缓存区数据交换

                                模式空间与暂存空间介绍

                                1. 首先需要明白, sed处理文件是逐行处理的, 即读取一行处理一行,输出一行;

                                2. sed把文件读出来每一行存放的空间叫模式空间, 会在该空间中对读到的内容做相应处理;

                                3. 此外sed还有一个额外的空间即暂存空间, 暂存空间刚开始里边只有个空行, 记住这一点;

                                4. sed可使用相应的命令从模式空间往暂存空间放入内容或从暂存空间取内容放入模式空间;

                                  2个缓存空间传输数据的目的是为了更好的处理数据, 一会参考案例学习

                                关于缓存区sed程度命令

                                命令含义
                                h模式空间里面的内容复制到暂存空间缓存区(覆盖方式)
                                H模式空间里面的内容复制到暂存空间缓存区(追加方式)
                                g暂存空间里面的内容复制到模式空间缓存区(覆盖方式)
                                G暂存空间里面的内容复制到模式空间缓存区(追加方式)
                                x交换2个空间的内容

                                 

                                示例: 缓存空间数据交换

                                演示1: 第一行粘贴到最后1行

                                将模式空间第一行复制到暂存空间(覆盖方式),并将暂存空间的内容复制到模式空间中的最后一行(追加方式)

                                运行效果

                                image-20200711103556835

                                演示2: 第一行删除后粘贴到最后1行

                                将模式空间第一行复制到暂存空间(覆盖方式)并删除, 最后将暂存空间的内容复制到模式空间中的最后一行(追加方式)

                                运行效果

                                image-20200711103901519

                                演示3: 第一行数据复制粘贴替换其他行数据

                                将模式空间第一行复制到暂存空间(覆盖方式), 最后将暂存空间的内容复制到模式空间中替换从第2行开始到最后一行的每一行数据(覆盖方式)

                                运行命令

                                image-20200711104451987

                                演示4: 将前3行数据数据复制粘贴到最后一行

                                将前3行数据复制到暂存空间(追加方式), 之后将暂存空间的所有内容复制粘贴到模式空间最后一行(追加方式)

                                 

                                运行效果

                                image-20200711104856968

                                 

                                示例: 给每一行添加空行

                                插入空行

                                运行效果

                                image-20200711095724616

                                示例: 删除所有的空行

                                命令

                                运行效果

                                image-20200711095844232

                                 

                                Shell好用的工具:awk

                                介绍

                                awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理, 因为切开的部分使用awk可以定义变量,运算符, 使用流程控制语句进行深度加工与分析。

                                创始人 Alfred V. Aho、Peter J. Weinberger和Brian W. Kernighan awk由来是姓氏的首字母

                                语法

                                pattern:表示AWK在数据中查找的内容,就是匹配模式

                                action:在找到匹配内容时所执行的一系列命令

                                选项参数说明

                                选项参数功能
                                -F指定输入文件拆分分隔符
                                -v赋值一个用户定义变量

                                awk内置变量

                                内置变量含义
                                ARGC命令行参数个数
                                ARGV命令行参数排列
                                ENVIRON支持队列中系统环境变量的使用
                                FILENAMEawk浏览的文件名
                                FNR浏览文件的记录数
                                FS设置输入域分隔符,等价于命令行 -F选项
                                NF浏览记录的域的个数, 根据分隔符分割后的列数
                                NR已读的记录数, 也是行号
                                OFS输出域分隔符
                                ORS输出记录分隔符
                                RS控制记录分隔符
                                $n$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
                                NF|NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数 

                                 

                                数据准备

                                 

                                示例 : 默认每行空格切割数据

                                命令

                                 

                                运行效果

                                image-20200712145458252

                                 

                                示例: 打印含有匹配信息的行

                                搜索passwd文件有root关键字的所有行

                                运行效果

                                image-20200711163917949

                                示例: 打印匹配行中第7列数据

                                搜索passwd文件有root关键字的所有行, 然后以":"拆分并打印输出第7列

                                运行效果

                                image-20200711164512294

                                 

                                示例: 打印文件每行属性信息

                                统计passwd: 文件名,每行的行号,每行的列数,对应的完整行内容:

                                 

                                运行效果

                                image-20200711165433352

                                使用printf替代print,可以让代码阅读型更好

                                运行效果

                                image-20200711170720468

                                示例: 打印第二行信息

                                打印/etc/passwd/的第二行信息

                                运行效果

                                image-20200711171311183

                                示例: 查找以c开头的资源

                                awk过滤的使用, 查找当前目录下文件名以c开头的文件列表

                                运行效果

                                image-20200711171918200

                                示例: 打印第一列

                                按照":" 分割查询第一列打印输出

                                运行效果

                                image-20200711172121503

                                 

                                示例: 打印最后1列

                                按照":" 分割查询最后一列打印输出

                                运行效果

                                image-20200711172417497

                                示例: 打印倒数第二列

                                按照":" 分割查询倒数第二列打印输出

                                运行效果

                                image-20200711173518580

                                示例: 打印10到20行的第一列

                                获取第10到20行的第一列的信息

                                运行效果

                                image-20200711173734821

                                示例: 多分隔符使用

                                "one:two/three"字符串按照多个分隔符":"或者"/" 分割, 并打印分割后每个列数据

                                运行效果

                                image-20200711174827654

                                示例: 添加开始与结束内容

                                给数据添加开始与结束

                                运行效果

                                image-20200711181845642

                                 

                                示例 : 使用循环拼接分割后的字符串

                                "abc itheima itcast 21" 使用空格分割后, 通过循环拼接在一起

                                运行效果

                                image-20200711213649299

                                 

                                示例: 操作指定数字运算

                                将passwd文件中的用户id增加数值1并输出

                                运行效果

                                image-20200711215839824

                                 

                                示例: 切割ip

                                切割IP

                                运行效果

                                image-20200711220230406

                                示例: 显示空行行号

                                查询sed.txt中空行所在的行号

                                运行效果

                                image-20200712085616584

                                小结

                                grep , sed ,awk , cut 文本字符串操作四剑客的区别

                                grep:用于查找匹配的行

                                cut: 截取数据. 截取某个文件中的列, 重点是按照列分割, 这个命令不适合截取文件中有多个空白字符的字段

                                sed: 增删改查数据. sed用于在文件中以行来截取数据进行增\删\改\查

                                awk:截取分析数据. 可以在某个文件中是以竖列来截取分析数据, 如果字段之间含有很多空白字符也可以获取需要的数据, awk是一种语言,可以深入分析文件数据

                                 

                                Shell好用的工具:sort

                                目标

                                能够使用sort对字符串升序或降序排序

                                能够使用sort 对数字升序或降序

                                能够使用sort 对多列进行排序

                                 

                                介绍

                                sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出或重定向输出到指定文件。

                                语法

                                选项说明
                                -nnumber,依照数值的大小排序
                                -rreverse, 以相反的顺序来排序
                                -t 分隔字符设置排序时所用的分隔字符, 默认空格是分隔符
                                -k指定需要排序的列
                                -d排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
                                -f排序时,将小写字母视为大写字母
                                -b忽略每行前面开始出的空格字符
                                -o 输出文件将排序后的结果存入指定的文件
                                -u意味着是唯一的(unique),输出的结果是去完重了的
                                -m将几个排序好的文件进行合并

                                参数:指定待排序的文件列表

                                数据准备

                                sort.txt文本文件代码

                                示例1: 数字升序

                                按照“ ”空格分割后的第2列数字升序排序。

                                运行效果

                                image-20200713012421583

                                示例2: 数字升序去重

                                先按照“ ”空格分割后的, 然后,按照第2列数字升序排序, 最后对所有列去重

                                运行效果

                                image-20200713012712536

                                注意: 先排序再去重

                                示例3: 数字升序去重结果保存到文件

                                命令

                                运行效果

                                image-20200713012900639

                                示例4: 数字降序去重

                                先按照“ ”空格分割后的, 然后,按照第2列数字降序排序, 最后对所有列去重

                                运行效果

                                image-20200713013216947

                                示例5: 多列排序

                                数据准备sort3.txt

                                要求: 以","分割先对第一列字符串升序, 再对第3列数字降序

                                运行效果

                                image-20200713013821197

                                小结

                                能够使用sort对字符串升序或降序排序

                                字符串升序: sort -kstart,end 文件

                                字符串降序: sort -kstartr,end 文件

                                能够使用sort 对数字升序或降序

                                数字升序: sort -kstartn,end 文件

                                数字降序: sort -kstartnr,end 文件

                                能够使用sort 对多列进行排序

                                sort -kstart[nr],end -kstart[nr],end ... 文件

                                 

                                面试题:查空行

                                问题:使用Linux命令查询file.txt中空行所在的行号

                                file1.txt数据准备

                                 

                                答案:

                                运行效果

                                image-20200713081907537

                                面试题:求一列的和

                                问题:有文件file2.txt内容如下:

                                 

                                使用Linux命令计算第二列的和并输出

                                 

                                运行效果

                                image-20200713082237986

                                 

                                面试题:检查文件是否存在

                                问题:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?

                                答:

                                运行效果

                                image-20200713082603013

                                 

                                面试题:数字排序

                                问题:用shell写一个脚本,对文本中无序的一列数字排序

                                cat file3.txt文件内容

                                运行效果

                                image-20200713083045742

                                 

                                面试题:搜索指定目录下文件内容

                                问题:请用shell脚本写出查找当前文件夹(/root)下所有的文本文件内容中包含有字符”123”的文件名称?

                                答:

                                运行效果

                                image-20200713083912322

                                面试题:批量生成文件名

                                问题: 批量生产指定数目的文件,文件名采用"纳秒"命名

                                答: file4.sh

                                运行效果

                                image-20200713085107848

                                 

                                面试题:批量改名

                                问题: 将/root/temp目录下所有文件名重命名为"旧文件名-递增数字"?

                                重命名命令

                                脚本代码file5.sh

                                运行效果

                                image-20200713091236973

                                面试题:批量创建用户

                                问题: 根据users.txt中提供的用户列表,一个名一行, 批量添加用户到linux系统中

                                已知users.txt数据准备

                                 

                                知识点分析1: 添加用户命令

                                知识点分析2: 设置每个用户密码默认密码

                                运行效果

                                image-20200713092318381

                                 

                                 

                                面试题答案: 脚本代码file6.sh

                                运行效果

                                image-20200713093129265

                                 

                                面试题:筛选单词

                                问题: 根据给出的数据输出里面单词长度大于3的单词

                                数据准备

                                shell脚本file7.sh

                                运行效果

                                image-20200713101959074

                                 

                                面试题:单词及字母去重排序

                                问题

                                file8.txt 文件内容

                                按照单词出现频率降序

                                运行效果

                                image-20200713101616727

                                按照字符出现频率降序前10个

                                运行效果

                                image-20200713101521632

                                面试题:扫描网络内存活主机

                                问题: 扫描192.168.56.1到192.168.56.254之间ip的是否存活, 并输出是否在线?

                                 

                                服务器ip存活分析

                                效果如图

                                image-20200713021841637

                                完整脚本代码

                                运行效果

                                image-20200713021609950

                                面试题:MySQL分库备份

                                运行效果

                                image-20200713032753334

                                面试题:MySQL数据库分库分表备份

                                运行效果

                                image-20200713032458346