翼度科技»论坛 云主机 LINUX 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
@
目录

剑仙镇楼~ O(∩_∩)O

前言

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

正则表达式

三剑客一般会配合着正则表达式一起使用,为了更好的掌握三剑客,这里简单介绍下正则表达式的使用。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成。在搜索文本时,与要搜索的字符串进行匹配
举个栗子
  1. *.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、语法格式
  1. grep [参数选项] [匹配模式][查找得文件]
复制代码
上面说的匹配模式就是你需要找得东西,可以是普通文字符号,也可以是正则表达式。
3、参数说明
参数参数说明-A除了显示匹配内容行之外,还显示该行之的N行-B除了显示匹配内容行之外,还显示该行之的N行-C除了显示匹配内容行之外,还显示该行之前后的N行-c统计匹配的行数-e实现多个选项间的逻辑 or 关系-E支持扩展的正则表达式-i忽略大小写-n显示匹配行和行号-o仅显示匹配到的字符串-q不输出任何信息,脚本中常用-v显示不被匹配到的行或者说排除某些行-w显示匹配整个单词--color为grep过滤的匹配字符串添加颜色,以突出显示4、实践操作
后面的示例都是以操作下面文本为例
  1. # 下面是我们演示所使用的文本文件
  2. [root@xiezhr test]# cat xiezhr.txt
  3. 90后,毕业于某不知名本科院校,通信工程专业
  4. 目前从事IT类工作,工作生活于春城昆明
  5. 天天被各种奇葩业务折腾得死去活来,但依然保有对各项技术热忱得追求和美好生活得向往
  6. 个人公众号:XiezhrSpace
  7. 个人博客:www.xiezhrspace.cn
  8. 个人微信号:xie_zhr
  9. 把分享变成一种习惯,再小的帆也能远航
  10. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
  11. 欢迎您的关注!
复制代码
① 把包含字符串xiezhr的行过滤出来
  1. [root@xiezhr test]# grep "xiezhr" xiezhr.txt
  2. 个人博客:www.xiezhrspace.cn
  3. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
复制代码
② 把以“个人”开头的行过滤出来或者把cn结尾的行过滤出来
  1. [root@xiezhr test]# grep "^个人" xiezhr.txt
  2. 个人公众号:XiezhrSpace
  3. 个人博客:www.xiezhrspace.cn
  4. 个人微信号:xie_zhr
  5. [root@xiezhr test]# grep "cn$" xiezhr.txt
  6. 个人博客:www.xiezhrspace.cn
复制代码
③把匹配xie_zhr 的行及边的两行显示出来
  1. [root@xiezhr test]# grep -A2 "xie_zhr" xiezhr.txt
  2. 个人微信号:xie_zhr
  3. 把分享变成一种习惯,再小的帆也能远航
  4. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
复制代码
④把匹配xie_zhr 的行及边的两行显示出来
  1. [root@xiezhr test]# grep -B2 "xie_zhr" xiezhr.txt
  2. 个人公众号:XiezhrSpace
  3. 个人博客:www.xiezhrspace.cn
  4. 个人微信号:xie_zhr
复制代码
⑤把匹配xie_zhr 的行及前后的两行显示出来
  1. [root@xiezhr test]# grep -C2 "xie_zhr" xiezhr.txt
  2. 个人公众号:XiezhrSpace
  3. 个人博客:www.xiezhrspace.cn
  4. 个人微信号:xie_zhr
  5. 把分享变成一种习惯,再小的帆也能远航
  6. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
复制代码
⑥ 过滤某个关键字,并显示行号
  1. [root@xiezhr test]# grep -n "xie_zhr" xiezhr.txt
  2. 6:个人微信号:xie_zhr
复制代码
⑦  过滤不包含某关键词,并输出行号
  1. [root@xiezhr test]# grep -n -v "xie_zhr" xiezhr.txt
  2. 1:90后,毕业于某不知名本科院校,通信工程专业
  3. 2:目前从事IT类工作,工作生活于春城昆明
  4. 3:天天被各种奇葩业务折腾得死去活来,但依然保有对各项技术热忱得追求和美好生活得向往
  5. 4:个人公众号:XiezhrSpace
  6. 5:个人博客:www.xiezhrspace.cn
  7. 7:把分享变成一种习惯,再小的帆也能远航
  8. 8:头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
  9. 9:欢迎您的关注!
