项目实训(树莓派)(十三)树莓派4B下的ubuntu系统下高级命令行的使用(grep sed awk)

前言

通过前面的实验,我们已经将关于Ubuntu系统的其余九大部分命令行都做完了,接下来我们将进行一些关于linux高级命令行的讲解和使用。

实验目的

1.掌握Ubuntu系统下一些高级命令行的原理及使用

实验内容

我们知道Linux系统下一些皆文件,所以对LInux系统的文件操作就相当于对linux的系统进行操作。如果能更好的处理文件,就需要用到下面说到的命令。

高级命令行部分:
1.grep命令 – 强大的文本搜索工具
2.sed命令 – 处理编辑文本文件
3.awk命令 – 文本和数据进行处理的编程语言

实验环境

树莓派4B,系统为Ubuntu 20.10系统 。实验的编程环境为Terminal终端程序

**正则表达式:**在正式开始实验之前,先首先来简单介绍一下正则表达式,正则表达式是一个模板,这个模板是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。
在这里插入图片描述
grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

实验步骤

1.grep命令 – 强大的文本搜索工具

(1)命令格式

grep [参数]

(2)命令功能
grep是“global search regular expression and print out the line”的简称,意思是全面搜索正则表达式,并将其打印出来。这个命令可以结合正则表达式使用,它也是linux使用最为广泛的命令。
grep命令的选项用于对搜索过程的补充,而其命令的模式十分灵活,可以是变量、字符串、正则表达式。需要注意的是:一当模式中包含了空格,务必要用双引号将其引起来。
linux系统支持三种形式的grep命令,大儿子就是grep,标准,模仿的代表。二儿子兴趣爱好多-egrep,简称扩展grep命令,其实和grep -E等价,支持基本和扩展的正则表达式。小儿子跑的最快-fgrep,简称快速grep命令,其实和grep -F等价,不支持正则表达式,按照字符串表面意思进行匹配。它的使用权限是所有用户。

(3)命令参数

参数功能说明
-i搜索时,忽略大小写
-c只输出匹配行的数量
-l只列出符合匹配的文件名,不列出具体的匹配行
-n列出所有的匹配行,显示行号
-h查询多文件时不显示文件名
-s不显示不存在、没有匹配文本的错误信息
-v显示不包含匹配文本的所有行
-w匹配整词
-x匹配整行
-r递归搜索
-q禁止输出任何结果,已退出状态表示搜索是否成功
-b打印匹配行距文件头部的偏移量,以字节为单位
-o与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
-F将范本样式视为固定字符串的列表。
-G将范本样式视为普通的表示法来使用。
-H在显示符合范本样式的那一列之前,表示该列所属的文件名称。

(4)使用范例
例一:查找file.txt文件内容中包含root内容的所在行号:
命令:

root@ubuntu :/home/ubuntu# grep -n root file

例二:查找file文件内容不包含root的行都有哪些:
命令:

root@ubuntu :/home/ubuntu# grep -nv root file

例三:查找file文件中以字符s开头的行号
命令:

root@ubuntu :/home/ubuntu# grep ^s file

例四:查找file文件中以字符n结尾的行:
命令:

root@ubuntu :/home/ubuntu# grep -n n$ file

例五:支持多文件查询并支持使用通配符:
查找以file_开头名的文件中有没有匹配root字符串的内容
命令:

root@ubuntu :/home/ubuntu# grep zwx file_* 
file_1:zwx
file_1:zwx
file_1:zwxddkjflkdjfdlkfjlsdkj
file_2:zwx
file_4:dkfjlzwxejfkje
file_4:zwx djfkdjf
file_4:zwxedkfgj

例六:在以file_开头的文件中输出匹配字符串root行的数量:
命令:

root@ubuntu :/home/ubuntu# grep -c root file_*
file_1:2
file_2:1
file_3:0

例七:列出所有的匹配的行,并显示行号:
命令:

root@ubuntu :/home/ubuntu# grep -n zwx file_*
file_1:1:zwx
file_1:4:zwx
file_1:10:zwxddkjflkdjfdlkfjlsdkj
file_2:2:zwx
file_4:3:dkfjlzwxejfkje
file_4:4:zwx djfkdjf
file_4:5:zwxedkfgj

例八:显示不包含匹配字符串的所有行数:
命令:

root@ubuntu :/home/ubuntu# grep -vc zwx file_*
file_1:7                                
file_2:4
file_3:5
file_4:2

例九:查找以file_开头名的文件中有没有匹配root字符串的内容,但是不显示文件名
命令:

root@ubuntu :/home/ubuntu# grep -h zwx file_*
zwx
zwx
zwxddkjflkdjfdlkfjlsdkj
zwx
dkfjlzwxejfkje
zwx djfkdjf
zwxedkfgj

例十:只列出符合匹配的文件名,不列出具体匹配的行:
命令:

