Shell:初识sed、awk

news2024/11/15 6:46:43

Linux系统提供了两个常见的具备上述功能的工具。本节将会介绍Linux世界中最广泛使用的 两个命令行编辑器:sed和gawk。

1. sed编辑器

sed编辑器被称作流编辑器(stream editor),流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储 在一个命令文本文件中。sed编辑器会执行下列操作。

(1) 一次从输入中读取一行数据。
(2) 根据所提供的编辑器命令匹配数据。
(3) 按照命令修改流中的数据。
(4) 将新的数据输出到STDOUT。

sed命令的格式如下。

sed options script file

选项允许你修改sed命令的行为,可以使用的选项已在表19-1中列出。

在这里插入图片描述

script参数指定了应用于流数据上的单个命令。如果需要用多个命令,要么使用-e选项在命令行中指定,要么使用-f选项在单独的文件中指定。

1.1 在命令行定义编辑器命令

默认情况下,sed编辑器会将指定的命令应用到STDIN输入流上。这样你可以直接将数据通 过管道输入sed编辑器处理。这里有个简单的示例。

$ echo "This is a test" | sed 's/test/big test/' 
This is a big test
$

这个例子在sed编辑器中使用了s命令。s命令会用斜线间指定的第二个文本字符串来替换第 一个文本字符串模式。在本例中是big test替换了test。

当然,这个简单的测试只是修改了一行数据。不过就算编辑整个文件,处理速度也相差无几。

$ cat data1.txt
The quick brown fox jumps over the lazy dog. 
The quick brown fox jumps over the lazy dog. 
The quick brown fox jumps over the lazy dog. 
The quick brown fox jumps over the lazy dog. 
$
$ sed 's/dog/cat/' data1.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
$

重要的是,要记住,sed编辑器并不会修改文本文件的数据。它只会将修改后的数据发送到 3 STDOUT。如果你查看原来的文本文件,它仍然保留着原始数据。

1.2 在命令行使用多个编辑器命令

要在sed命令行上执行多个命令时,只要用-e选项就可以了。

$ sed -e 's/brown/green/; s/dog/cat/' data1.txt 
The quick green fox jumps over the lazy cat. 
The quick green fox jumps over the lazy cat. 
The quick green fox jumps over the lazy cat. 
The quick green fox jumps over the lazy cat.
$

两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号 8 之间不能有空格。

如果不想用分号,也可以用bash shell中的次提示符来分隔命令。

$sed -e '
> s/brown/green/
> s/fox/elephant/
> s/dog/cat/' data1.txt
The quick green elephant jumps over the lazy cat. 
The quick green elephant jumps over the lazy cat. 
The quick green elephant jumps over the lazy cat. 
The quick green elephant jumps over the lazy cat. 
$

1.3 从文件中读取编辑器命令

可以在sed命令中用-f选项来指定文件。

$ cat script1.sed 
s/brown/green/ 
s/fox/elephant/ 
s/dog/cat/
$
$ sed -f script1.sed data1.txt
The quick green elephant jumps over the lazy cat. 
The quick green elephant jumps over the lazy cat. 
The quick green elephant jumps over the lazy cat. 
The quick green elephant jumps over the lazy cat. 
$

1.4 更多的替换选项

1.4.1 s命令:替换

替换命令在替换多行中的文本时能正常工作,但默认情况下它只替换每行中出现的第一处

$ cat data4.txt
This is a test of the test script.
This is the second test of the test script. 
$
$ sed 's/test/trial/' data4.txt
This is a trial of the test script.
This is the second trial of the test script. 
$

要让替换命令能够替换一行中不同地方出现的文本必须使用替换标记(substitution flag)。替换标 记会在替换命令字符串之后设置。

s/pattern/replacement/flags

有4种可用的替换标记:

  1. 数字,表明新文本将替换第几处模式匹配的地方;
  2. g,表明新文本将会替换所有匹配的文本;
  3. p,表明原先行的内容要打印出来;
  4. w file,将替换的结果写到文件中。

数字替换标记中,可以指定sed编辑器用新文本替换第几处模式匹配的地方。

$ sed 's/test/trial/2' data4.txt
This is a test of the trial script.
This is the second test of the trial script. 
$

g替换标记使你能替换文本中匹配模式所匹配的每处地方。

$ sed 's/test/trial/g' data4.txt
This is a trial of the trial script.
This is the second trial of the trial script. $

p替换标记会打印与替换命令中指定的模式匹配的行。这通常会和sed的-n选项一起使用。

