grep、sed、awk的工作原理

grep 

文本搜索工具,根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行。

sed 流媒体编辑器:
第一步提取一行内容到模式空间
第二步针对模式空间执行编辑命令
第三步将模式空间中的内容进行输出
第四步清空模式空间,等待下一行命令的读取;循环处理后续内容。
模式空间:读取一行到内存中空间,内存空间即为模式空间,编辑的是模式空间中的一行。
awk

逐行处理,一行提取出来后,按照指定格式,进行切片,切片内容定义字段$number,定义分隔符。


grep命令在一个或多个文件中查找某个字符模式,如果这个模式中包含空格,就必须用引号把它括起来。grep命令中,模式可以是一个被引号括起来的字符串,也可以是单个词。位于模式之后的所有单词都被视为文件名。grep将输出发送到屏幕,它不会对输入文件进行任何修改或变化。grep返回的退出状态为0,表示成功。退出状态为1,表示没有找到。如果找不到指定的文件,退出状态为2。


sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。

sed的工作过程: sed不是在原输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理,处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果),而是直接输出到屏幕上。sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sed,sed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。

awk工作原理:
1.        awk 使用一行作为输入(通过文件或者管道),并将这一行赋给内部变量 $0
2.        行被空格分解为字段(单词),每一个字段存储在已编号的变量中,从 $1 开始。( awk的内部变量 FS 用来确定字段的分隔符。初始时,为空格,包含制表符和空格符)
3.        对于一行,按照给定的正则表达式的顺序进行匹配,如果匹配则执行对应的 Action ,如果没有匹配上则不执行任何动作 , Search Pattern 和 Action 是可选的,但是必须提供其中一个 。如果 Search Pattern 未提供,则对所有的输入行执行 Action 操作。如果 Action 未提供,则默认打印出该行的数据 。 {} 这种 Action 不做任何事情,和未提供的 Action 的工作方式不一样
4.        打印字段,用 print 、 printf 、 sprintf ,格式: { print $1, $3 } 内部变量 output field separator ( OFS ),默认为空格, $n 之间的逗号被 OFS 中的字符替换。
5.        输出之后,从文件中另取一行,并将其复制到 $0 中,覆盖原来的内容。重复进行……

猜你喜欢

转载自blog.csdn.net/wypersist/article/details/80248192