复制代码
⑧删除掉空行、和注释行

  • "|" 表示或
  • “^$” 表示空行
  • “#”表示注释符号
  1. [root@xiezhr test]# grep -Ev "^$|#" xiezhr.txt
复制代码
⑨ 同时过滤多个不同字符串,并为过滤的内容添加颜色突出显示
  1. [root@xiezhr test]# grep -e "xie" -e "cn" --color=auto xiezhr.txt
  2. 个人博客:www.xiezhrspace.cn
  3. 个人微信号:xie_zhr
  4. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
  5. ## 上面等同于
  6. [root@xiezhr test]# grep -E "xie|cn"  --color=auto xiezhr.txt
  7. 个人博客:www.xiezhrspace.cn
  8. 个人微信号:xie_zhr
  9. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
复制代码
⑩ 过滤字符串xiezhr 不区分大小写
  1. [root@xiezhr test]# grep -i "xiezhr" xiezhr.txt
  2. 个人公众号:XiezhrSpace
  3. 个人博客:www.xiezhrspace.cn
  4. 头像连接:https://gitee.com/xiezhr/image-learn-bed/raw/master/image/avatar.jpg
复制代码
⑪ 计算匹配字符串的数量
  1. [root@xiezhr test]# grep -c "xie" xiezhr.txt
  2. 3
复制代码
第二剑客 sed

1、简介
sed 是 stream editor 的缩写,简称流编辑器。
是操作、转换和过滤文本内容的强大工具。可以快速对文本进行增删改查,过滤(过滤指定字符串)、取行(取出指定行)是查询功能中最常用的。
2、语法格式
  1. 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内置命令字符aappend,表示追加文本,在指定行后添加一行或多行文本ddelete,表示删除匹配行文本iinsert,表示插入文本,在指定行前添加一行或多行文本pprint,表示打印匹配行的内容,通常与-n参数一起使用s/regexp/replacestrreplace ,表示可以用replacestr(可以是特殊字符&、$等)字符串,替换正则表达式regexp所匹配的内容4、实践操作
这个是我们要操作的文本哈
  1. [root@xiezhr test]# cat file.txt
  2. blog:www.xiezhrspace.cn
  3. email:1666397814@qq.com
  4. QQ:2544458199
  5. img:/xiezhr.png
  6. age:18
  7. professional:Software engineer
复制代码
① 替换子命令s
基本用法
  1. # 1.将文本中"xiezhrspace"字符串替换成“xiezhr”
  2. [root@xiezhr test]# sed 's/xiezhrspace/xiezhr/' file.txt
  3. blog:www.xiezhr.cn
  4. email:1666397814@qq.com
  5. QQ:2544458199
  6. img:/xiezhr.png
  7. age:18
  8. professional:Software engineer
  9. # 2 在每行行首加上“#”
  10. [root@xiezhr test]# sed 's/^/#/g' file.txt
  11. #blog:www.xiezhrspace.cn
  12. #email:1666397814@qq.com
  13. #QQ:2544458199
  14. #img:/xiezhr.png
  15. #age:18
  16. #professional:Software engineer
  17. # 3.在每行行尾加上“*”
  18. [root@xiezhr test]# sed 's/$/ */g' file.txt
  19. blog:www.xiezhrspace.cn  *
  20. email:1666397814@qq.com *
  21. QQ:2544458199 *
  22. img:/xiezhr.png *
  23. age:18 *
  24. professional:Software engineer *
复制代码
带正则表达式的使用
  1. # 将所有的数字替换成“*”
  2. [root@xiezhr test]# sed 's/[0-9]/*/g' file.txt
  3. blog:www.xiezhrspace.cn
  4. email:**********@qq.com
  5. QQ:**********
  6. img:/xiezhr.png
  7. age:**
  8. professional:Software engineer
复制代码
多个匹配
  1. # 将1-3行 1替换成2;3到结尾行数字替换成“*”
  2. [root@xiezhr test]# sed '1,3s/1/2/g; 3,$s/[0-9]/*/g' file.txt
  3. blog:www.xiezhrspace.cn
  4. email:2666397824@qq.com
  5. QQ:**********
  6. img:/xiezhr.png
  7. age:**
  8. professional:Software engineer