root@ubuntu :/home/ubuntu# grep -l zwx file_*
file_1
file_2
file_4

例十一:不显示不存在或无匹配的文本信息:
命令:

root@ubuntu :/home/ubuntu# grep  -s zwx file1 file_1
file_1:zwx       
file_1:zwx
file_1:zwxddkjflkdjfdlkfjlsdkj
root@ubuntu :/home/ubuntu# grep zwx file1 file_1
grep: file1: No such file or directory  
file_1:zwx
file_1:zwx
file_1:zwxddkjflkdjfdlkfjlsdkj

例十二:递归搜索,不仅搜索当前目录,还搜索子目录:
命令:

 root@ubuntu :/home/ubuntu# grep -r zwx file_2 *
 file_2:zwx
 anaconda-ks.cfg:user --name=zwx --gecos="zwx"
 file_1:zwx
 file_1:zwx
 file_1:zwxddkjflkdjfdlkfjlsdkj
 file_2:zwx
 file_4:dkfjlzwxejfkje
 file_4:zwx djfkdjf
 file_4:zwxedkfgj
 initial-setup-ks.cfg:user --name=zwx --gecos="zwx"

例十三:精确匹配整词
命令:

root@ubuntu :/home/ubuntu# grep -w zw* file_1
zw

例十四:匹配整行,文件中的整行与字符串匹配时,才打印出来:
命令:

 root@ubuntu :/home/ubuntu# grep -x zwx file_*
 file_1:zwx
 file_1:zwx
 file_2:zwx

例十五:不输出任何结果,已退出状态表示结果:
命令:

root@ubuntu :/home/ubuntu# grep -q zwx file_1
echo $?
0
root@ubuntu :/home/ubuntu# grep -q zwx file_5
echo $?
1
root@ubuntu :/home/ubuntu# grep -q zwx file5
grep: file5: No such file or directory
echo $?
2

例十六:查找一个文件中的空行和非空行:
命令:

root@ubuntu :/home/ubuntu# grep -c ^$ file_1
4
root@ubuntu :/home/ubuntu# grep -c ^[^$] file_1
15

例十七:匹配任意或重复字符用“.”或“*”符号来实现:
命令:

root@ubuntu :/home/ubuntu#  grep ^z.x file_1
 zwx
 zwx
 zwxddkjflkdjfdlkfjlsdkj
root@ubuntu :/home/ubuntu#  grep ^z* file_6
 zwx
 dfkjd
                      
 zzdfjkd
 zz dfdww
 haha

2.sed命令 – 处理编辑文本文件

(1)命令格式

sed [参数]

(2)命令功能
Linux 的sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
sed工作过程
sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed 的命令就是在 vi和 ed/ex 编辑器中见到的那些。sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把该行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。sed 每处理完输入文件的最后一行后,sed 便结束运行。sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。
在这里插入图片描述
从上图中就可以看出来sed命令是具有一种类似于延时修改的功能,它不会修改正在编辑的文件。

(3)命令参数

参数功能说明
-e以选项中指定的script来处理输入的文本文件
-f<script文件>或–file=<script文件>以选项中指定的script文件来处理输入的文本文件
-h或–help显示帮助
-n或–quiet或–silent仅显示script处理后的结果
-V或–version显示版本信息

操作命令:
sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址,sed 就会处理输入的所有的行。

参数功能
x指定行号
x,y指定从x到y的行号范围
/ pattern/查询包含模式的行 # # % %
/ pattern/ pattern/查询包含两个模式的行
/ pattern/,x从与 pattern的匹配行到x号行之间的行
x,/ pattern/从x号行到与 pattern的匹配行之间的行
x,y!查询不包括x和y行号的行
r从另一个文件中读文件
w将文本写入到一个文件
y变换字符
q第一个模式匹配完成后退出
l显示与八进制ASCⅡ码等价的控制字符
{}在定位行执行的命令组
p打印匹配行
=打印文件行号
a在定位行号之后追加文本信息
i在定位行号之前插入文本信息
d删除定位行
c用新文本替换定位文本
s使用替换模式替换相应模式
n读取下一个输入行,用下一个命令处理新的行
N将当前读入行的下一行读取到当前的模式空间。
h将模式缓冲区的文本复制到保持缓冲区
H将模式缓冲区的文本追加到保持缓冲区
x互换模式缓冲区和保持缓冲区的内容
g将保持缓冲区的内容复制到模式缓冲区
G将保持缓冲区的内容追加到模式缓冲区。

(4)使用范例
例一:打印出file.txt文件的第二行
命令:

root@ubuntu :/home/ubuntu# sed -n 2p file.txt

输出:
在这里插入图片描述

例二:打印出file文件第二行到第五行的内容
命令:

root@ubuntu :/home/ubuntu# sed -n 2,5p file.txt

输出:
在这里插入图片描述

例三:将文件中的root全部替换为abc
命令:

root@ubuntu :/home/ubuntu# sed -i 's/root/abc/g' file

