了解awk、sed、grep

阅读这篇文章,你将会了解:
1.awk、sed、grep的区别;
2.他们分别有什么命令可以使用,用到的时候可以查阅;

一. awk、sed、grep的区别

概念 模版
SED 在线编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。文件内容不发生改变,除非使用-i命令声明。 sed [-option] ‘command’ file
AWK 相对于sed 常常作用于一整个行的处理,awk倾向于将每行分成数个“字段”来处理,可以理解为处理列。 awk [-F|-f|-v] ‘BEGIN{} /command/ {command1; command2} END{}’ file
GREP 文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 grep [command] file

有以下的文本:test.txt,把有name的行找出来

my cat's name is betty
this is your dog
my dog's name is frank
this is your fish
my fish's name is george
this is your goat
my goat's name is adam
概念 解释
SED sed -n ‘/ name /p’ test.txt -n:仅显示script处理后的结果,p:表示打印行
AWK awk -F’ ’ ‘{if($3==“name”){print $0}}’ test.txt -F:每行根据后面的字符切割,$3:第三列,$0:当前行
GREP grep ’ name ’ test.txt

二. awk

模式:
awk [-F|-f|-v] ‘BEGIN{} /command{command1; command2} END{}’ file

标准模式下的含义:

描述
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
’ ’ 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
/command/ 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

特殊的属性:

描述
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F’[:#/]’ 定义三个分隔符

三. sed

https://linux.cn/article-10232-1.html
模式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)

options:

参数 完整参数 说明
-e script –expression=script 以选项中的指定的script来处理输入的文本文件
-E 默认情况下,Sed 的正则表达式引擎仅理解 POSIX 基本正则表达式 的语法。如果你需要用到扩展正则表达式,你必须在 Sed 命令上添加 -E 标志
-f script –files=script 以选项中的指定的script文件来处理输入的文本文件
-h –help 显示帮助
-n –quiet --silent 仅显示script处理后的结果
-V –version 显示版本信息

sed命令:

命令 说明
d 删除,删除选择的行
D 删除模板块的第一行
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区
H 追加模板块的内容到内存中的缓冲区
g 获得内存缓冲区的内容,并替代当前模板块中文本
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
l 列表不能打印字符的清单
n 读取下一个输入行,用下一个命令处理新的行而不是第一个命令
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
p 打印模板块的行
P 打印模板块的第一行
q 退出sed
b label 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
r file 从file中读行
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
w file 写并追加模板块到file末尾
W file 写并追加模板块的第一行到file末尾
! 表示后面的命令对所有没有被选定的行发生作用
= 打印当前行号
# 把注释扩展到第一个换行符以前

四. grep

模式:
grep [options] [command] file

options:

描述
-a 将 binary 文件以 text 文件的方式搜寻数据
-c 计算找到 ‘搜寻字符串’ 的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 顺便输出行号
-v 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
-s 不显示错误信息
-w 只显示全符合的列
-o 只输出匹配到的部分

五. 参考文档

sed: https://www.cnblogs.com/maxincai/p/5146338.html
awk: https://www.cnblogs.com/xudong-bupt/p/3721210.html
https://blog.csdn.net/wangyeshun/article/details/82562688

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章