复制代码
其他用法
  1. # 将替换后的内容写入到新的文件中
  2. [root@xiezhr test]# sed 's/QQ/qq/w file1.txt' file.txt
  3. blog:www.xiezhrspace.cn
  4. email:1666397814@qq.com
  5. qq:2544458199
  6. img:/xiezhr.png
  7. age:18
  8. professional:Software engineer
  9. [root@xiezhr test]# cat file1.txt
  10. qq:2544458199
复制代码
**注意: sed 修改匹配到的内容后,默认行为是不保存到原文件,直接输出修改后模式空间的内容,如果要修改原文件需要指定 -i 选项 **
② 追加行子命令a
  1. # 1.将所有行下面都追加“-----------------------------------”
  2. [root@xiezhr test]# sed 'a -----------------------------------' file.txt
  3. blog:www.xiezhrspace.cn
  4. -----------------------------------
  5. email:1666397814@qq.com
  6. -----------------------------------
  7. QQ:2544458199
  8. -----------------------------------
  9. img:/xiezhr.png
  10. -----------------------------------
  11. age:18
  12. -----------------------------------
  13. professional:Software engineer
  14. -----------------------------------
  15. # 2.将1-2 行后面追加一行“************************************”
  16. [root@xiezhr test]# sed '1,2a ******************************' file.txt
  17. blog:www.xiezhrspace.cn
  18. ******************************
  19. email:1666397814@qq.com
  20. ******************************
  21. QQ:2544458199
  22. img:/xiezhr.png
  23. age:18
  24. professional:Software engineer
复制代码
③ 插入行子命令i
  1. # 在1-2行前面插入一行“******************************”
  2. [root@xiezhr test]# sed '1,2i ******************************' file.txt
  3. ******************************
  4. blog:www.xiezhrspace.cn
  5. ******************************
  6. email:1666397814@qq.com
  7. QQ:2544458199
  8. img:/xiezhr.png
  9. age:18
  10. professional:Software engineer
复制代码
④ 删除行子命令d
  1. #1.将文中1-2行删除
  2. [root@xiezhr test]# sed '1,2d' file.txt
  3. QQ:2544458199
  4. img:/xiezhr.png
  5. age:18
  6. professional:Software engineer
  7. #2.删除文件中所有的数字
  8. [root@xiezhr test]# sed 's/[0-9]//g' file.txt
  9. blog:www.xiezhrspace.cn
  10. email:@qq.com
  11. QQ:
  12. img:/xiezhr.png
  13. age:
  14. professional:Software engineer
  15. # 3.删除所有空白行
  16. [root@xiezhr test]# sed '/^$/d' file.txt
  17. blog:www.xiezhrspace.cn
  18. email:1666397814@qq.com
  19. QQ:2544458199
  20. img:/xiezhr.png
  21. age:18
  22. professional:Software engineer
复制代码
⑥ 打印指定行子命令
  1. # 打印file 第二行内容(这里如果不加参数“-n”的话,打印出来的不仅仅是第二行,这个是为什么呢? 这是因为sed有个默认输出功能,我们需要把默认输出取消掉,所以带上了-n参数)
  2. # -n p 可以理解为一队cp,p出现了一般都会用-n参数
  3. [root@xiezhr test]# sed -n '2p' file.txt
  4. email:1666397814@qq.com
  5. # 打印2-3行内容
  6. [root@xiezhr test]# sed -n '2,3p' file.txt
  7. email:1666397814@qq.com
  8. QQ:2544458199
复制代码
第三 剑客 awk

1、简介
awk 是Linux中最强大的工具,没有之一哈(●'◡'●)。本来不想说的,怕吓到你。其实awk 还是一种编程语言哦。
awk可以用来处理数据和生成报告,处理的数据可以是一个或多个文件。
那么,awk具体能干些啥呢?
序号功能1能够将给定的文本内容,按照我们期望的格式输出,打印成报表2分析系统日志,快速分析挖掘出我们关心的数据,并生成统计信息3很方便的统计数据,常用于网站访问量、访问IP统计等4参与数组计算与去重5显示出某个范围内的内容2、语法格式
  1. grep [参数选项] [条件动作][文件]
