在linux下,grep、awk和sed是很是强大的文本处理工具,其中grep命令主要用做文本搜索,而awk和sed命令侧重于文本的编辑等操做,另外awk自己还能够是编程语言,提供了编程语言中相关的概念。从功能上,总的来讲,awk >> sed >> grep。html
grep命令主要用于按行文本搜索,搜索的条件以正则表达式给出。grep在linux下的帮助说明以下:
上面给出的说明较多,这里提取一些较为重要且经常使用的选项加以说明。linux
- -E 使用扩展正则表达式规则
- -F 搜索固定字符串,这里表示的是模式中的内容不使用正则表达式规则去处理
- -G 使用基础正则表达式,这里指的是由posix规范定义的正则表达式规则集,相比于咱们平常使用较多的pcre正则表达式少了部分规则
- -P 使用pcre正则表达式规则集
- -r 递归搜索整个目录
具体用法可参考下面的代码:正则表达式
# 搜索ubuntu下qt5的相关库 apt search libqt5 # 搜索ubuntu下qt5相关库,并过滤出全部dev开发包 apt search libqt5 | grep -E "^libqt5.+dev" # posix基础正则集,不支持定位符,无结果 apt search libqt5 | grep -G "^libqt5.+dev" # 能够得到qt5库的dev开发包 apt search libqt5 | grep -P "^libqt5.+dev" # 无任何结果 apt search libqt5 | grep -F "^libqt5.+dev"
sed是一种流编辑器,它是文本处理中很是中的工具,可以完美的配合正则表达式使用,功能不一样凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并无改变,除非使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操做;编写转换程序等。sed命令的linux下帮助说明以下图:express
较为重要的选项有:编程
- -e <script>或--expression=<script>,以选项中的指定的script来处理输入的文本文件
- -f <script文件>或--file=<script文件>,以选项中指定的script文件来处理输入的文本文件
- -n或--quiet或--silent,仅显示script处理后的结果
从sed的帮助说明中,能够发现sed的输入选项较少,换而之,sed的输入脚本则很重要。sed脚本中经常使用操做以下表:ubuntu
操做符 | 说明 |
---|---|
a\ | 在当前行下面插入文本。 |
i\ | 在当前行上面插入文本。 |
c\ | 把选定的行改成新的文本。 |
d | 删除,删除选择的行。 |
D | 删除模板块的第一行。 |
s | 替换指定字符 |
h | 拷贝模板块的内容到内存中的缓冲区。 |
H | 追加模板块的内容到内存中的缓冲区。 |
g | 得到内存缓冲区的内容,并替代当前模板块中的文本。 |
G | 得到内存缓冲区的内容,并追加到当前模板块文本的后面。 |
l | 列表不能打印字符的清单。 |
n | 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 |
N | 追加下一个输入行到模板块后面并在两者间嵌入一个新行,改变当前行号码。 |
p | 打印模板块的行。 |
P(大写) | 打印模板块的第一行。 |
q | 退出Sed。 |
b lable | 分支到脚本中带有标记的地方,若是分支不存在则分支到脚本的末尾。 |
r file | 从file中读行。 |
t label | if分支,从最后一行开始,条件一旦知足或者T,t命令,将致使分支到带有标号的命令处,或者到脚本的末尾。 |
T label | 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将致使分支到带有标号的命令处,或者到脚本的末尾。 |
w file | 写并追加模板块到file末尾。 |
W file | 写并追加模板块的第一行到file末尾。 |
! | 表示后面的命令对全部没有被选定的行发生做用。 |
= | 打印当前行号码。 |
# | 把注释扩展到下一个换行符之前 |
sed命令的使用实例:数组
# 在当前行下面插入Jackie echo "Hello World" | sed 'a\Jackie' # 结果为: # Hello World # Jackie # 在当前行上面插入Jackie echo "Hello World" | sed 'i\Jackie' # 结果为: # Jackie # Hello World # 将选定行修改成Jackie echo "Hello World" | sed 'c\Jackie' # 结果为: # Jackie # 删除以Hello字符串开头的行 echo -e "Hello\nWorld" | sed '/^Hello/d' # 结果为: # World # 将Hello替换为Hi echo -e "Hello World" | sed 's/Hello/Hi/' # 结果为: # Hi World
须要注意的是,上面代码仅仅列举出了sed命令较为简单的用法,更为复杂的用法能够参考sed官方帮助手册bash
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据能够来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更可能是做为脚原本使用。awk有不少内建的功能,好比数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优点。awk相对于grep和sed更为复杂,我的以为除非是特殊的场景,例若有着大量复杂的文本处理需求,不然不建议专门学习其背后的语言。使用时,语法和概念能够参考官方文档。awk脚本基本结构以下:编程语言
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file编辑器
一个awk脚本一般由:BEGIN语句块、可以使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分均可以不出如今脚本中,脚本一般是被单引号或双引号中,例如:
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename
awk的基本工做原理为:
BEGIN语句块在awk开始从输入流中读取行以前被执行,这是一个可选的语句块,好比变量初始化、打印输出表格的表头等语句一般能够写在BEGIN语句块中。END语句块在awk从输入流中读取完全部的行以后即被执行,好比打印全部行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。pattern语句块中的通用命令是最重要的部分,它也是可选的。若是没有提供pattern语句块,则默认执行{ print },即打印每个读取到的行,awk读取的每一行都会执行该语句块。
对于grep、sed和awk工具,因为都围绕在正则表达式而展开,于是想熟练使用这三个工具进行文本处理,首先必需要深刻了解正则表达式,作到经常使用功能烂熟于心。在了解了正则表达式以后,grep和sed命令只要了解相关的选项和操做的含义并会用便可,而对于更为复杂并强大的awk命令则应视状况而定,若是真有相关场景,在深刻学习和使用便可。