快速上手Linux核心命令(五):文本处理三剑客
@
剑仙镇楼~ O(∩_∩)O
前言
上一篇中已经预告,我们这篇主要说Linux文本处理三剑客。他们分别是grep、sed、awk 。既然能被业界称为三剑客,可见其在Linux命令中占有举足轻重得地位。所以呢,这里也专门写一篇文章说一说其用法。
正则表达式
三剑客一般会配合着正则表达式一起使用,为了更好的掌握三剑客,这里简单介绍下正则表达式的使用。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成。在搜索文本时,与要搜索的字符串进行匹配
举个栗子
*.txt # 表示任意以.txt结尾的文件
这里就不列出所有的了,我们只把常用的拿出来
1、特殊字符
注:如果需要匹配一下字符,需要在字符前加\进行转义
特殊字符 | 特殊字符说明 | 例子 |
---|---|---|
\(** | 匹配字符串的结尾位置 | **x\)匹配以"x"结尾的字符串 | ||
^ | 匹配字符串的开头位置 | ^abc 匹配以"abc"开头的字符串 |
. | 匹配任意一个字符,除了换行符外 | |
***** | 匹配前面的0次或多次的子表达式 | |
+ | 匹配前面字符有 1 个或多个 | |
.* | 匹配任意一个字符有 0 个或多个,也就是能匹配任意的字符 | |
{} | 匹配前面字符的数量范围 | {2}表示重复两次,{2,}表示至少重复两次,{2-4} 重复2-4次 |
[] | 括号中可以包含表示字符集的表达式 | [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cgsing2y-1650173645257)(快速上手Linux核心命令(五):文本处理三剑客/1649470939258a-z-1649470958893.png)] |
2、非打印字符
字符 | 字符说明 |
---|---|
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\s | 配任何空白字符,包括空格、制表符、换页符 |
\S | 匹配任何非空白字符 |
第一剑客 grep
1、简介
grep:文本过滤工具。 用于查找文件里符合条件的字符串,一般配合正则表达式一起使用。
grep 只支持匹配而不能替换匹配的内容,替换的功能可以由 sed 来完成。
2、语法格式
grep [参数选项] [匹配模式][查找得文件]
上面说的匹配模式就是你需要找得东西,可以是普通文字符号,也可以是正则表达式。
3、参数说明
参数 | 参数说明 |
---|---|
-A | 除了显示匹配内容行之外,还显示该行之后的N行 |
-B | 除了显示匹配内容行之外,还显示该行之前的N行 |
-C | 除了显示匹配内容行之外,还显示该行之前后的N行 |
-c | 统计匹配的行数 |
-e | 实现多个选项间的逻辑 or 关系 |
-E | 支持扩展的正则表达式 |
-i | 忽略大小写 |
-n | 显示匹配行和行号 |
-o | 仅显示匹配到的字符串 |
-q | 不输出任何信息,脚本中常用 |
-v | 显示不被匹配到的行或者说排除某些行 |
-w | 显示匹配整个单词 |
--color | 为grep过滤的匹配字符串添加颜色,以突出显示 |
4、实践操作
后面的示例都是以操作下面文本为例
# 下面是我们演示所使用的文本文件
[root@xiezhr test]# cat xiezhr.txt
90后,毕业于某不知名本科院校,通信工程专业
目前从事IT类工作,工作生活于春城昆明
天天被各种奇葩业务折腾得死去活来,但依然保有对各项技术热忱得追求和美好生活得向往
个人公众号:XiezhrSpace
个人博客:www.xiezhrspace.cn
个人微信号:xie_zhr
把分享变成一种习惯,再小的帆也能远航
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
欢迎您的关注!
① 把包含字符串xiezhr的行过滤出来
[root@xiezhr test]# grep "xiezhr" xiezhr.txt
个人博客:www.xiezhrspace.cn
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
② 把以“个人”开头的行过滤出来或者把cn结尾的行过滤出来
[root@xiezhr test]# grep "^个人" xiezhr.txt
个人公众号:XiezhrSpace
个人博客:www.xiezhrspace.cn
个人微信号:xie_zhr
[root@xiezhr test]# grep "cn$" xiezhr.txt
个人博客:www.xiezhrspace.cn
③把匹配xie_zhr 的行及后边的两行显示出来
[root@xiezhr test]# grep -A2 "xie_zhr" xiezhr.txt
个人微信号:xie_zhr
把分享变成一种习惯,再小的帆也能远航
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
④把匹配xie_zhr 的行及前边的两行显示出来
[root@xiezhr test]# grep -B2 "xie_zhr" xiezhr.txt
个人公众号:XiezhrSpace
个人博客:www.xiezhrspace.cn
个人微信号:xie_zhr
⑤把匹配xie_zhr 的行及前后的两行显示出来
[root@xiezhr test]# grep -C2 "xie_zhr" xiezhr.txt
个人公众号:XiezhrSpace
个人博客:www.xiezhrspace.cn
个人微信号:xie_zhr
把分享变成一种习惯,再小的帆也能远航
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
⑥ 过滤某个关键字,并显示行号
[root@xiezhr test]# grep -n "xie_zhr" xiezhr.txt
6:个人微信号:xie_zhr
⑦ 过滤不包含某关键词,并输出行号
[root@xiezhr test]# grep -n -v "xie_zhr" xiezhr.txt
1:90后,毕业于某不知名本科院校,通信工程专业
2:目前从事IT类工作,工作生活于春城昆明
3:天天被各种奇葩业务折腾得死去活来,但依然保有对各项技术热忱得追求和美好生活得向往
4:个人公众号:XiezhrSpace
5:个人博客:www.xiezhrspace.cn
7:把分享变成一种习惯,再小的帆也能远航
8:头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
9:欢迎您的关注!
⑧删除掉空行、和注释行
- "|" 表示或
- “^$” 表示空行
- “#”表示注释符号
[root@xiezhr test]# grep -Ev "^$|#" xiezhr.txt
⑨ 同时过滤多个不同字符串,并为过滤的内容添加颜色突出显示
[root@xiezhr test]# grep -e "xie" -e "cn" --color=auto xiezhr.txt
个人博客:www.xiezhrspace.cn
个人微信号:xie_zhr
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
## 上面等同于
[root@xiezhr test]# grep -E "xie|cn" --color=auto xiezhr.txt
个人博客:www.xiezhrspace.cn
个人微信号:xie_zhr
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
⑩ 过滤字符串xiezhr 不区分大小写
[root@xiezhr test]# grep -i "xiezhr" xiezhr.txt
个人公众号:XiezhrSpace
个人博客:www.xiezhrspace.cn
头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
⑪ 计算匹配字符串的数量
[root@xiezhr test]# grep -c "xie" xiezhr.txt
3
第二剑客 sed
1、简介
sed 是 stream editor 的缩写,简称流编辑器。
是操作、转换和过滤文本内容的强大工具。可以快速对文本进行增删改查,过滤(过滤指定字符串)、取行(取出指定行)是查询功能中最常用的。
2、语法格式
sed [参数选项] [sed内置命令字符][输入文件]
- sed内置命令字符:可以是单个命令,也可以是多个命令参数的组合
- 输入文件:sed需要处理的文件,可选项,sed还可以从标准输入(如管道)中获取输入
3、工作原理
为了更好理解sed,这里说一说sed工作模式
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pF5tKJm0-1650173645258)(快速上手Linux核心命令(五):文本处理三剑客/16493443873561649344386938-1649344431717.png)]
4、参数说明
命令参数
参数 | 参数说明 |
---|---|
-n | 取消默认的sed输出,常与sed内置命令p连用 |
-i | 直接修改文件内容,而不是输出到终端。如果不使用-i参数,sed只是修改内存中的内容,不会影响磁盘上的实际文件 |
常用内置命令字符
解释说明 | sed内置命令字符 |
---|---|
a | append,表示追加文本,在指定行后添加一行或多行文本 |
d | delete,表示删除匹配行文本 |
i | insert,表示插入文本,在指定行前添加一行或多行文本 |
p | print,表示打印匹配行的内容,通常与-n参数一起使用 |
s/regexp/replacestr | replace ,表示可以用replacestr(可以是特殊字符&、$等)字符串,替换正则表达式regexp所匹配的内容 |
4、实践操作
这个是我们要操作的文本哈
[root@xiezhr test]# cat file.txt
blog:www.xiezhrspace.cn
email:1666397814@qq.com
QQ:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
① 替换子命令s
基本用法
# 1.将文本中"xiezhrspace"字符串替换成“xiezhr”
[root@xiezhr test]# sed 's/xiezhrspace/xiezhr/' file.txt
blog:www.xiezhr.cn
email:1666397814@qq.com
QQ:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
# 2 在每行行首加上“#”
[root@xiezhr test]# sed 's/^/#/g' file.txt
#blog:www.xiezhrspace.cn
#email:1666397814@qq.com
#QQ:2544458199
#img:/xiezhr.png
#age:18
#professional:Software engineer
# 3.在每行行尾加上“*”
[root@xiezhr test]# sed 's/$/ */g' file.txt
blog:www.xiezhrspace.cn *
email:1666397814@qq.com *
QQ:2544458199 *
img:/xiezhr.png *
age:18 *
professional:Software engineer *
带正则表达式的使用
# 将所有的数字替换成“*”
[root@xiezhr test]# sed 's/[0-9]/*/g' file.txt
blog:www.xiezhrspace.cn
email:**********@qq.com
QQ:**********
img:/xiezhr.png
age:**
professional:Software engineer
多个匹配
# 将1-3行 1替换成2;3到结尾行数字替换成“*”
[root@xiezhr test]# sed '1,3s/1/2/g; 3,$s/[0-9]/*/g' file.txt
blog:www.xiezhrspace.cn
email:2666397824@qq.com
QQ:**********
img:/xiezhr.png
age:**
professional:Software engineer
其他用法
# 将替换后的内容写入到新的文件中
[root@xiezhr test]# sed 's/QQ/qq/w file1.txt' file.txt
blog:www.xiezhrspace.cn
email:1666397814@qq.com
qq:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
[root@xiezhr test]# cat file1.txt
qq:2544458199
**注意: sed 修改匹配到的内容后,默认行为是不保存到原文件,直接输出修改后模式空间的内容,如果要修改原文件需要指定 -i
选项 **
② 追加行子命令a
# 1.将所有行下面都追加“-----------------------------------”
[root@xiezhr test]# sed 'a -----------------------------------' file.txt
blog:www.xiezhrspace.cn
-----------------------------------
email:1666397814@qq.com
-----------------------------------
QQ:2544458199
-----------------------------------
img:/xiezhr.png
-----------------------------------
age:18
-----------------------------------
professional:Software engineer
-----------------------------------
# 2.将1-2 行后面追加一行“************************************”
[root@xiezhr test]# sed '1,2a ******************************' file.txt
blog:www.xiezhrspace.cn
******************************
email:1666397814@qq.com
******************************
QQ:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
③ 插入行子命令i
# 在1-2行前面插入一行“******************************”
[root@xiezhr test]# sed '1,2i ******************************' file.txt
******************************
blog:www.xiezhrspace.cn
******************************
email:1666397814@qq.com
QQ:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
④ 删除行子命令d
#1.将文中1-2行删除
[root@xiezhr test]# sed '1,2d' file.txt
QQ:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
#2.删除文件中所有的数字
[root@xiezhr test]# sed 's/[0-9]//g' file.txt
blog:www.xiezhrspace.cn
email:@qq.com
QQ:
img:/xiezhr.png
age:
professional:Software engineer
# 3.删除所有空白行
[root@xiezhr test]# sed '/^$/d' file.txt
blog:www.xiezhrspace.cn
email:1666397814@qq.com
QQ:2544458199
img:/xiezhr.png
age:18
professional:Software engineer
⑥ 打印指定行子命令
# 打印file 第二行内容(这里如果不加参数“-n”的话,打印出来的不仅仅是第二行,这个是为什么呢? 这是因为sed有个默认输出功能,我们需要把默认输出取消掉,所以带上了-n参数)
# -n p 可以理解为一队cp,p出现了一般都会用-n参数
[root@xiezhr test]# sed -n '2p' file.txt
email:1666397814@qq.com
# 打印2-3行内容
[root@xiezhr test]# sed -n '2,3p' file.txt
email:1666397814@qq.com
QQ:2544458199
第三 剑客 awk
1、简介
awk 是Linux中最强大的工具,没有之一哈(●'◡'●)。本来不想说的,怕吓到你。其实awk 还是一种编程语言哦。
awk可以用来处理数据和生成报告,处理的数据可以是一个或多个文件。
那么,awk具体能干些啥呢?
序号 | 功能 |
---|---|
1 | 能够将给定的文本内容,按照我们期望的格式输出,打印成报表 |
2 | 分析系统日志,快速分析挖掘出我们关心的数据,并生成统计信息 |
3 | 很方便的统计数据,常用于网站访问量、访问IP统计等 |
4 | 参与数组计算与去重 |
5 | 显示出某个范围内的内容 |
2、语法格式
grep [参数选项] [条件动作][文件]
3、工作原理
为了能更好的掌握awk这一剑法,我们有必要了解下其原理。
结合上图,执行流程如下
- 首先 ,执行关键字BEGIN块的内容,即BEGIN后花括号{}里的命令;
- 完成 BEGIN 块的执行,开始执行BODY块;
- 逐行读取数据,默认读到 \n 分割的内容为一条 记录,也就是所谓的行;
- 将记录按照指定的分隔符划分为 字段,也就是列 ;$0 则表示所有域(即一行内容),\(1** 表示第一列,**\)n 表示第 n 列;
- 循环执行BODY块中的命令,每读取一行,执行一次BODY块命令,直到数据的最后一行处理完为止;
- 最后执行END块命令,END块一般输出最终结果
BEGIN(开始块)
语法格式
BEGIN {awk-commands}
开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只**执行一次 **
一般情况下,我们会在开始块中 **初始化一些变量 **;
注: 开始块部分是可选的,可以有也可以没有。BEGIN是关键字,必须要大写
BODY(主体块)
语法格式
/pattern/ {awk-commands}
每一个输入的行都会执行一次主体部分的命令
注: 在主体块部分没有关键字存在
END(结束块)
语法格式
END {awk-commands}
注:结束块是在程序结束时执行的代码。 END 也是 AWK 的关键字,它也必须大写。 与开始块相似,结束块也是可选的。
以上可以简单总结为:记录 (Record) 就是行,字段 (Field) 就是列,BEGIN
是预处理阶段,body
是 awk 真正工作的阶段,END
是最后处理阶段。
4、参数说明
参数 | 参数说明 |
---|---|
-F | 指定字段分隔符 |
-v | 定义或修改一个awk内部的变量 |
5、内置变量
每一行是一条记录(Record),通过分隔符分割的每一列是一个字段(Field)
NR
: 表示当前的行数;NF
: 表示当前的列数;RS
: 行分隔符,默认是换行;FS
: 列分隔符,默认是空格和制表符;OFS
: 输出列分隔符,用于打印时分割字段,默认为空格ORS
: 输出行分隔符,用于打印时分割记录,默认为换行符
6、常用函数
awk 内藏了大量功能强大且有用的函数,当然了,你也可以定义自己的函数
函数 | 函数功能 |
---|---|
gsub(r, s, t) |
指定的目标范围(t)内,用r替换s;t省略时,默认为$0作为参数,即整行文本 |
index(s, t) |
返回子串 t 在 s 中的位置 |
length(s) |
返回s的长度 |
split(s,a,fs) |
分割字符串,并将分割后的各字段存放在数组 a 中 |
substr(s, p, n) |
截取字符串。sub(r,s) 用$0中最左边最长的子串代替s;substr(s,p) 返回字符串s中从p开始到最后的字符串;substr(s,p,n) 返回字符串s中从p开始长度为n的字符串 |
tolower(s) |
将字符串s转换为小写 |
toupper(s) |
将字符串转换为大写 |
7、输出格式
awk 提供
printf
函数进行格式化输出功能
语法格式(如果你学过C语言,那么这个你应该很熟悉了)
printf("%12s,%02d,%0.2f\n",s,d,g);
常用的格式化方式:
%d
十进制有符号整数%u
十进制无符号整数%f
浮点数%s
字符串%c
单个字符%e
指数形式的浮点数%x
%X
无符号以十六进制表示的整数%0
无符号以八进制表示的整数%g
自动选择合适的表示法\n
换行符\t
Tab符
上面我们悄悄的提到awk也是一种编程语言,相信你还没有忘记吧。不信的话你回头看看(●'◡'●)
既然是编程语言,那么它肯定是支持 条件语句、循环语句、数组、函数等的
8、实践操作
光说不练假把式,上面说了这么多其用法。接下来我们就实际操练一番呗
以下操作都是基于myfile.txt 文本来操作的,内容如下
[root@xiezhr test]# cat myfile.txt
-rw-r--r-- 1 root root 44 Mar 26 14:43 a1.txt
-rw-r--r-- 1 root root 65 Mar 26 14:56 a2.txt
-rw-r--r-- 1 root xiezhr 92 Mar 26 15:00 a.txt
-rwxr-xr-x 1 xiezhr xiezhr 0 Mar 14 22:37 c.txt
drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
-rw-r--r-- 1 root root 0 Mar 17 23:03 dir2
drwxr-xr-x 2 root xiezhr 4096 Mar 17 23:03 dir3
drwxr-xr-x 2 root root 4096 Mar 18 20:48 dir5
drwxr-xr-x 2 root root 4096 Mar 18 21:18 dir6
drwxr-xr-x 2 root root 4096 Mar 13 15:27 dir_bak
-rw-r--r-- 1 root root 14 Apr 9 11:23 file1.txt
-rw-r--r-- 1 root root 117 Apr 9 11:04 file.txt
-rw-r--r-- 1 root root 132 Mar 17 00:18 movie.tar.gz
-rw-r--r-- 1 root root 15 Mar 26 10:41 m.tx
-rw-r--r-- 1 root root 0 Apr 17 10:27 myfile.txt
-rw-r--r-- 1 root root 192 Mar 26 14:28 test1.txt
-rw-r--r-- 1 root root 6 Mar 26 10:05 test2.txt
-rw-r--r-- 1 root root 10 Mar 26 10:24 test3.txt
-rw-r--r-- 1 root root 44 Mar 17 22:27 test.txt
-rw-r--r-- 1 root root 0 Mar 11 22:52 tt.txt
-rw-r--r-- 1 root root 31 Mar 26 21:08 xaa
-rw-r--r-- 1 root root 45 Mar 26 21:08 xab
-rw-r--r-- 1 root root 16 Mar 26 21:08 xac
-rw-r--r-- 1 root root 527 Apr 9 10:55 xiezhr.txt
① 显示文件中第3行
[root@xiezhr test]# awk 'NR==3' myfile.txt
-rw-r--r-- 1 root xiezhr 92 Mar 26 15:00 a.txt
NR在上面已经提到过了,表示行号。NR==3 表示第三行。==表示等于,=表示赋值,这里别写错了哈。
② 显示3到5行
[root@xiezhr test]# awk 'NR==3,NR==5' myfile.txt
-rw-r--r-- 1 root xiezhr 92 Mar 26 15:00 a.txt
-rwxr-xr-x 1 xiezhr xiezhr 0 Mar 14 22:37 c.txt
drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
③ 显示输出文件中的1、3、5 列
[root@xiezhr test]# awk '{print $1,$3,$5}' myfile.txt
-rw-r--r-- root 44
-rw-r--r-- root 65
-rw-r--r-- root 92
-rwxr-xr-x xiezhr 0
drwxr-xr-x xiezhr 4096
-rw-r--r-- root 0
drwxr-xr-x root 4096
drwxr-xr-x root 4096
drwxr-xr-x root 4096
drwxr-xr-x root 4096
-rw-r--r-- root 14
-rw-r--r-- root 117
-rw-r--r-- root 132
-rw-r--r-- root 15
-rw-r--r-- root 0
-rw-r--r-- root 192
-rw-r--r-- root 6
-rw-r--r-- root 10
-rw-r--r-- root 44
-rw-r--r-- root 0
-rw-r--r-- root 31
-rw-r--r-- root 45
-rw-r--r-- root 16
-rw-r--r-- root 527
还有一种写法,这次我们来打印1、3和最后一列(之所以要打印最后一列,是因为我们要引入新的知识点O(∩_∩)O)
[root@xiezhr test]# awk -F " " '{print $1,$2,$NF}' myfile.txt
-rw-r--r-- 1 a1.txt
-rw-r--r-- 1 a2.txt
-rw-r--r-- 1 a.txt
-rwxr-xr-x 1 c.txt
drwxr-xr-x 2 dir
-rw-r--r-- 1 dir2
drwxr-xr-x 2 dir3
drwxr-xr-x 2 dir5
drwxr-xr-x 2 dir6
drwxr-xr-x 2 dir_bak
-rw-r--r-- 1 file1.txt
-rw-r--r-- 1 file.txt
-rw-r--r-- 1 movie.tar.gz
-rw-r--r-- 1 m.tx
-rw-r--r-- 1 myfile.txt
-rw-r--r-- 1 test1.txt
-rw-r--r-- 1 test2.txt
-rw-r--r-- 1 test3.txt
-rw-r--r-- 1 test.txt
-rw-r--r-- 1 tt.txt
-rw-r--r-- 1 xaa
-rw-r--r-- 1 xab
-rw-r--r-- 1 xac
-rw-r--r-- 1 xiezhr.txt
- -F 指定分隔符,F要是大写哦
- NF表示最后一列,$1 表示第一列,$2 表示第二列,$3表示第三列.......依次类推,但是$0表示一整行
④格式输出我们想要的内容。
[root@xiezhr test]# awk '{printf "%-4s,%-2s,%-4s\n",$1,$3,$5}' myfile.txt
-rw-r--r--,root,44
-rw-r--r--,root,65
-rw-r--r--,root,92
-rwxr-xr-x,xiezhr,0
drwxr-xr-x,xiezhr,4096
-rw-r--r--,root,0
drwxr-xr-x,root,4096
drwxr-xr-x,root,4096
drwxr-xr-x,root,4096
drwxr-xr-x,root,4096
...
- 学过C语言的你可能已经发现了,这里的格式输出跟C语言中printf用法是一样的
- %s 表示占位符
- -4 表示列宽为4,且左对齐
⑤ 过滤出第四列是xiezhr,第七列是17的记录
[root@xiezhr test]# awk '$4=="xiezhr" && $7==17 {print $0}' myfile.txt
drwxr-xr-x 2 root xiezhr 4096 Mar 17 23:03 dir3
⑥ 指定"|"分隔符,并打印出来
[root@xiezhr test]# awk '{print $1,"|",$3}' myfile.txt
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rwxr-xr-x | xiezhr
drwxr-xr-x | xiezhr
-rw-r--r-- | root
drwxr-xr-x | root
drwxr-xr-x | root
drwxr-xr-x | root
drwxr-xr-x | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
-rw-r--r-- | root
⑦ 条件(正则表达式)匹配(过滤出xiezhr用户的所有文件,以及最后一行)
[root@xiezhr test]# awk '$3 ~/xiezhr/ || NR==NF {print NR,$0}' myfile.txt
4 -rwxr-xr-x 1 xiezhr xiezhr 0 Mar 14 22:37 c.txt
5 drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
9 drwxr-xr-x 2 root root 4096 Mar 18 21:18 dir6
⑧ gsub替换内容(我们把文件中的-rw-r--r-- 替换成xiezhrspace)
[root@xiezhr test]# awk '{gsub("-rw-r--r--","xiezhrspace",$0);print $0}' myfile.txt
xiezhrspace 1 root root 44 Mar 26 14:43 a1.txt
xiezhrspace 1 root root 65 Mar 26 14:56 a2.txt
xiezhrspace 1 root xiezhr 92 Mar 26 15:00 a.txt
-rwxr-xr-x 1 xiezhr xiezhr 0 Mar 14 22:37 c.txt
drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
xiezhrspace 1 root root 0 Mar 17 23:03 dir2
drwxr-xr-x 2 root xiezhr 4096 Mar 17 23:03 dir3
drwxr-xr-x 2 root root 4096 Mar 18 20:48 dir5
drwxr-xr-x 2 root root 4096 Mar 18 21:18 dir6
drwxr-xr-x 2 root root 4096 Mar 13 15:27 dir_bak
xiezhrspace 1 root root 14 Apr 9 11:23 file1.txt
xiezhrspace 1 root root 117 Apr 9 11:04 file.txt
xiezhrspace 1 root root 132 Mar 17 00:18 movie.tar.gz
xiezhrspace 1 root root 15 Mar 26 10:41 m.tx
xiezhrspace 1 root root 0 Apr 17 10:27 myfile.txt
xiezhrspace 1 root root 192 Mar 26 14:28 test1.txt
xiezhrspace 1 root root 6 Mar 26 10:05 test2.txt
xiezhrspace 1 root root 10 Mar 26 10:24 test3.txt
xiezhrspace 1 root root 44 Mar 17 22:27 test.txt
xiezhrspace 1 root root 0 Mar 11 22:52 tt.txt
xiezhrspace 1 root root 31 Mar 26 21:08 xaa
xiezhrspace 1 root root 45 Mar 26 21:08 xab
xiezhrspace 1 root root 16 Mar 26 21:08 xac
xiezhrspace 1 root root 527 Apr 9 10:55 xiezhr.txt
- 这里用了akw 的查找替换功能,即gsub函数,gsub在上面已经具体说过了,如果忘记了可以返回去看看
⑨ if语句(前面说过awk还是一种编程语言,可能你也是半信半疑的,这里就来演示一下awk的if语句,让你见识一下,😄)
[root@xiezhr test]# awk '{if($3=="root") print > "root.txt";else if($3=="xiezhr") print > "xiezhr1.txt";else print > "other.txt"}' myfile.txt
[root@xiezhr test]# cat root.txt
-rw-r--r-- 1 root root 44 Mar 26 14:43 a1.txt
-rw-r--r-- 1 root root 65 Mar 26 14:56 a2.txt
-rw-r--r-- 1 root xiezhr 92 Mar 26 15:00 a.txt
-rw-r--r-- 1 root root 0 Mar 17 23:03 dir2
drwxr-xr-x 2 root xiezhr 4096 Mar 17 23:03 dir3
drwxr-xr-x 2 root root 4096 Mar 18 20:48 dir5
drwxr-xr-x 2 root root 4096 Mar 18 21:18 dir6
drwxr-xr-x 2 root root 4096 Mar 13 15:27 dir_bak
-rw-r--r-- 1 root root 14 Apr 9 11:23 file1.txt
-rw-r--r-- 1 root root 117 Apr 9 11:04 file.txt
-rw-r--r-- 1 root root 132 Mar 17 00:18 movie.tar.gz
-rw-r--r-- 1 root root 15 Mar 26 10:41 m.tx
-rw-r--r-- 1 root root 0 Apr 17 10:27 myfile.txt
-rw-r--r-- 1 root root 192 Mar 26 14:28 test1.txt
-rw-r--r-- 1 root root 6 Mar 26 10:05 test2.txt
-rw-r--r-- 1 root root 10 Mar 26 10:24 test3.txt
-rw-r--r-- 1 root root 44 Mar 17 22:27 test.txt
-rw-r--r-- 1 root root 0 Mar 11 22:52 tt.txt
-rw-r--r-- 1 root root 31 Mar 26 21:08 xaa
-rw-r--r-- 1 root root 45 Mar 26 21:08 xab
-rw-r--r-- 1 root root 16 Mar 26 21:08 xac
-rw-r--r-- 1 root root 527 Apr 9 10:55 xiezhr.txt
[root@xiezhr test]# cat xiezhr1.txt
-rwxr-xr-x 1 xiezhr xiezhr 0 Mar 14 22:37 c.txt
drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
- 由于$3第三列只有"root" 和“xiezhr” 所以上述语句执行后生成了root.txt 和xiezhr1.txt 。other.txt 并没有生成
⑩ 统计 当前目录下.txt
和.tar.gz
文件占用的空间大小
[root@xiezhr test]# ls -l *.txt *.tar.gz | awk '{sum+=$5} END{print sum}'
3753
- 第 5 列表示文件大小,每读取一行就会将该文件大小计算到
sum
变量中 - 在最后
END
阶段打印出sum
,也就是所有文件的大小总和。
认真的你不知道有没有发现一个规律,上面的列子中用到print 都会带上{}。别问我为什么,因为我也不知道
可能是print比较怕见生人吧,所以带了一层面纱{}。O(∩_∩)O
小结
- grep 更适合单纯的查找或匹配文本
- sed 更适合编辑匹配到的文本
- awk 更适合格式化文本,对文本进行较复杂格式处理
到这里呢,Linux三剑客也说的差不多了。当然了,上面说的只是其中的部分用法,而且也比较简单。
如果你需要了解更多关于Linux三剑客的知识,可以查阅相关书籍哈,更多实用小技巧需要你自己去探索总结哦。
是不是发现少了什么?别找了,😄你要的剑仙在此
这期内容就到这,下期根据思维导图就到了vi、vim 文本编辑器的使用了。
敬请期待哦(●’◡’●)
专栏目录:快速上手Linux核心命令专栏目录