文本三剑客之grep sed awk

一、grep

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GUN版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;

模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

OPTIONS:
–color=auto:对匹配到的文本着色后高亮显示;
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v:–invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q:–quiet,–silent:静默模式,即不输出任何信息;

       -A #:after,后#行
       -B #:before,前#行
       -C #:context,前后各#行

1、显示/etc/passwd文件中不以/bin/bash结尾的行:
[root@localhost ~]# grep -v “/bin/bash$” /etc/passwd
2、找出/etc/passwd文件中的两位数或三位数:
[root@localhost ~]# grep “<[0-9]{2,3}>” /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;
[root@localhost ~]# grep "^ [[:space:]]+ [^ [:space:]] " /etc/grub2.cfg
4、找出/proc/meminfo文件中,所有以大写或小写S开头的行:至少有三种实现方式:
[root@localhost ~]# grep -i “^s” /proc/meminfo
[root@localhost ~]# grep “^ [sS]” /proc/meminfo
[root@localhost ~]# grep -E “^(s|S)” /proc/meminfo
5、显示当前系统上root、centos或user1用户的相关信息:
[root@localhost ~]# grep -E “^(root|centos|user1)>” /etc/passwd
6、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
[root@localhost ~]# grep -E “^(root|centos|user1)>” /etc/passwd

二、sed

sed是一种新型的,非交互式的编辑器。它能执行与编辑器vi和ex相同的编辑任务。sed编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令,指定文件名,然后在屏幕上查看输出。sed编辑器没有破坏性,它不会修改文件,除非使用shell重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。

工作原理
sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为"模式空间"或"临时缓冲"。sed处理完模式空间中的行后(即在该行上执行sed命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作),执行下一个循环。sed每处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在模式空间中,对这个副本进行编辑,所以不会修改或破坏原文件。

它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。

如果没有使诸如’D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或者-i进行修改。

功能
主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等;对文本按行处理

用法
sed [选项]… ‘地址界定 处理动作’ 文件…
或 前置命令 | sed [选项] ‘地址界定 处理动作’

常用选项
-n : 不输出模式内容到屏幕,即不自动打印
-e : 多点编辑
-f /PATH/SCRIPT_FILE:从指定文件中读取编辑脚本 这里的编辑脚本每行一个不需要带引号
-r : 支持使用扩展正则表达式 regexp-extended
-i : 直接将处理的结果写入文件

正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改。若希望直接修改文件内容,应添加选项-i。为了避免生产环境中因误操作导致系统故障,使用时要谨慎。

script : 地址界定编辑命令

地址界定:
(1)空地址对全文本进行处理;
(2)单地址:
#[num] :指定行;
/pattern/:被此模式所匹配到的每一行;
(3)地址范围
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/
$:最后一行;
(4)步进:~
1~2:所有奇数行
2~2:所有偶数行

编辑命令:
d:删除;
p:显示模式空间中的内容;
a \text: 在行后面追加文本"text",支持使用\n实现多行追加;
i \text: 在行前面插入文本"text",支持使用\n实现多行插入;
c \text: 把匹配到的行替换为此处指定的文本"text";
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FORM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
地址界定!编辑命令;
s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;

      替换标记:
          g:全局替换;
          w  /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
          p:显示替换成功的行;

保持空间和模式空间
sed有两个内置的存储空间:在使用高级命令的时候用到

模式空间:模式空间用于sed执行的正常流程中。该空间sed内置的一个缓冲区,用来存放,修改,从输入文件读取的内容。(即对文件的操作都是在模式空间中进行的)
保持空间:保持空间是另一个缓冲区,用来存放临时数据。sed可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的sed命令。我们已经讨论过,每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容则保持不变,不会在循环中被删除。

高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容交换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;

三、awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入,一个或多个文件,或其他命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

awk的处理文本和数据时:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

AWK工作流程可分为三个部分
读输入文件之前执行的代码段(由BEGIN关键字标识)。
主循环执行输入文件的代码段。
读输入文件之后的代码段(由END关键字标识)。