复制代码
3、工作原理
为了能更好的掌握awk这一剑法,我们有必要了解下其原理。

结合上图,执行流程如下

  • 首先 ,执行关键字BEGIN块的内容,即BEGIN后花括号{}里的命令;
  • 完成 BEGIN 块的执行,开始执行BODY块
  • 逐行读取数据,默认读到 \n 分割的内容为一条 记录,也就是所谓的
  • 记录按照指定的分隔符划分为 字段,也就是$0 则表示所有域(即一行内容),\(1** 表示第一列,**\)n 表示第 n 列;
  • 循环执行BODY块中的命令,每读取一行,执行一次BODY块命令,直到数据的最后一行处理完为止;
  • 最后执行END块命令,END块一般输出最终结果
BEGIN(开始块)
语法格式
  1. BEGIN {awk-commands}
复制代码
开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只**执行一次 **
一般情况下,我们会在开始块中 **初始化一些变量 **;
注: 开始块部分是可选的,可以有也可以没有。BEGIN是关键字,必须要大写
BODY(主体块)
语法格式
  1. /pattern/ {awk-commands}
复制代码
每一个输入的行都会执行一次主体部分的命令
注: 在主体块部分没有关键字存在
END(结束块)
语法格式
  1. 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语言,那么这个你应该很熟悉了)
  1. 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 文本来操作的,内容如下
  1. [root@xiezhr test]# cat myfile.txt
  2. -rw-r--r-- 1 root   root     44 Mar 26 14:43 a1.txt
  3. -rw-r--r-- 1 root   root     65 Mar 26 14:56 a2.txt
  4. -rw-r--r-- 1 root   xiezhr   92 Mar 26 15:00 a.txt
  5. -rwxr-xr-x 1 xiezhr xiezhr    0 Mar 14 22:37 c.txt
  6. drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
  7. -rw-r--r-- 1 root   root      0 Mar 17 23:03 dir2
  8. drwxr-xr-x 2 root   xiezhr 4096 Mar 17 23:03 dir3
  9. drwxr-xr-x 2 root   root   4096 Mar 18 20:48 dir5
  10. drwxr-xr-x 2 root   root   4096 Mar 18 21:18 dir6
  11. drwxr-xr-x 2 root   root   4096 Mar 13 15:27 dir_bak
  12. -rw-r--r-- 1 root   root     14 Apr  9 11:23 file1.txt
  13. -rw-r--r-- 1 root   root    117 Apr  9 11:04 file.txt
  14. -rw-r--r-- 1 root   root    132 Mar 17 00:18 movie.tar.gz
  15. -rw-r--r-- 1 root   root     15 Mar 26 10:41 m.tx
  16. -rw-r--r-- 1 root   root      0 Apr 17 10:27 myfile.txt
  17. -rw-r--r-- 1 root   root    192 Mar 26 14:28 test1.txt
  18. -rw-r--r-- 1 root   root      6 Mar 26 10:05 test2.txt
  19. -rw-r--r-- 1 root   root     10 Mar 26 10:24 test3.txt
  20. -rw-r--r-- 1 root   root     44 Mar 17 22:27 test.txt
  21. -rw-r--r-- 1 root   root      0 Mar 11 22:52 tt.txt
  22. -rw-r--r-- 1 root   root     31 Mar 26 21:08 xaa
  23. -rw-r--r-- 1 root   root     45 Mar 26 21:08 xab
  24. -rw-r--r-- 1 root   root     16 Mar 26 21:08 xac
  25. -rw-r--r-- 1 root   root    527 Apr  9 10:55 xiezhr.txt
复制代码
① 显示文件中第3行
  1. [root@xiezhr test]# awk 'NR==3' myfile.txt
  2. -rw-r--r-- 1 root   xiezhr   92 Mar 26 15:00 a.txt
复制代码
NR在上面已经提到过了,表示行号。NR==3 表示第三行。==表示等于,=表示赋值,这里别写错了哈。
② 显示3到5行
  1. [root@xiezhr test]# awk 'NR==3,NR==5' myfile.txt
  2. -rw-r--r-- 1 root   xiezhr   92 Mar 26 15:00 a.txt
  3. -rwxr-xr-x 1 xiezhr xiezhr    0 Mar 14 22:37 c.txt
  4. drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
