文档章节

linux下grep、awk和sed工具用法概览

陶小陶
 陶小陶
发布于 2018/09/11 20:22
字数 2147
阅读 106
收藏 27

linux下grep、awk和sed工具用法概览

在linux下,grep、awk和sed是非常强大的文本处理工具,其中grep命令主要用作文本搜索,而awk和sed命令侧重于文本的编辑等操作,另外awk本身还可以是编程语言,提供了编程语言中相关的概念。从功能上,总的来说,awk >> sed >> grep

grep命令

grep命令主要用于按行文本搜索,搜索的条件以正则表达式给出。grep在linux下的帮助说明如下: grep帮助说明
上面给出的说明较多,这里提取一些较为重要且常用的选项加以说明。

  1. -E 使用扩展正则表达式规则
  2. -F 搜索固定字符串,这里表示的是模式中的内容不使用正则表达式规则去处理
  3. -G 使用基础正则表达式,这里指的是由posix规范定义的正则表达式规则集,相比于我们日常使用较多的pcre正则表达式少了部分规则
  4. -P 使用pcre正则表达式规则集
  5. -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命令

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。sed命令的linux下帮助说明如下图:

sed帮助说明

较为重要的选项有:

  1. -e <script>或--expression=<script>,以选项中的指定的script来处理输入的文本文件
  2. -f <script文件>或--file=<script文件>,以选项中指定的script文件来处理输入的文本文件
  3. -n或--quiet或--silent,仅显示script处理后的结果

从sed的帮助说明中,可以发现sed的输入选项较少,换而之,sed的输入脚本则很重要。sed脚本中常用操作如下表:

操作符说明
a\在当前行下面插入文本。
i\在当前行上面插入文本。
c\把选定的行改为新的文本。
d删除,删除选择的行。
D删除模板块的第一行。
s替换指定字符
h拷贝模板块的内容到内存中的缓冲区。
H追加模板块的内容到内存中的缓冲区。
g获得内存缓冲区的内容,并替代当前模板块中的文本。
G获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l列表不能打印字符的清单。
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p打印模板块的行。
P(大写)打印模板块的第一行。
q退出Sed。
b lable分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file从file中读行。
t labelif分支,从最后一行开始,条件一旦满足或者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官方帮助手册

awk命令

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的基本工作原理为:

  1. 第一步:执行BEGIN{ commands }语句块中的语句
  2. 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕
  3. 第三步:当读至输入流末尾时,执行END{ commands }语句块

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

总结

对于grep、sed和awk工具,由于都围绕在正则表达式而展开,因而想熟练使用这三个工具进行文本处理,首先必须要深入了解正则表达式,做到常用功能烂熟于心。在了解了正则表达式之后,grep和sed命令只要了解相关的选项和操作的含义并会用即可,而对于更为复杂并强大的awk命令则应视情况而定,如果真有相关场景,在深入学习和使用即可。

© 著作权归作者所有

共有 人打赏支持
上一篇: Bash工作管理详解
下一篇: 正则表达式详解
陶小陶
粉丝 1
博文 38
码字总数 49215
作品 0
深圳
程序员
私信 提问
9.1-9.7 正则三剑客:grep、sed、awk

grep工具 grep是什么 grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使...

熊猫头先生
02/18
0
0
利用多核CPU来加速你的Linux命令(awk, sed, bzip2, grep, wc)

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据 专家们,我是在对你们说。你可能有一个16核或更多核的CPU,但我们合适的工具,...

wushank
2018/06/26
0
0
linux`操作文本的三大利器

、、是操作文本的三大利器,也是必须掌握的命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属功能最强大,但也最复杂。更适合单纯的查找或匹配文本,更适合编辑匹配到的文本,更适...

丁典
2018/07/30
0
0
shell入门基础&常见命令及用法

shell shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法 shell脚本 以.sh结尾 shell语法+linux命令 注释: 单行注释 : # 多行注释 : :<...

鱼大大
2018/08/14
0
0
基于命令的批量修改文件内容

Linux下批量替换多个文件中的字符串的简单方法 :%s/oldstring/newstring/g Linux下批量替换多个文件中的字符串的方法 用sed命令可以批量替换多个文件中的字符串。 sed -i "s/原字符串/新字符...

长平狐
2013/01/06
22
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的NetworkEnvironmentConfiguration

序 本文主要研究一下flink的NetworkEnvironmentConfiguration NetworkEnvironmentConfiguration flink-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/taskmanager/NetworkEnv......

go4it
31分钟前
1
0
极路由4刷OpenWrt(LEDE)

申请开发者模式 登录路由器后台 进入插件中间 选中路由器信息 申请开发者权限 安装开发者插件 刷 Bootloader 下载 极路由4 的 Breed 通过SSH登录路由器 (必须安装开发者插件,端口 1022 账号...

dingdayu
40分钟前
3
0
浅淡个人学习嵌入式Linux过程

我专业是电子信息工程,在初入大学的时候,我们的班主任便要我们多多去了解一些关于电子方面的知识。后来我了解到了嵌入式,继而了解到了嵌入式Linux。其实我们学习linux差不多就学习linux内...

linux-tao
今天
7
0
SpringBoot使用GraphQL简单学习-1

官网 一、GraphQL简介 1.GraphQL是什么? GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够...

wind2012
今天
6
0
Android的WIFI局域网对讲机

https://blog.csdn.net/z979451341/article/details/79280749 (三)Android局域网内语音对讲 基于UDP语音传输 https://blog.csdn.net/stormxiaofeng/article/details/80513947 Android7.0手......

shzwork
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部