在这里插入图片描述
1、通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
2、完成 BEGIN 块的执行,开始执行body块。
3、读入有 \n 换行符分割的记录。
4、将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容), 1 表 示 第 一 个 域 , 1 表示第一个域, 1n 表示第 n 个域。
5、依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。
6、循环读取并执行各行直到文件结束,完成body块执行。
7、开始 END 块执行,END 块可以输出最终结果。

开始块(BEGIN)
语法格式:
BEGIN {awk-commands}
开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。
一般情况下,我们可以在开始块中初始化一些变量。
BEGIN是AWK的关键字,因此它必须是大写的。
注意:开始块部分是可选的,程序可以没有开始块部分。

主体块(BODY)
语法格式:
/pattern/ {awk-commands}
对于每一个输入的行都会执行一次主体部分的命令。
默认情况下,对于输入的每一行,AWK都会执行命令。但是,我们可以将其限定在指定的模式中。
注意:BODY区域没有任何关键字表示,只有正则模式和命令。

结束块(END)
语法格式:
END {awk-commands}

结束块是在程序结束时执行的代码。END也是AWK的关键字,它也必须大写。与开始块相似,结束块也是可选的。

用法:
1、第一种,命令行方式:
awk -F ‘/pattern/ {action}’ input-file

-F为字段分界符。如果不指定,默认会使用空格或制表符作为分界符。但如果处理类似passwd文件,此文件各域使用冒号作为分隔符,则必须使用-F选项:awk -F:
/pattern/和{action}需要用单引号引起来。

/pattern/是可选的。如果不指定,awk将处理输入文件中的所有行。如果指定一个模式,awk则值处理匹配指定的模式的行。

{action}为awk命令,可以是单个命令,也可以多个命令。整个action(包括里面的所有命令)都必须放在(和)之间。

input-file即为要处理的文件

2、第二种,将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。

3、第三种,将所有awk命令插入一个单独文件,然后调用,如:
awk -f awkscript-file input-file

-f选项指明在文件awkscript的awk脚本,input-file是使用awk进行浏览的文件名

模式和动作
任何awk语句都是有模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态。

模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来。

实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码和if和for循环语句等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录。

域和记录
awk执行时,其浏览标记为$1,$2,…,这种方法称为域标记。使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域。

条件操作符

操作符含义
~ !~匹配正则表达式 不匹配正则表达式
== != < <= > >=关系运算符
= += -= *= /= %= ^= **=赋值
&与运算
&&逻辑与
++ –增加或减少,作为前缀或后缀
$字段引用
in数组成员

awk内置变量

变量含义
$n当前记录的第n个字段,字段间由FS分隔
$0当前记录的内容
ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行 -F选项
NF浏览记录的域的个数
NR已读的记录数
OFS输入域分隔符
ORS输出记录分隔符
RS控制记录分隔符

字符串常量

字符串常量描述
\反斜线
\aalert字符,通常为ASCLL BEL字符
\b退格键
\f换页
\n换行符
\r回车
\t水平制表符
\v垂直制表符
\xhex digits字符由十六进制数字下面的\x中的字符串来表示
\c字面字符c

awk命令行选项
-v:参数传递,定义和引用变量,可以把外部变量引入到内部
-f:指定脚本
-F:指定分隔符
-V:查看awk的版本号

print函数和printf函数

awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量、数值或者是字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格。
1、print格式:print item1,item2,…
2、#输出的各item可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式

printf函数,其用法和C语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

  1. printf:格式化输出: printf “FORMAT” , item1, item2, …
  2. 必须指定FORMAT
  3. 不会自动换行,需要显示给出换行控制符,\n
  4. FORMAT中需要分别为后面每个item指定格式符
  5. printf 格式符:与item一一对应
  6. %c:显示字符的ASCII码
  7. %d,%i:显示十进制整数
  8. %e,%E:显示科学计数法数值
  9. %f:显示为浮点数
  10. %g,%G:以科学计数法或浮点形式显示数值
  11. %s:显示字符串
  12. %u:无符号整数
  13. %%:显示%自身
  14. [.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度, %3.1f
  15. -:左对齐(默认右对齐) %-15s
  16. +:显示数值的正负符号 %+d
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值