linux系统三大文本处理工具grep、sed及awk的简单介绍

时间:2022-04-30 08:53:22

grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言来介绍。

grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多;
sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed;

awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。


grep是一个最初用于Unix操作系统的命令行工具在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本 ,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

grep:根据模式搜索文本,并将符合模式的文本行显示出来。    
Pattern文本字符和正则表达式的元字符组合而成匹配条件

使用格式:
grep [options] PATTERN[FILE...]
    -i:忽略大小写    
    --color:匹配到字符用其他颜色显示出来,默认是红色
    -v:显示没有被模式匹配到的行
    -o:只显示被模式匹配到的字符串,不显示行
    -E:使用扩展正则表达式
    -A n:表示显示该行及其后n行
    -B n:表示显示该行及其前n行
    -C n:表示显示该行及其前后各n行
正则表达式:REGular EXPression,REGEXP

匹配次数(贪婪模式,即尽可能长的匹配):
*:匹配其前面的字符任意次 
   如:编辑文件abc,输入这些字符:a,b,ab,aab,acb,adb,amnb,使用grep匹配a*b,命令及显示效果如下所示:
       linux系统三大文本处理工具grep、sed及awk的简单介绍
从上图可以看到,虽然像acb、adb之类的字符串也可以显示出来,但从显示的颜色可以看到,匹配的仅仅是字符b,虽然整个字符串中也有字符a,但是此时a并没有与b一起紧挨着出现,所以仅匹配到字符b;而像ab、aab等字符串,全部显示,此时a紧挨着b出现,符合条件,所以可以显示。

.*:任意长度的任意字符
    如:匹配 .b .*b ,看二者有什么区别,命 令和显示效果如下:
       linux系统三大文本处理工具grep、sed及awk的简单介绍


--------------------------------------------------------------------------------

sed Unix 常见的 命令行 程序。sed 用来把文档或 字符串里面的文字经过一系列编辑命令转换为另一种格式输出。sed 通常用来匹配一个或多个正则表达式的文本进行处理。 sed是一种在线 编辑器 ,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向 存储 输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

使用格式:    
sed 'Address Command' file ...
    -n:静默模式,不再显示模式空间中的内容
    -i:直接修改原文件
    -e SCRIPT -e SCRIPT:添加脚本到将要执行的命令中,可以同时执行多个脚本
    -f /PATH/TO/SED_SCORIPT:添加脚本文件中的内容到将要执行的命令中
         #sed -f /path/to/script file
    -r:表示使用扩展正则表达式

Address:
1、StartLine,EndLine:开始行,结束行
   如:1,100:表示从第1行到第100行
    $;最后一行
2、/RegExp/:扩展正则表达式
   如:/^root/
3、/pattern1/,/pattern2/:表示第一次被pattern1匹配到的行开始,至
   第一次被pattern2匹配到的行结束,这中间的所有行
4、LIneNumber:指定的行
5、StartLIne,+N:从StartLine开始,向后的N行

Command:
    d:删除符合条件的行;
    p:显示符合条件的行,在不使用-n选项时被匹配到的行会显示两遍,因为sed处理时会把处理的信息输出
    a  \string:在指定的行后面追加新行,内容为“string”,
        显示两行或多行,在每行后加\n进行换行
    i  \string:在指定的行前面添加新行,内容为string
    r  file:将指定的文件的内容添加至符合条件的文件中
    w  file:将地址指定范围内的行另存至指定的文件中
    s  /pattern/string/修饰符:查找并替换,默认只替换每行中第一次被
       模式匹配到的字符串加修饰符
         g:全局替换,如:s /pattern/string/g
         i:忽略字符大小写,如:s /pattern/string/i
    s ///,s###,s@@@都可以,当所使用的分割符号与内容中显示的相同时,需使用转义字符转义    
        \(\),\1,\2:成组匹配,\1表示匹配第一个‘(’,\2表示匹配第二个‘(’
    &:引用模式匹配到的整个串

----------------------------------------------------------------
awk 是一种优良的 文本处理 工具, Linux Unix 环境中现有的功能最强大的 数据处理 引擎之一。 AWK提供了极其强大的功能:可以进行正则表达式的匹配,样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上AWK的确拥有自己的语言:AWK 程序设计语言 ,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能 最简单地说,AWK是一种用于处理文本的编程语言工具。

使用格式:
# awk [options] 'script'  file1, file2, ...
# awk [options]  'PATTERN { action }'  file1, file2, ...

awk的输出:
      print和printf

print的使用格式:
      print item1, item2, ...
要点:
1、各项目之间使用 逗号隔开,而 输出时则以空白字符分隔
2、输出的item可以为 字符串或数值 当前记录的字段(如$1) 变量或awk的
     表达式 ;数值会先转换为字符串,而后再输出;
3、print命令后面的item可以省略,此时其功能相当于print $0, 因此,
    如果想输出空白行,则需要使用print " ";

          linux系统三大文本处理工具grep、sed及awk的简单介绍 linux系统三大文本处理工具grep、sed及awk的简单介绍


awk变量

2.1 awk内置变量之记录变量:
FS: field separator,字段分隔符,默认是空白字符;
RS: Record separator,记录分隔符,默认是换行符;
OFS: Output Filed Separator,输出字段分隔符
ORS:Output Row Separator,输出行分隔符
上边两个命令的显示效果如下所示:
         linux系统三大文本处理工具grep、sed及awk的简单介绍


awk内置变量之数据变量:
NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数;
NF:Number of Field,当前记录的字段个数,有时可用来表示最后一个字段
FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;
ARGV: 数组,保存命令行本身这个字符串,如awk '{print $0}' a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC: awk命令的参数的个数;
FILENAME: awk命令所处理的文件的名称;
ENVIRON:当前shell环境变量及其值的关联数组;
如:
awk 'BEGIN{print ENVIRON["PATH"]}'
awk '{print $NF}' test.txt
            linux系统三大文本处理工具grep、sed及awk的简单介绍
linux系统三大文本处理工具grep、sed及awk的简单介绍


printf输出格式
printf命令的使用格式:
printf format, item1, item2, ...
要点:
1、其与print命令的最大不同是,printf需要指定格式;
2、format用于指定后面的每个item的输出格式;
3、printf语句不会自动打印换行,需要显式使用\n换行。

format格式的指示符都以%开头,后跟一个字符;如下:
%c: 显示字符的ASCII码;
%d, %i:十进制整数;
%e, %E:科学计数法显示数值;
%f: 显示浮点数;
%g, %G: 以科学计数法的格式或浮点数的格式显示数值;
%s: 显示字符串;
%u: 无符号整数;
%%: 显示%自身;