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

科技资讯 投稿 7900 0 评论

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

目录
    前言
  • 正则表达式
  • 第一剑客 grep
  • 第二剑客 sed
  • 第三 剑客 awk
  • 小结

前言

三剑客。他们分别是grepsedawk 。既然能被业界称为三剑客,可见其在Linux命令中占有举足轻重得地位。所以呢,这里也专门写一篇文章说一说其用法。

正则表达式

简单介绍下正则表达式的使用。

举个栗子

*.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 只支持匹配而不能替换匹配的内容,替换的功能可以由 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、简介

stream editor 的缩写,简称流编辑器。

2、语法格式

sed [参数选项] [sed内置命令字符][输入文件]
    sed内置命令字符:可以是单个命令,也可以是多个命令参数的组合
  • 输入文件:sed需要处理的文件,可选项,sed还可以从标准输入(如管道)中获取输入

3、工作原理

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾

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可以用来处理数据和生成报告,处理的数据可以是一个或多个文件。

序号 功能
1 能够将给定的文本内容,按照我们期望的格式输出,打印成报表
2 分析系统日志,快速分析挖掘出我们关心的数据,并生成统计信息
3 很方便的统计数据,常用于网站访问量、访问IP统计等
4 参与数组计算与去重
5 显示出某个范围内的内容

2、语法格式

grep [参数选项] [条件动作][文件]

3、工作原理

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

函数 函数功能
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、输出格式

printf 函数进行格式化输出功能

printf("%12s,%02d,%0.2f\n",s,d,g;

常用的格式化方式:

    %d 十进制有符号整数
  • %u 十进制无符号整数
  • %f 浮点数
  • %s 字符串
  • %c 单个字符
  • %e 指数形式的浮点数
  • %x %X 无符号以十六进制表示的整数
  • %0 无符号以八进制表示的整数
  • %g 自动选择合适的表示法
  • \n 换行符
  • \t Tab符

既然是编程语言,那么它肯定是支持 条件语句、循环语句、数组、函数等的

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 表示第三行。==表示等于,=表示赋值,这里别写错了哈。

[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核心命令(四):文件内容相关命令

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

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

赞同 (45) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