-n选项将禁止sed编辑器输出。但p替换标记会输出修改过的行。将二者配合使用的效果就是 只输出被替换命令修改过的行。

$ cat data5.txt
This is a test line.
This is a different line.
$
$ sed -n 's/test/trial/p' data5.txt This is a trial line.
$

w替换标记会产生同样的输出,不过会将输出保存到指定文件中。

$ sed 's/test/trial/w test.txt' data5.txt This is a trial line.
This is a different line.
$
$ cat test.txt
This is a trial line. 
$

sed编辑器的正常输出是在STDOUT中,而只有那些包含匹配模式的行才会保存在指定的输出 文件中。

直接替换原文件内容
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

这条命令使用了sed(stream editor)工具来直接(-i选项)修改/etc/apt/sources.list文件,命令的具体作用是将文件中所有出现的archive.ubuntu.com字符串替换为mirrors.aliyun.com。

  • -i选项告诉sed直接修改文件内容,而不是将结果输出到标准输出(通常是屏幕)。如果没有-i选项,sed的修改结果只会显示在屏幕上,原文件不会被改变。
1.4.2 使用地址

默认情况下,在sed编辑器中使用的命令会作用于文本数据的所有行。如果只想将命令作用 于特定行或某些行,则必须用行寻址(line addressing)

在sed编辑器中有两种形式的行寻址:

  1. 以数字形式表示行区间
  2. 用文本模式来过滤出行
数字方式的行寻址

在命令中指定的地址可以是单个行号,或是用起始行号、逗号以及结尾行号指定的一定区间范围内的行。这里有个sed命令作用到指定行号的例子。

sed编辑器只修改地址指定的第二行的文本。

$ sed '2s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog 
The quick brown fox jumps over the lazy cat 
The quick brown fox jumps over the lazy dog 
The quick brown fox jumps over the lazy dog 
$

另一个例子,这次使用了行地址区间

$ sed '2,3s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy cat The quick brown fox jumps over the lazy cat The quick brown fox jumps over the lazy dog $

如果想将命令作用到文本中从某行开始的所有行,可以用特殊地址——美元符。

$ sed '2,$s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog 
The quick brown fox jumps over the lazy cat 
The quick brown fox jumps over the lazy cat 
The quick brown fox jumps over the lazy cat 
$
使用文本模式过滤器

sed编辑器允许指定文本模式来过 滤出命令要作用的行。格式如下:

/pattern/command

必须用正斜线将要指定的pattern封起来。sed编辑器会将该命令作用到包含指定文本模式的行上。

举个例子,如果你想只修改用户Samantha的默认shell,可以使用sed命令。

$ grep Samantha /etc/passwd 
Samantha:x:502:502::/home/Samantha:/bin/bash
$
$ sed '/Samantha/s/bash/csh/' /etc/passwd 
Samantha:x:502:502::/home/Samantha:/bin/csh 
$
1.4.3 d命令:删除行

删除命令d名副其实,它会删除匹配指定寻址模式的所有行。使用该命令时要特别小心,如 果你忘记加入寻址模式的话,流中的所有文本行都会被删除。

$ cat data1.txt
The quick brown fox jumps over the lazy dog 
The quick brown fox jumps over the lazy dog 
The quick brown fox jumps over the lazy dog 
The quick brown fox jumps over the lazy dog 
$
$ sed 'd' data1.txt
$

指定行号

$ cat data6.txt
This is line number 1. 
This is line number 2. 
This is line number 3. 
This is line number 4. 
$
$ sed '3d' data6.txt 
This is line number 1. 
This is line number 2. 
This is line number 4. 
$

指定区间

$ sed '2,3d' data6.txt 
This is line number 1. 
This is line number 4. 
$

通过特殊的文件结尾字符

$ sed '3,$d' data6.txt 
This is line number 1. 
This is line number 2. 
$

sed编辑器的模式匹配特性也适用于删除命令。sed编辑器会删掉包含匹配指定模式的行。

$ sed '/number 1/d' data6.txt 
This is line number 2.
This is line number 3.
This is line number 4.
$

2. gawk程序

gawk程序能提供一个类编程环境来修改和重新组织文件中的数据。

在gawk编程语言中,你可以做下面的事情:

  1. 定义变量来保存数据;
  2. 使用算术和字符串操作符来处理数据;
  3. 使用结构化编程概念(比如if-then语句和循环)来为数据处理增加处理逻辑;
  4. 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告。

gawk程序的基本格式如下:

gawk options program file

表19-2显示了gawk程序的可用选项。

在这里插入图片描述

