linux三剑客-grep、sed、awk

news/2024/10/4 18:17:04/文章来源:https://www.cnblogs.com/hoaprox/p/18269422

Linux三剑客是Linux系统中最重要的三个命令,它们以其强大的功能和广泛的应用场景而闻名。这三个工具的组合使用几乎可以完美应对Shell中的数据分析场景,因此被统称为Linux三剑客。

1、grep

grep是一个强大的文本搜索工具,用于在文件内容中查找指定的字符串,并将匹配到的行输出到标准输出。grep命令支持多种选项和模式匹配,使得在文件中搜索特定内容变得非常灵活和高效。
文本搜索命令;

  • 命令格式为:
grep "搜索的字符串" 文件名

1)基础

参数:
-c:统计出现的次数
-i:不区分大小写
-n:输出行号

2)实例

统计出现的次数
grep -c "xx" text.log

2、sed

sed是一个流编辑器,主要用于对输入流(或文件)进行基本的文本转换。它可以用来查找、新增、删除和修改替换文本中的数据。sed命令的强大之处在于它可以对文本进行非交互式的编辑,从而提高了处理大量文本的效率。

1)基本概念

sed是一种流编辑器,它是文本处理工具,支持正则表达式,通过一行一行的遍历,执行相应的命令,来处理、编辑文本文件。
(1)语法
sed [选项] ‘command’ 文件名称

选项部分,常见选项包括-n,-e,-i,-f,-r选项。
command部分包括:[地址1,地址2] [函数] [参数(标记)]

(2)命令格式为:

sed [-nefri] '命令' 文本
cat 文本 | sed [-nefr] '命令'
echo '.....' |sed [-nefr] '命令'

2)选项(nefri)

(1)选项-n

sed默认会把模式空间处理完毕后的内容输出到标准输出,也就是输出到屏幕上,加上-n选项后被设定为安静模式,也就是不会输出默认打印信息,除非子命令中特别指定打印选项,则只会把匹配修改的行进行打印。
(2)选项-e

如果需要用sed对文本内容进行多种操作,则需要执行多条子命令来进行操作。

(3)选项-i

sed默认会把输入行读取到模式空间,简单理解就是一个内存缓冲区,sed子命令处理的内容是模式空间中的内容,而非直接处理文件内容。因此在sed修改模式空间内容之后,并非直接写入修改输入文件,而是打印输出到标准输出。如果需要修改输入文件,那么就可以指定-i选项。

(4)选项-f

还记得 -e 选项可以来执行多个子命令操作,用分号分隔多个命令操作也是可以的,如果命令操作比较多的时候就会比较麻烦,这时候把多个子命令操作写入脚本文件,然后使用 -f 选项来指定该脚本。

(5)选项-r
sed命令的匹配模式支持正则表达式的,默认只能支持基本正则表达式,如果需要支持扩展正则表达式,那么需要添加-r选项。

3)命令(acdipynNs)

a新增,c取代,d删除,i插入,p打印,y将字符转成另一个字符等

[root@localhost sed]# cat message
1a
2b
3c
4d
5e
6f
abcdABCD

(1)a

子命令a表示在指定行下边插入指定行的内容。

#将message文件中每一行下边都插入添加一行内容是A
sed 'a A' message
#将message文件中1-2行的下边插入添加一行内容是A
sed '1,2a A' message
#将message文件中1-2行的下边分别添加3行,3行内容分别是A、B、C,这里使用了\n,插入多行内容都可以按照这种方式来实现。
sed '1,2a A\nB\nC' message

(2)i

子命令i和a使用上基本上一样,只不过是在指定行上边插入指定行的内容。

#将message文件中每一行上边都插入添加一行内容是A
sed 'i A' message
#将message文件中1-2行的上边插入添加一行内容是A
sed '1,2i A' message
#将message文件中1-2行的上边分别添加3行,3行内容分别是A、B、C,这里使用了\n,插入多行内容都可以按照这种方式来实现
sed '1,2i A\nB\nC' message

(3)c

子命令c是表示把指定的行内容替换为自己需要的行内容。

#将message文件中所有的行内容都分别替换为A行内容
sed 'c A' message
#将message文件中1-2行的内容替换为A,注意这里说的是将1-2行所有的内容只替换为一个A内容,也就是1-2行内容变成了一行,定址如果连续就是这种情况
sed '1,2c A' message
#将message中1-2行内容分别替换为了A,需要在替换内容上手动加换行\n,这样当然也可以将一行内容替换为多行内容
sed '1,2c A\nA' message

(4)d

子命令d表示删除指定的行内容,比较简单,更容易理解。

#将message所有行全部删除,因为没有加定址表达式,所以平时如果需要删除指定行内容,需要在子命令前加定址表达式
sed 'd' message
#将message文件中1-3行内容删除
sed '1,2d' message

