快速上手Linux核心命令(五):文本处理三剑客

前言

上一篇中已经预告,我们这篇主要说Linux文本处理三剑客。他们分别是grepsedawk 。既然能被业界称为三剑客,可见其在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这一剑法,我们有必要了解下其原理。

结合上图,执行流程如下

  1. 首先 ,执行关键字BEGIN块的内容,即BEGIN后花括号{}里的命令;
  2. 完成 BEGIN 块的执行,开始执行BODY块
  3. 逐行读取数据,默认读到 \n 分割的内容为一条 记录,也就是所谓的
  4. 记录按照指定的分隔符划分为 字段,也就是$0 则表示所有域(即一行内容),\(1** 表示第一列,**\)n 表示第 n 列;
  5. 循环执行BODY块中的命令,每读取一行,执行一次BODY块命令,直到数据的最后一行处理完为止;
  6. 最后执行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核心命令专栏目录

上一篇:快速上手Linux核心命令(四):文件内容相关命令

下一篇:快速上手Linux核心命令(六):Linux的文本编辑器vi和vim

posted @ 2023-04-25 21:39  程序员晓凡  阅读(322)  评论(0编辑  收藏  举报