输出:
在这里插入图片描述

例四:在file文件的第四行后添加一行,并将结果输出到标准输出:
命令:

root@ubuntu :/home/ubuntu# sed -e 4a\newline file 
HELLO LINUX!   
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test  
newline 

例五:将 /dir 的内容列出并且列印行号,同时删除第 2~5 行:

root@ubuntu :/home/ubuntu# nl /dir | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

例六:在第二行后面加入两行字,例如 Drink tea or …… 与 drink beer:

root@ubuntu :/home/ubuntu# nl /dir | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

例七:将第2-5行的内容取代成为No 2-5 number:

root@ubuntu :/home/ubuntu# nl /dir | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync

例八: 以行为单位的显示:

root@ubuntu :/home/ubuntu# nl /dir | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

注:通常而言,sed将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执
行完毕,然后该行被输出,模式空间清空,然后重复刚才的动作,文件中的新的一行被读入
直到文件处理完备
如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以
便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行,这时可
以使用sed高级语法来满足用户需求。总的来说,sed高级命令可以分为以下3种功能
N、D、P:处理多行模式空间的问题
H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑

3.awk命令 – 文本和数据进行处理的编程语言

(1)命令格式

awk [参数] [文件]

(2)命令功能
awk命令是一种编程语言,用于在linux/unix下对文本和数据进行处理。而且它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。awk逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。
(3)awk命令的语法以及概述
awk 选项 ‘模式或条件 { 编辑指令 }’ 文件1 文件2 … //过滤并输出文件符合条件的内容

awk -f 脚本文件 文件1 文件2 … //从脚本中调用编辑指令,过滤并输出内容

*awk执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”和“||”;

也可以进行简单的数学运算,如+ 、-、、/、%、^分别表示加、减、乘、除、取余、乘方。**

awk从输入文件或者标准输入中读入信息,与sed一样,信息的读入也是逐行读取的。不同的是,awk命令将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录的一个字段。为了操作这些不同的字段(列),awk借用shell中类似于位置变量的方法,用$1、$2…$9顺序的表示不同列,$0表示整行。不同字段与不同字段可以通过指定的方式进行分隔,awk默认的分隔符是空格。awk命令允许使用“-F分隔符”的形式来指定分隔符。
(3)命令参数

参数功能说明
-F指定输入时用到的字段分隔符
-v自定义变量
-f从脚本中读取awk命令
-m对val值设置内在限制

(4)使用范例
例一:输出文件的全部内容
命令:

awk '{print}' file.txt或
awk '{print $0}' file.txt

输出:
在这里插入图片描述
awk命令的原理解释:

awk{print $0}’ file.txt

通过这个指令你将会见到file.txt文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定file.txt 作为输入文件。执行 awk 时,它依次对file.txt 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与执行 cat file.txt完全相同。现在,解释{ print }代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容.

例二:输出file.txt文件的第1~3行的内容:
命令:

awk 'NR==1,NR==3{print}' file.txt

输出:
在这里插入图片描述

例三:输出文件file的第三行和第五行的内容:
命令:

awk 'NR==3 || NR==5{print}' file.txt

输出:
在这里插入图片描述
例四:输出file文件的所有奇数行的内容
命令:

awk '(NR%2)==1 {print}' file.txt

输出:
在这里插入图片描述

例五:输出file文件的所有偶数行的内容
命令:

awk '(NR%2)==0 {print}' file.txt

输出:
在这里插入图片描述

例六:输出file文件以“root”开头的行
命令:

awk '/^root/{print}' file.txt

例七:输出以“am”结尾的行
命令:

awk '/nologin$/{print}' file.txt

输出:
在这里插入图片描述

例八:统计以/bin/bash结尾的行数
命令:

root@ubuntu:/home/ubuntu/Documents# awk 'BEGIN {x=0} ;/\/bin\/bash$/{x++};END {print x}' file.txt
4

例九:统计以空格分隔的文件段落数
命令:

root@ubuntu:/home/ubuntu/Documents# awk 'BEGIN{RS=""}; END{print NR}' file.txt
6

例十:输出每行中(以空格分隔)的第3个字段
命令:

awk '{print $3}' file.txt

输出:
在这里插入图片描述

例十一:调用“hostname”命令,并输出当前用户名
命令:

awk 'BEGIN { "hostname" | getline ; print $0}'

输出:
在这里插入图片描述
例十二:使用awk命令进行简单的数学运算
命令:

awk 'BEGIN{ a=9;b=8;print"(a + b)=",(a + b)}'
(a + b)= 17
awk 'BEGIN{ a=100;b=78;print"(a - b)=",(a - b)}'
(a - b)= 22
awk 'BEGIN{ a=80;b=5;print"(a / b)=",(a / b)}'
(a / b)= 16
awk 'BEGIN{ a=10;b=9;print"(a * b)=",(a * b)}'
(a × b)= 90

输出:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值