(5)y

子命令y表示字符替换,可以替换多个字符,只能替换字符不能替换字符串,且不支持正则表达式,

#把message中所有a字符替换为A符号,所有b字符替换为B符号
sed 'y/aB/Ab/' message

(6)=

子命令=,可以将行号打印出来。

#将指定行的上边显示行号
sed '1,2=' message

(7)r

子命令r,类似于a,也是将内容追加到指定行的后边,只不过r是将指定文件内容读取并追加到指定行下边。

#将r.txt文件内容读取并插入到message文件第1行的下边
sed '1r r.txt' message

(8)s

子命令s为替换子命令,是平时sed使用的最多的子命令,没有之一。因为支持正则表达式,功能变得强大无比,下边来详细地说说子命令s的使用方法。
基本语法:
[address]s/pattern/replacement/flags

  • flags
flags 说明
n 可以是1-512,表示第n次出现的情况进行替换
g 全局更改
p 打印模式空间的内容
w file 写入到一个文件file中
#b全局换成x
sed 's/b/x/g' message

4)实例

(1)test.txt的第一行前插入“a new line”

sed -i '1i\a new line' text.txt

(2)在第三行新增一行

sed -i '3a \a new line' text

3、awk

awk是一个文本处理工具,用于对文本或数据进行模式扫描和处理。它可以根据定位到的数据行处理其中的分段,并进行数据切片或执行其他操作。awk命令非常适合进行数据提取和报告生成等任务,是Linux系统中进行文本和数据处理的利器。

1)基本概念

awk是结构化数据处理程序;
awk是一门数处理领域的语言;
awk拥有c语言式的语法结构,例如print是语句,但不是函数;
(1)语法
awk [选项] '匹配规则和处理规则 ' [处理文本路径]

  • 匹配规则主要是:正则表达式、字符串
  • 处理规则主要是:设置变量、设置数组、定义函数(用的比较少)、数组循环、加减乘除运算、字符串拼接

(2)命令格式为:

awk [选项] 'BEGIN{定义1;定义2;}/模式/{操作1;操作2}END{操作1;操作2}' file1 file2

选项:如-F:指定分隔符为:
BEGIN{} : BEGIN是在awk处理文本之前运行
/模式/ : 使用的匹配规则,模式为正则或者字符串
{} :循环(每次只处理一行数据),如{print $1}打印第一列
END{} :当所有的处理全部执行完毕之后,执行END中的相关操作

2)操作符:~、==、!=、>等

如:

#当前行匹配以a开头成功时则执行后面的打印 
awk '/^a/ {print $1}'

上面正则匹配的范围是整行的内容,如果只想匹配指定字段的内容,则可以这样使用:

awk '$n~/^1/ {print $1}'

通过~符号规定了正则的匹配操作范围【这里是字段n】,~叫做匹配操作符

3)BEGIN和AND:

BEGIN里面可以打印一些字符串,或者定义变量(变量名="值" ,值不是数字的话,必须要用双引号括起来,引用变量的时候,变量前面是不要加$的)。
END里面可以打印一些字符串,或者进行最终的计算。如果在BEGIN里面没有定义变量的话,最终也可以引用这个变量的,只是变量值为空,在awk里面变量是可以不预先定义;

4)选项

参数 解释
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令

5)常见变量:

内置变量 解释
FS 默认输入列分隔符(空格和tab)
OFS 默认输出列分隔符(空格)
NF 每行有几段(列)(print $NF代表打印最后一列)
RS 默认输入行分隔符(\n)
ORS 默认输出行分隔符(\n)
FILENAME 当前所操作文件名称
NR 读取每行时当前的行号(对于合并文件来说,不同文件行号连续显示)
FNR 读取每行时显示当前的行号(对于合并文件来说,不同文件行号不连续显示)

$0:表示当前整行,$1表示第一个字段,$2表示第二个字段,$n 表示第n个字段;

6)判断:

7)实例

(1)默认分隔符是空格和tab,打印第二列

ps |awk '{print $2}'

(2)分隔符是冒号,打印第一、二列,并用空格分隔

awk -F ":" '{print $1,$2}' /etc/passwd

(3)分隔符是冒号,打印第一、二列,并用指定符号分隔

awk -F ":" '{print $1"--"$2}' /etc/passwd

(4)分隔符是冒号和逗号,打印第一、二列,并用指定符号分隔

awk -F "[:,]" '{print $1"--"$2}' /etc/passwd

(5)默认分隔符,打印以d开头的行的第一列

docker ps |awk '/^d/ {print $1}'

(6)默认分隔符,打印第n列以d开头的行的第一列

docker ps |awk '$n~/^d/ {print $1}'

