linux三剑客-grep、sed、awk

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]

posted @ 2024-06-28 22:16  权杖攻城狮  阅读(170)  评论(0编辑  收藏  举报