第五天:文本处理三剑客下grep 、sed 、awk

一、grep 对目标文本逐行进行匹配检查,打印匹配到的行

 

二、sed :  stream editor   文本编辑工具

1、sed为行编辑器,一行行读取,一行行输出。把当前处理的行存储在临时缓冲区:模式空间(pattern space)

  

 2、sed基本用法:   sed [option]...  'script'   [inputfilt]

  -n  不输出 模式空间内容到屏幕,即不自动打印

  -e  多点编辑

  -f  FILE     从指定文件中读取编辑脚本

  -r,-E  使用扩展正则表达式

  -i.bak  备份文件并原处编辑

  -s  将多个文件视为独立文件,而不是单个连续的长文件 流

  seq 10 | sed '1~2p'    间隔2输出

  

   

 3、sed高级用法

  sed中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能

  P  打印模式空间开端至\n 内容,并追加到默认输出之前

  h  把模式空间中的内容覆盖至保持空间中

  H  把模式空间中的内容追加到保持空间中

  g  从保持空间取出数据覆盖至模式空间

  G  从保持空间取出数据追加至模式空间

  x  把模式空间中的内容与保持空间中的内容进行互换

  n  读取匹配到的行的下一行覆盖至模式 空间

  N  读取匹配到的行的下一行追加至模式空间

  d  删除模式空间中的行

  D  如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环。

三、awk:实现gawk,文本报告生成器

1、报告生成顺,模式化文本输出

  https://www.gnu.org/software/gawk/manual/gawk.html

  https://man7.org/linux/man-pages/man1/awk.1p.html

2、格式

  

  program 通常是被放在单引号中,并可以由三种部分组成:  BEGIN语句块、模式匹配的通用语句块、END语句块

  常见选项:-F 指明输入时用到的字段分隔符      -v  var=value变量赋值

 3、工作流程

  

 4、awk控制语句

  

 5、动作print

  逗号分隔符

  输出item可以字符串,也可是数值; 当前记录的字段、变量或awk的表达式

  如省略item,相当于print $0

  固定字符符需要用“” 引起来,而变量和数字不需要

6、awk 变量

(1)内置变量

  FS:输入字段分隔符,默认为空白字符,功能相当于 -F

  OFS:输出字段分隔符,默认为空白字符

  RS:输入记录record分隔符,指定输入时的换行符

  ORS:输出记录分隔符,输出时用指定符号代替换行 符

  NF:  字段数量

  NR:  记录的编号

  FNR:  各文件分别计数,记录的编号

  FILENAME:当前文件名

  ARGC:  命令行参数的个数

  ARGV:  数组,保存的是命令行所给定的各参数,每一个参数:ARGV[0],...

 

(2)自定义变量:区分字符大小写

  -v var=value

  在program 中直接定义

7、动作:printf

  必须指定FORMAT

  不会自动换行,需要显示给出换行 控制符\n

  FORMAT中需要分别为后面每个item指定格式符

  

   

8、操作符

  

   

   

   

  

 

 9、模式PATTERN

  根据pattern条件,过滤匹配的行,再做处理

  如果未指定:空模式,匹配每一行

  /regular expression/: 仅处理能够模式匹配到的行,需要用/ / 括起来

  relational expression :关系表达式,结果为“真”才会被处理

  line ranges:  行范围; 不支持直接用行号,但可以使用变量NR间接指定行号

  BEGIN/END 模式:   

10、条件判断:

  if-else

  switch

  while

  do --  while 

  for 

  continue和break

  next:提前结束对本行处理而直接进入下一行处理

11、数组:为关联数据,array_name[index-expression]

  利用数徐若给,实现k/v功能

  可使用任意字符串; 字符串要使用双引号括起来

  如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为”空串“

  若要判断数组中是否存在某元素,要使用”index in array “格式进行遍历

12、awk函数

 (1)内置函数:

    rand():返回0和1之间一个随机数

    srand();配合rand()函数,生成随机数的种子

    int():返回整数

    length([s]):返回指定字符串的长度

    sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s

    gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

    split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2

    system('cmd'):可以在awk中调用shell命令

    systime():当前时间到1970年1月1日的秒数:https://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions

    strftime():指定时间格式

  (2)自定义函数

    function name(p,p,p...)

      {

      }

13、awk脚本

  将awk程序写成脚本,直接调用或执行

14、 

  

 

posted @ 2024-01-09 20:49  djyhello  阅读(16)  评论(0编辑  收藏  举报