(7)在打印前指定分隔符变量FS为冒号和逗号

awk 'BEGIN{FS="[:,]"}{print $1}' /etc/passwd

(8)在打印前指定分隔符变量FS为冒号和逗号,定义变量line

awk 'BEGIN{FS="[:,]";line=1}{print $line}' /etc/passwd

(9)定义变量sum计算和,每次输出计算结果,最终输出

awk 'BEGIN{FS="[,:]";sum=0}{sum+=$3;print sum}END{print "sum=",sum}' /etc/passwd

(10)打印当前文件名称

awk '{pring FILENAME}' /etc/passwd

参考:
[https://www.cnblogs.com/liwei0526vip/p/5644163.html]

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联通网络无法使用FTP,无法使用21端口连接的解决方法

最近家里换了联通的网络,结果发现连接不上FTP了,本来以为是软件的问题。最后发现只有21端口的FTP连接不上,其它的端口没问题。 首先想到的是肯定是联通的光猫把21端口给关闭了。然后就想着通过192.168.1.1来设置一下光猫。专业网站制作、系统开发订制、微信公众号开发、接外…

LINUX命令-sed

sed命令是用于对文本文件做内容操作的神器,常见的增删改都可以,熟练运用可提高shell脚本编写能力和在terminal下的工作效率。本文编辑小绝技-sed sed命令是用于对文本文件做内容操作的神器,常见的增删改都可以,查没必要用它,用grep或者gvim打开用vim的搜索匹配就行。 sed …

毕业好几年了还要考研吗?

其实,毕业多少年都不影响我们考研,因为考研本身并没有年限或者年龄上的限制。所以,在是否考研这个问题上,我们真正应该思考的是,我们是否已经对未来做了一个比较合理的规划,考研这件事是否在未来的规划中有着重要的影响,如果是,而且现实条件也允许我们去考,那么,就应…

ubuntu 下使用netplan配置网络

一个yaml走遍天下。 netplan 是Ubuntu底层网络配置的封装,它允许使用yaml的方式“声明式”的配置底层网络,不管底层网络是NetworkManager还是networkd. netplan 官网,使用静态配置的示例: https://netplan.readthedocs.io/en/stable/netplan-tutorial/#using-static-ip-add…

(并查集+双向映射)

题意: 思路: 题目就是让我们实现把一个代表数x的集合加到另一个代表数y的集合中多次操作,这个很容易想到用并查集维护,将相同数字的下标放到一个集合中,集合所代表的数字,用“集合的首领”和代表的数字做一个双射,这样既能表示出集合所带表的数,还能辅助之后输出集合,…

2024年Java学习路线

java 最新学习路线2024Java学习路线(快速版) 核心基础:Java基础→MySQL→JDBC→JavaWeb 微服务核心:Maven→Gradle→Spring6→SpringMVC→MyBatis→MyBatisPlus→SSM →Redis7→SpringBoot2→SpringCloud 微服务生态:Git→Docker→Elasticsearch→ZooKeeper→Nginx→Sprin…

DApp设计与开发 课程笔记(二)remix | hardhat | 测试驱动开发

笔记对应课程内容为成都信息工程大学区块链产业学院老师梁培利的DApp 设计与开发 04-06 课 笔记中提到的名词不做过多解释 不懂就搜!Remix IDE的基本使用 官网:https://remix.ethereum.org/建议使用其网页版而不是桌面版,侧重于比较实用的特性而不是全部的介绍。 支持编写合…

DApp设计与开发 课程笔记(二)

笔记对应课程内容为成都信息工程大学区块链产业学院老师梁培利的DApp 设计与开发 04-06 课 笔记中提到的名词不做过多解释 不懂就搜!Remix IDE的基本使用 官网:https://remix.ethereum.org/建议使用其网页版而不是桌面版,侧重于比较实用的特性而不是全部的介绍。 支持编写合…

OOP第三次博客

write_by_23201707_gongjunjie oop第三次博客 一:前言 这次博客不出意外是oop课程的最后一次博客了,不过这次博客pta只有两题,但是我想说的是,最后一次pta也是够难的, 但是好像我自己的设计也有很大的问题,第七次pta遗留下了一点问题,导致第八次出现了很多问题 二:关于…

cpp

没有合适的默认构造函数可用 加上这个地方就ok

ingress-nginx-controller部署

Ingress Controller介绍及部署实践 1. 概念 1.1 Ingress Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 下面是 Ingress 的一个简单示例,可将所有流量都发送到同一 Service:通过配置,Ingress 可为 Service 提供外…

chrome 谷歌浏览器,F12 开发者工具打开太慢问题

把语言 English(UK) 设置为 English(US) 就可以解决打开速度慢的问题。linhuaming