文章目录
Linux三剑客
Linux三剑客是grep、sed、awk三者的简称,熟练使用这三个工具程序可以提升工作效率,Linux三剑客是以正则表达式作为基础
三剑客特点及应用场景
命令 | 特点 | 场景 |
---|---|---|
grep | 过滤 | grep命令过滤文件速度是最快的 |
sed | 替换、修改文件内容 | 对文件内容进行替换、修改,进行范围性的查找 |
awk | 取列,统计计算 | 进行对比,比较(>、<、>= …);统计计算 |
grep
grep:命令全称为global regular expressions print,gerp命令能够在一个或多个文件中,搜索某一特定的字符模式(也就是正则表达式),此模式可以是单一的字符、字符串、单词或句子
grep命令的基本格式
grep [选项] 模式 文件名
选项:
-E:等同于egrep支持扩展正则表达式
-A:意为after,-A5 匹配内容并且显示接下来的5行
-B:意为before,-B5 匹配内容并且显示上面的5行
-c:列出文件中包含模式的行数,等同于wc -l
-v:列出没有匹配模式的行
-n:列出行号
-w:精准匹配,把表达式当做一个完整的单字符来搜寻
grep范例
grep命令范例文件emp.txt
101:China:Clack
102:American:Franklyn
103:England:Shelock
104:Canada:Henry
105:Russian:Wendy
106:Japan:Sukura
107:Korea:Irene
108:Germany:Bob
grep命令选项
-A、-B
-c、-v
![Linux三剑客grepcv](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211225/Linux三剑客grepcv.11dbvh36rf34.png)
-n、-w
![Linux三剑客grepnw](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211225/Linux三剑客grepnw.7czdoxlaetw.png)
grep的命令很强大,通过利用它的不同选项以及千变万化的正则表达式可以过滤出我们所需要的信息
sed
sed:命令全称为stream editor,流编辑器,主要用来过滤和替换文本
sed命令基本格式
sed [-nefr] [操作]
选项:
-n:只有经过sed处理的那一行内容才会别列出来,不加n默认显示所有内容
-e:直接到命令行模式上进行sed操作
-f:将sed操作写在一个文件内
-r:sed的操作使用的是扩展型正则表达式,默认为基础正则表达式
-i:直接修改文件内容而不是屏幕输出
操作说明:[n1,[n2] ] function
n1,n2:选择进行操作的行数
function选项:
c、a、i:新增字符
d:删除
p:打印,将选择的数据整个打印出来,以行号为单位
s:替换,可以直接进行替换工作,可以搭配使用正则表达式,以行号为单位
sed命令功能
sed本身是一个管道命令,可以将数据进行替换、删除、新增、选取等特定功能
功能 | 功能说明 |
---|---|
s | substitute替换 |
p | 显示print |
d | 删除delete |
cai | 增加 |
sed执行过程
sed命令:sed -n ‘3p’ emp.txt,输出结果为:
sed执行流程
sed流程解析
- sed程序执行sed命令:sed -n ‘3p’ emp.txt 进行处理
- sed为流编辑器,对文件emp.txt内容一行一行读入内存中进行处理,将读入内存的一行内容进行判断
- 判断是否为第三行内容,不是则判断是有选项n,有则直接处理下一行,没有则将内存中写入的文件的一行内容输出
- 若判断文件改行的内容为第三行,则进行sed命令的功能操作,该命令中为p则打印第三行内容
- 例子当中没有加n选项时,第三行内容输出了两遍,是因为没有n时为默认输出,则文件中中的内容全部输出,但是又因第三行满足命令所需,则又会输出一次
sed功能
查找
删除
增加cai
- c:replace替代这行的内容
- a:append,向指定的行或每一行追加内容
- i:insert,向指定的行或每一行插入内容
替换(重点)
替换格式:s###g,s///g,s@@@g
#、/、@任意特殊字符都可以都表示同一个意义,一般表示使用#、/,支持正则表达式
s:替换功能的表示
g:global,全局替换,sed默认只替换每一行匹配的内容,不加g只会进行匹配
sed的后向引用
awk
awk是一门语言,是一个比sed更加强大的文本数据处理工具,awk取自于3位大师的首字母即:Aho、Weinggerger、Kernighan;主要用于过滤统计日志和计算
awk执行流程
awk执行案例分析
- 在awk读取文件emp1.txt之前执行BEGIN{}中的print “Test action start”
- 然后awk读取文件时,判断文件读取行数是否满足条件NR==3(即行号为3),满足该条件则执行对应的工作print $2,打印该行数对应的第二列值为England
- 读取文件之后,执行END{}中的print “end of file”
awk的内置变量
内置变量 | |
---|---|
NR | Number of Record 记录号,行号 |
NF | Number of field 每行有多少字段,$NF表示最后列 |
FS | Field Separator 字段分隔符,每个字段结束标记 |
OFS | Output Field Separator 输出字段分隔符,awk显示每一列之间的分隔符 |
awk行与列
行与列 | 在awk中说明 | 补充说明 |
---|---|---|
行 | 记录record | 每一行默认通过回车分割 |
列 | 字段、域、field | 每一列默认是通过空格分割的 |
awk中的行与列的结束标志及分割标识是可以修改的
取行
awk表达式 | 意义 |
---|---|
NR==1 | 取出某一行 |
NR>=1&&NR<=5 | 取出1-5行范围 |
/word/ | 找到特定word |
/n1/,/n2/ | 找到指定范围 |
![Linux三剑客awk取行](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211225/Linux三剑客awk取行.1xl1ee4r5w00.png)
取列
awk参数-F,标识指定分隔符,即指定每一列结束符标记(默认为空格、连续的空格、tab制表符)
数 字 : 标 识 取 出 该 对 应 的 数 字 列 , 与 数字:标识取出该对应的数字列,与 数字:标识取出该对应的数字列,与内容是一个意思,数字为0时为整行的内容
awk模式匹配
awk | -F, | ‘NR==3{print $2}’ |
---|---|---|
命令 | 选项 | ‘模式,条件(动作)’ |
模式、条件可以分为:比较、正则、范围表达式、特殊条件(BEGIN、END)
比较
比较符号:>、<、>=、<=、==、!=
正则
- //:支持扩展正则
- awk可以精准到某一列,某一列中可以包含或不包含某个条件的内容
- ~:包含
- !~:不包含
一般正则 | awk正则 |
---|---|
^:表示以某个开头的行 | 某一列的开头 |
$:表示以某个结尾的行 | 某一列的结尾 |
^$:表示空行 | 某一列为空 |
表示范围
- /开始 /,/结束/,常用的用法
- NR == 1,NR==最后一行
![Linux三剑客awk表示范围](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211225/Linux三剑客awk表示范围.5zb78j45i7g0.png)
特殊模式
- BEGIN:在awk读取文件前打印信息
- END:在awk读取文件之后打印信息
awk数组
awk数组主要用于统计日志、统计次数、累计求和
- 统计日志
- 统计次数:如统计每个ip出现次数、每种状态码出现的次数
- 累计求和:每个ip消耗的流量
awk数组 | |
---|---|
形式 | array[0]=“hello” array[1]=“dance” |
使用 | print array[0] array[1] |
批量输出数组内容 | for(i in arrayname) print arrayname[i] awk数组专属循环,i获取的是数组的下标,数组内容为arrayname[i] |
if判断 | if(条件) print “some” else print “something else” |
awk字母会被识别成变量,如果使用字符串需要加上双引号
awk批量输出数组内容
总结
grep命令能够在一个或多个文件中,搜索某一特定的字符模式(也就是正则表达式),此模式可以是单一的字符、字符串、单词或句子;sed采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据;wk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理
赶紧学习起来吧!我是一个正在努力找回自我的人,希望能和一起学习的人成长,有错误的地方请各位大佬帮忙指正,如果觉得有帮助就点个赞当作对我的一个小肯定❤,peace&love