gawk的强大之处在于程序脚本。可以写脚本来读取文本行的数据,然后处理并显示数据,创建任何类型的输出报告。

2.1 从命令行读取程序脚本

由于gawk命令行假定脚本是单个文本字符串,你还必须将脚本放到单引号

$ gawk '{print "Hello World!"}'
This is a test
Hello World!
hello
Hello World!

这个程序脚本定义了一个命令print命令。这个命令名副其实:它会将文本打印到STDOUT

如果尝试运行这个命令,你可能会有些失望,因为什么都不会发生。原因在于没有在命令行上指 定文件名,所以gawk程序会从STDIN接收数据。在运行这个程序时,它会一直等待从STDIN输入 的文本。

如果你输入一行文本并按下回车键,gawk会对这行文本运行一遍程序脚本。

2.2 使用数据字段变量

默认情况下,gawk会将如下变量分配给它在文本行中发现的数据字段:

$0代表整个文本行;
$1代表文本行中的第1个数据字段; 
$2代表文本行中的第2个数据字段; 
$n代表文本行中的第n个数据字段。

在下面的例子中,gawk程序读取文本文件,只显示第1个数据字段的值。

$ cat data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.
$
$ gawk '{print $1}' data2.txt One
Two
Three
$

该程序用$1字段变量来仅显示每行文本的第1个数据字段。

2.3 在程序脚本中使用多个命令

要在命令行上的程序脚本中使用多条命令,只要在命令之间放个分号即可。

$ echo "My name is Rich" | gawk '{$4="Christine"; print $0}' 
My name is Christine
$

也可以用次提示符一次一行地输入程序脚本命令。

$ gawk '{
> $4="Christine"
> print $0}'
My name is Rich
My name is Christine 
$

2.4 从文件中读取程序

$ cat script2.gawk
{print $1 "'s home directory is " $6}
$
$ gawk -F: -f script2.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
[...]
Christine's home directory is /home/Christine Samantha's home directory is /home/Samantha Timothy's home directory is /home/Timothy
$

2.5 在处理数据前运行脚本

有时可能需要在处理数据前运行脚本,比如为报告创建标题。BEGIN关键字就是用来做这个的。它会强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本

$ cat data3.txt 
Line 1
Line 2
Line 3
$
$ gawk 'BEGIN {print "The data3 File Contents:"} 
> {print $0}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3

2.6 在处理数据后运行脚本

END关键字允许你指定一个程序脚本,gawk会在读完数据后执行它。

$ gawk 'BEGIN {print "The data3 File Contents:"} 
> {print $0}
> END {print "End of File"}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
End of File
$

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

会做“减法”的项目经理,在工作中赢麻了!

都说我们在生活中要学会“断舍离”,其实工作中的一些事项、流程,也可以尽量精简!对于项目经理来说也是如此,每天会议很多、需求不断,要适当做好“减法”,才能更好朝着目标方向前进! 01、什么是做…

Linux 添加新用户之adduser 和 useradd 的区别 | 添加用户到 sudo 组【笔记型博文】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 ❤️ 创建新用户adduser 用法【推荐】useradd 用法 安装 sudo添加用户到 sudo 用…

Transformer学习(1):注意力机制

文章目录 什么是注意力如何实现注意注意力的计算过程总结 什么是注意力 在一张图像中,包含了各种信息,而我们会自动关注重要的信息。下图是注意力热力图,可以发现人们会注意兔子的脸这些重要信息。 而在深度学习中,输入数据包含…

Selenium自动化 Web 浏览器操作

文章目录 Selenium自动化 Web 浏览器操作Selenium简介安装Selenium安装WebDriver使用问题驱动加载报错版本不匹配 常用API创建实例定位元素鼠标事件表单相关多窗口切换等待显示等待隐式等待 文件上传下载经验总结 Selenium自动化 Web 浏览器操作 Selenium简介 Selenium可以模…

Bio-Linux-shell详解-1-从0开始

21世纪是数据的世纪,蓬勃发展的生物学积累了大量的数据,急需计算生物学、生物信息学及系统生物学等交叉学科大放异彩,而windows作为我们最熟悉的操作平台,并不能承担如此巨大的工作量,课题组的服务器因此承担了这个责任…

玩崩坏星穹铁道手机配置低、卡顿发烫、内存不足 GameViewer远程助你手机畅玩星铁PC端