复制代码
③ 显示输出文件中的1、3、5 列
  1. [root@xiezhr test]# awk '{print $1,$3,$5}' myfile.txt
  2. -rw-r--r-- root 44
  3. -rw-r--r-- root 65
  4. -rw-r--r-- root 92
  5. -rwxr-xr-x xiezhr 0
  6. drwxr-xr-x xiezhr 4096
  7. -rw-r--r-- root 0
  8. drwxr-xr-x root 4096
  9. drwxr-xr-x root 4096
  10. drwxr-xr-x root 4096
  11. drwxr-xr-x root 4096
  12. -rw-r--r-- root 14
  13. -rw-r--r-- root 117
  14. -rw-r--r-- root 132
  15. -rw-r--r-- root 15
  16. -rw-r--r-- root 0
  17. -rw-r--r-- root 192
  18. -rw-r--r-- root 6
  19. -rw-r--r-- root 10
  20. -rw-r--r-- root 44
  21. -rw-r--r-- root 0
  22. -rw-r--r-- root 31
  23. -rw-r--r-- root 45
  24. -rw-r--r-- root 16
  25. -rw-r--r-- root 527
复制代码
还有一种写法,这次我们来打印1、3和最后一列(之所以要打印最后一列,是因为我们要引入新的知识点O(∩_∩)O)
  1. [root@xiezhr test]# awk -F " " '{print $1,$2,$NF}' myfile.txt
  2. -rw-r--r-- 1 a1.txt
  3. -rw-r--r-- 1 a2.txt
  4. -rw-r--r-- 1 a.txt
  5. -rwxr-xr-x 1 c.txt
  6. drwxr-xr-x 2 dir
  7. -rw-r--r-- 1 dir2
  8. drwxr-xr-x 2 dir3
  9. drwxr-xr-x 2 dir5
  10. drwxr-xr-x 2 dir6
  11. drwxr-xr-x 2 dir_bak
  12. -rw-r--r-- 1 file1.txt
  13. -rw-r--r-- 1 file.txt
  14. -rw-r--r-- 1 movie.tar.gz
  15. -rw-r--r-- 1 m.tx
  16. -rw-r--r-- 1 myfile.txt
  17. -rw-r--r-- 1 test1.txt
  18. -rw-r--r-- 1 test2.txt
  19. -rw-r--r-- 1 test3.txt
  20. -rw-r--r-- 1 test.txt
  21. -rw-r--r-- 1 tt.txt
  22. -rw-r--r-- 1 xaa
  23. -rw-r--r-- 1 xab
  24. -rw-r--r-- 1 xac
  25. -rw-r--r-- 1 xiezhr.txt
复制代码

  • -F 指定分隔符,F要是大写哦
  • NF表示最后一列,$1 表示第一列,$2 表示第二列,$3表示第三列.......依次类推,但是$0表示一整行
④格式输出我们想要的内容。
  1. [root@xiezhr test]# awk '{printf "%-4s,%-2s,%-4s\n",$1,$3,$5}' myfile.txt
  2. -rw-r--r--,root,44  
  3. -rw-r--r--,root,65  
  4. -rw-r--r--,root,92  
  5. -rwxr-xr-x,xiezhr,0   
  6. drwxr-xr-x,xiezhr,4096
  7. -rw-r--r--,root,0   
  8. drwxr-xr-x,root,4096
  9. drwxr-xr-x,root,4096
  10. drwxr-xr-x,root,4096
  11. drwxr-xr-x,root,4096
  12. ...
复制代码

  • 学过C语言的你可能已经发现了,这里的格式输出跟C语言中printf用法是一样的
  • %s 表示占位符
  • -4 表示列宽为4,且左对齐
⑤ 过滤出第四列是xiezhr,第七列是17的记录
  1. [root@xiezhr test]# awk '$4=="xiezhr" && $7==17 {print $0}' myfile.txt
  2. drwxr-xr-x 2 root   xiezhr 4096 Mar 17 23:03 dir3
