Linux三剑客(sed、awk、grep)

1、sed

sed(stream editor,流编辑器)是Linux下一款强大的非交互式流式文本编辑器(vim是交互式文本编辑器),可以对文本文件的每一行数据匹配查询之后进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文本的编辑。

sed是一种流编辑器,它一次处理一行内容,将这行放入缓存(模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。

sed [选项参数] [模式匹配/sed程序命令] [文件名]

# 模式匹配,sed会读取每一行数据到模式空间中,之后判断当前行是否符合模式匹配要求,符合要求就会执行sed程序命令,否则不会执行sed命令,如果不写匹配模式,那么每一行都会执行sex程序命令

选项参数:

选项参数功能
-e直接在命令模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项,一行命令语句可以执行多条sed命令
-i直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-f后跟保存了sed指令的文件
-n取消默认输出,sed默认会输出所有文件内容,使用-n参数后只显示处理过的行
-r使用扩展正则表达式,默认情况sed只识别基本正则表达式*

sed程序命令功能描述:

命令功能描述
aadd新增,a的后面可以接字串,在下一行出现
cchange更改,更改匹配行的内容
ddelete删除,删除匹配的内容
iinsert插入,响匹配前插入内容
pprint打印,打印出匹配的内,通常与-n选项合用
ssubstitute替换,替换掉匹配的内容
=用于打印被匹配的行的行号
n读取下一行,遇到n时会自动跳入下一行

特殊符号:

命令功能描述
!就像一个sed命令,放在限制条件后面,对指定行以外的所有行应用命令(取反)
{sed命令1;sed命令2}多个命令操作同一个的行

向文件中添加数据

# 向第三行后面增加hello
sed '3ahello' sed.txt

# 向指定内容前后增加hello
sed '/abc/ihello' sed.txt	# 在指定的abc前面添加hello
sed '/abc/ahello' sed.txt 	# 在指定的abc后面添加hello

# 在最后一行后面添加hello
sed '$ahello' sed.txt

3,代表第三行

a,代表在后面添加,出现在下一行

i,代表在前面添加,出现在上一行

$,代表在最后一行添加

注意:没有修改源文件

文件中删除数据

# 删除第二行
sed '2d' sed.txt

# 删除奇数行
sed '1~2d' sed.txt		# 1~2表示从第一行开始,间隔2行

# 删除指定范围的多行数据
sed '1,3d' sed.txt		# 删除第1行到第3行的数据

# 删除第一行到第三行的取反数据
sed '1,3!d' sed.txt

# 删除最后一行数据
sed '$d' sed.txt

# 删除匹配abc的行
sed '/abc/d' sed.txt

# 删除匹配abc到最后一行
sed '/abc/$d' sed.txt

d,代表删除

1~2,代表从第1行开始,间隔2行

1,3,代表从第1行到第3行

1,3!,代表从第1行到第3行取反的数据

更改文件中的数据

# 将文件的第一行改为hello
sed '1chello' sed.txt

# 将包含abc的行修改为hello
sed '/abc/chello' sed.txt

# 将最后一行修改为hello 
sed '$chello' sed.txt

# 将文本中的abc替换为hello
sed 's/abc/hello/' sed.txt		# 默认只替换每行第一个abc

# 将文本中的所有abc替换为hello
sed 's/abc/hello/g' sed.txt

# 将文本中的第二个abc替换为hello
sed 's/abc/hello/2' sed.txt

# 将文本中每行末尾拼接test
sed 's/$/& test/' sed.txt

c,代表修改

s,代表替换

g,代表所有

2,代表第二个

&,代表拼接

查询文件或管道中的数据

# 查询含有abc的行数据
sed -n '/abc/p' sed.txt

# 管道查询所有进程中含有sshd的进程信息命令
ps -aux | grep sshd				# 方式1

ps -aux | sed -n '/sshd/p'		# 方式2

-n,代表匹配

p,代表打印

多个sed程序命令执行

# 将sed.txt文件中的第一行删除并将abc替换为hello

sed -e '1d' -e 's/abc/hello/g' sed.txt
sed '1d;s/abc/hello/g' sed.txt

1.1缓存区数据交换

模式空间与暂存空间

sed把文件读出来每一行存放的空间叫模式空间,会在改空间中对读到的内容做相应处理。

暂存空间刚开始里面只有个空行。

sed可以使用相应的命令从模式空间往暂存空间放入内容或从暂存空间取内容放入模式空间

缓存区sed程序命令:

命令含义
h模式空间里面的内容复制到暂存空间缓存区(覆盖方式)
H模式空间里面的内容复制到暂存空间缓存区(追加方式)
g暂存空间里面的内容复制到模式空间缓存区(覆盖方式)
G缓存空间里面的内容复制到模式空间缓存区(追加方式)
x交换2个空间的内容

示例:

1、第一行粘贴到最后一行(将模式空间第一行复制到暂存空间【覆盖方式】,并将暂存空间的内容复制到模式空间中的最后一行【追加方式】)

sed '1h;$G' sed.txt

2、第一行删除后粘贴到最后一行(将模式空间第一行复制到暂存空间【覆盖方式】并删除,最后将暂存空间的内容复制到模式空间中的最后一行【追加方式】)

sed '1{h;d};$G' sed.txt		# 多个命令操作同一行数据使用{}括起来

3、第一行数据复制粘贴替换其他行数据(将模式空间第一行复制到暂存空间【覆盖方式】,最后将暂存空间的内容复制到模式空间中替换从第二行开始到最后一行的每一行数据【覆盖方式】)

sed '1h;2,$g' sed.txt

4、将前三行的数据复制粘贴到最后一行(将前三行数据复制到暂存空间【追加方式】,之后将暂存空间的所有内容复制粘贴到模式空间最后一行)

sed '1,3H;$G' sed.txt

5、给每一行添加空行

sed 'G' sed.txt

6、删除文件中的空行

sed '/^$/d' sed.txt

2、awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大,简单来说awk就是把文件逐行的读入,以空格为默认分割符将每行切片,切开的部分再进行各种分析处理,因为切开的部分使用awk可以定义变量,运算符,使用流程控制语句进行深度加工与分析。

awk [options] 'pattern{action}' {filenames}

options:选项参数

pattern:表示awk在数据中查找的内容,就是匹配模式

action:在找到匹配内容时执行的一些列命令

选项参数:

选项参数功能
-F指定输入文件拆分分隔符
-v赋值一个用户定义变量

awk内置变量

内置变量含义
ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价与命令行-F选项
NF浏览记录的域的个数,根据分隔符分割后的列数
NR已读的记录数,也是行号
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符
$n$0变量是指定整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域…以此类推
$NF$NF是number finally,表示最后一列的信息,跟变量NF是由区别的,变量NF统计的是每行列的总数

示例:

1、默认每行空格切割数据

echo "abc 123 456" | awk '{print $1"&"$2"&"$3}'
abc&123&456			# 结果

print:打印

2、打印含有匹配信息的行(搜索passwd文件有root关键字的所有行)

awk '/root/{print $0}' passwd

3、打印匹配行中第7列数据(搜索passwd文件中有root关键字的所有行,然后以“:”拆分并打印输出第七列)

awk -F: '/root/{print $7}' passwd
awk -F ":" '/root/{print $7}' passwd

4、打印文件每行属性信息(统计passwd文件名,每行的行号,每行的列数,对应的完整行内容)

awk -F: '{print "文件名:"FILENAME",行号:"NR",列数:"NF",内容:"$0}' passwd

awk -F: '{printf("文件名:%s,行号:%s,列数:%s,内容:%s\n",FILENAME,NR,NF,$0)}' passwd

printf:将字符串格式化输出

\n:换行

5、打印第二行信息

awk -F: 'NR==2{printf(filename:%s,内容:%s\n,FILENAME,$0)}' passwd

6、查找以c开头的资源

ls -a | awk '/^c/'

7、打印第一列信息

awk -F: '{print $1}' passwd

8、打印最后一列信息

awk -F: '{print $NF}' passwd

9、打印倒数第二列信息

awk -F: '{print $(NF-1)}' passwd

10、打印10到20行的第一列信息

awk -F: '{if(NR>=10 && NR<=20){print $1}}' passwd

11、多分隔符使用

echo "one:two/three" | awk -F "[:/]" '{print $1"&"$2"&"$3}'

12、添加开始与结束内容

echo -e "abc\nabc" | awk 'BEGIN{pinrt "开始..."}{print $0}END{print:"结束..."}'

13、使用循环拼接分割后的字符串

echo "abc    asd qwe" | awk '{print $1"&"$2"&"$3}'

echo "abc    asd qwe" | awk -v str="" '{for(n=1;n<=NF;n++){str=str$n}} END{print str}'

14、操作指定数字运算

echo "2.1" |awk -v i=1 '{print $0+i}'

15、切割ip

ifconfig | awk '/broadcast/{print $0}' | awk '{print $2}'

16、显示空行行号

sed 'G' sed.txt | awk '/^$/{print NR}'

3、grep

通过grep命令,从文件中通过关键字过滤文件行

grep [-n -i -v] 关键字 文件路径

选项-n,可选,表示在结果中显示匹配的行的行号。
选项-i,可选,表示在结果中显示匹配的信息(忽略大小写)。
选项-v,可选,表示在结果中显示匹配的信息(反向排除)。

关键字:必填,表示过滤的关键字,带有空格或其他特殊符号使用 “ ” 将关键字包围

文件路径:必填,表示要过滤内容的文件路径。可以作为内容输入端口

3.1、管道符 |

含义:将管道符左边命令的结果作为右边的输入

cat test.txt | grep -n "linux"
ls /usr/bin | wc -l
cat test.txt | grep -n "linux" | grep -n "hello"

小结:

grep:用于查找匹配的行

sed:增删改查数据,用于在文件中以行来截取数据进行增删改查

awk:截取查询分析数据,可以在某个文件中以竖列来截取分析数据,如果字段之间有很多空白字符也可以获取所需要的数据。

posted @ 2025-03-19 09:41  叶小格  阅读(0)  评论(0)    收藏  举报  来源