9月10日,《崩坏:星穹铁道》迎来2.5版本「碧羽飞黄射天狼」!不知道大家有没有抽到 飞霄?这次崩铁还为我们送了10连和 1000星琼 ,上半卡池还有五星角色飞霄、知更鸟、卡芙卡、黑天鹅这四位角色,深受大家喜爱。…

Redis常用操作及springboot整合redis

1. Redis和Mysql的区别 数据模型:二者都是数据库,但是不同的是mysql是进行存储到磁盘当中,而Redis是进行存储到内存中. 数据模型 : mysql的存储的形式是二维表而Redis是通过key-value键值对的形式进行存储数据. 实际的应用的场景: Redis适合于需要快速读写的场景&…

在Word中,用VBA比较两段文本的相似度

效果1: 去掉字符串中回车,进行改进后效果: 代码: Function LevenshteinDistance(s As String, t As String) As IntegerDim d() As IntegerDim i As IntegerDim j As IntegerDim cost As IntegerDim sLen As IntegerDim tLen As IntegersLen…

nginx实现https安全访问的详细配置过程

文章目录 前言什么是 HTTP?什么是 HTTPS?HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的?配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP? HTTP,全称为“超…

IDEA 怎么编辑文件模板

1.打开设置2.打开编辑者,选择编辑文件模板 3.点击加号4.先随便编译一次5.之后编辑文件模板就有了

电脑浏览器访问华为路由器报错,无法访问路由器web界面:ERR_SSL_VERSION_OR_CIPHER_MISMATCH 最简单的解决办法!

This site can’t provide a secure connection192.168.2.1 uses an unsupported protocol. ERR_SSL_VERSION_OR_CIPHER_MISMATCH 以上是chrome浏览器访问报错 Secure Connection Failed An error occurred during a connection to 192.168.2.1. Peer using unsupported versio…

python 异步执行 apply_async 方法

1.项目需要读取hive表数据,并对返回的数据进行解析; select * from table ; 2.返回数据,根据库、表,对其进行 下一步执行; 中间遇到一个棘手的问题,在python线程池中,使用异步非阻塞 apply_a…

(k8s)kubernetes 挂载 minio csi 的方式(pod挂载pvc存在csi驱动问题,挂载不上)

一、安装Minio(Minio分布式集群搭建部署_minio集群最少几台-CSDN博客) 生成accessKeyID和secretAccessKey: 二、安装csi-s3插件(在k8s集群上) 首先我们把插件的yaml文件都下载下来,为了保证版本测试的一致性,我们下载…

如何在社交媒体上赚取(可观的)收入

有很多百万富翁是通过社交媒体粉丝建立起他们的财富的,而且其中大部分并不是Instagram网红或YouTube明星。 例如,Nick Huber通过社交媒体粉丝建立了几家企业,这些企业现在每月创造40万美元的收入。 而George Blackman在Twitter上仅有不到8,0…

微信自动回复设置真嘎嘎好用!

无论是商户、个人品牌还是普通用户,及时回应朋友和客户的信息至关重要。然而,手动一一回复既耗时又容易遗漏,这时,微信的自动回复功能就显得尤为重要。 今天,就教大家一招——通过个微管理系统,实现微信自…

怎么在线制作活码二维码?活码在电脑快速制作的方法

怎么制作活码类型的二维码?活码是现在很常用的一种内容展示,将内容通过二维码来展示,可以长期提供内容展示,而且在更新内容无需重新生码,可以直接在原码中修改。与其他方式相比有效提高内容传播的效率,在节…

【信号】SIGCHLD信号--了解

SIGCHLD是多少号信号呢?17号 我们知道用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作…

iptables实现内外网ip转换

准备三台虚拟机 内网访问外网 网络设置为仅主机(关闭DHCP功能) 设置一台双网卡机器充当iptables服务器 设置一台内网机 设置一台外网机,下载并开启httpd服务 在iptables服务器上设置iptables 在/etc/sysctl.conf中添加net.ipv4.ip_forwar…

零基础入门大模型,带你构建第一个大模型:实战指南

2017年是机器学习领域历史性的一年。Google Brain 团队的研究人员推出了 Transformer,它的性能迅速超越了大多数现有的深度学习方法。著名的注意力机制成为未来 Transformer 衍生模型的关键组成部分。Transformer 架构的惊人之处在于其巨大的灵活性:它可…

2024年上半年互联网黑灰产研究报告

2024年上半年,黑灰产从业人员人数超过427万,威胁猎人监测到国内作恶手机号数量高达323万,日活跃风险IP数量1136万,涉及洗钱银行卡数量19.5万。 近年来,数字化与实体经济的融合日渐深入,大规模业务线上场景…