复制代码
⑥ 指定"|"分隔符,并打印出来
  1. [root@xiezhr test]# awk '{print $1,"|",$3}' myfile.txt
  2. -rw-r--r-- | root
  3. -rw-r--r-- | root
  4. -rw-r--r-- | root
  5. -rwxr-xr-x | xiezhr
  6. drwxr-xr-x | xiezhr
  7. -rw-r--r-- | root
  8. drwxr-xr-x | root
  9. drwxr-xr-x | root
  10. drwxr-xr-x | root
  11. drwxr-xr-x | root
  12. -rw-r--r-- | root
  13. -rw-r--r-- | root
  14. -rw-r--r-- | root
  15. -rw-r--r-- | root
  16. -rw-r--r-- | root
  17. -rw-r--r-- | root
  18. -rw-r--r-- | root
  19. -rw-r--r-- | root
  20. -rw-r--r-- | root
  21. -rw-r--r-- | root
  22. -rw-r--r-- | root
  23. -rw-r--r-- | root
  24. -rw-r--r-- | root
  25. -rw-r--r-- | root
复制代码
⑦ 条件(正则表达式)匹配(过滤出xiezhr用户的所有文件,以及最后一行)
  1. [root@xiezhr test]# awk '$3 ~/xiezhr/ || NR==NF {print NR,$0}' myfile.txt
  2. 4 -rwxr-xr-x 1 xiezhr xiezhr    0 Mar 14 22:37 c.txt
  3. 5 drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
  4. 9 drwxr-xr-x 2 root   root   4096 Mar 18 21:18 dir6
复制代码
gsub替换内容(我们把文件中的-rw-r--r-- 替换成xiezhrspace)
  1. [root@xiezhr test]# awk '{gsub("-rw-r--r--","xiezhrspace",$0);print $0}' myfile.txt
  2. xiezhrspace 1 root   root     44 Mar 26 14:43 a1.txt
  3. xiezhrspace 1 root   root     65 Mar 26 14:56 a2.txt
  4. xiezhrspace 1 root   xiezhr   92 Mar 26 15:00 a.txt
  5. -rwxr-xr-x 1 xiezhr xiezhr    0 Mar 14 22:37 c.txt
  6. drwxr-xr-x 2 xiezhr xiezhr 4096 Mar 26 21:46 dir
  7. xiezhrspace 1 root   root      0 Mar 17 23:03 dir2
  8. drwxr-xr-x 2 root   xiezhr 4096 Mar 17 23:03 dir3
  9. drwxr-xr-x 2 root   root   4096 Mar 18 20:48 dir5
  10. drwxr-xr-x 2 root   root   4096 Mar 18 21:18 dir6
  11. drwxr-xr-x 2 root   root   4096 Mar 13 15:27 dir_bak
  12. xiezhrspace 1 root   root     14 Apr  9 11:23 file1.txt
  13. xiezhrspace 1 root   root    117 Apr  9 11:04 file.txt
  14. xiezhrspace 1 root   root    132 Mar 17 00:18 movie.tar.gz
  15. xiezhrspace 1 root   root     15 Mar 26 10:41 m.tx
  16. xiezhrspace 1 root   root      0 Apr 17 10:27 myfile.txt
  17. xiezhrspace 1 root   root    192 Mar 26 14:28 test1.txt
  18. xiezhrspace 1 root   root      6 Mar 26 10:05 test2.txt
  19. xiezhrspace 1 root   root     10 Mar 26 10:24 test3.txt
  20. xiezhrspace 1 root   root     44 Mar 17 22:27 test.txt
  21. xiezhrspace 1 root   root      0 Mar 11 22:52 tt.txt
  22. xiezhrspace 1 root   root     31 Mar 26 21:08 xaa
  23. xiezhrspace 1 root   root     45 Mar 26 21:08 xab
  24. xiezhrspace 1 root   root     16 Mar 26 21:08 xac
  25. xiezhrspace 1 root   root    527 Apr  9 10:55 xiezhr.txt
复制代码

  • 这里用了akw 的查找替换功能,即gsub函数,gsub在上面已经具体说过了,如果忘记了可以返回去看看

⑨ if语句(前面说过awk还是一种编程语言,可能你也是半信半疑的,这里就来演示一下awk的if语句,让你见识一下,
来源:https://www.cnblogs.com/xiezhr/p/17343228.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具