Linux之grep,sed,awk语句

本文详细介绍了Linux中的文本处理工具grep、sed和awk,特别是sed的编辑流程和awk脚本编写。sed作为流编辑器,通过读取、执行和显示三个步骤处理文本,包括替换、删除、增加等内容。awk则擅长处理字段,提供多种内建变量和操作符,适合格式化文本。文本三剑客各有侧重点,grep适用于查找,sed适合编辑,awk则擅长格式化和复杂处理。
摘要由CSDN通过智能技术生成

目录

 2.sed编辑器及其工作流程

2.1 命令格式及常用选项

 2.2 动作说明

2.3 准备文本

2.4 增加内容

2.5 插入内容

2.6 删除内容

2.7 替换内容

2.8 多个匹配

2.9 转换内容

2.10 打印内容

3.sed高级用法

3.1 多行模式空间

3.2 追加下一行

3.3 多行删除

3.4 多行打印

3.5 包含那一行

4.编写awk脚本

4.1 awk命令及其格式

4.2 awk常见内建变量

4.3 按行输出文本

 4.4 按字段输出文本与-F指定分隔符

4.4 awk命令中两种特殊模式与系统变量

4.5 算数操作符

4.6 关系操作符和布尔操作符

4.7 获取文本信息

4.8 格式化打印


awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

 2.sed编辑器及其工作流程

sed编辑器:
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

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


sed的工作流程主要包括读取、执行和显示三个过程:

1.读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)

2.执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。

3.显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

2.1 命令格式及常用选项

sed -e '格式' 文件1 文件2 ...

sed -n -e ‘操作’ 文件1 文件2 ...

sed -f 脚本文件 文件1 文件2 ...

sed -i -e '操作' 文件1 文件2 ...

sed -e ' n { 操作1 操作2 ... } ' 文件1 文件2

-e或- -expression=: 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一 般在执行多个操作命令使用

f或- -file=: 表示用指定的脚本文件来处理输入的文本文件。

h或- -help: 显示帮助。

-n、- -quiet或silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。

-i: 直接修改目标文本文件。

 2.2 动作说明

s : 替换,替换指定字符。

d : 删除,删除选定的行。

a :增加,在当前行下面增加一行指定内容。

i  :插入,在选定行,上面插入一行指定内容。

c :替换,将选定行替换为指定内容。

y :字符转换,转换前后的字符长度必须相同。

p :打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用

2.3 准备文本

# 我们先准备一个文件做测试内容如下
[root@c83 zmq]# cat linux 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test

2.4 增加内容

# 增加内容
# 1.使用命令sed 3anewfile linux这个命令的意思就是,在第三行后面追加newLine这么一行字符,字符前面要用反斜线作区分。执行完毕之后可以看到结果

[root@c83 zmq]# sed '3anewfile' linux 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
newfile
Linux test

# 2.但是注意,这个只是将文字处理了,没有写入到文件里,文件里还是之前的内容。

其实 a 前面是可以匹配字符串,比如我们只想在出现 Linux 的行后面追加,就可以:sed /Linux/anewfile linux,两个斜线之间的内容是需要匹配的内容。可以看出,只有第二、第四行有Linux,所以结果如下:
[root@c83 zmq]# sed '/Linux/anewfile' linux 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
newfile
This is a linux testfile!  
Linux test
newfile

# 3.这里用引号把整个表达式括起来也可以,还方便处理带空格的字符
sed /Linux/anewline linux 等效于 sed '/Linux/anewline' linux

2.5 插入内容

# 插入内容
# 1.跟 a 类似,sed 3inewline linux是在第三行前面插入newfile:
[root@c83 zmq]# sed '3inewfile' linux 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
newfile
This is a linux testfile!  
Linux test

# 2.sed /Linux/inewfile linux是在所有匹配到Linux的行前面插入:
[root@c83 zmq]# sed '/Linux/inewfile' linux 
HELLO LINUX!  
newfile
Linux is a free unix-type opterating system.  
This is a linux testfile!  
newfile
Linux test

# 可以看出插入的用法和增加很相似。

2.6 删除内容

# 删除内容
# 1.删除的字符是d,用法跟前面也很相似,就不赘述,例子如下:
[root@c83 zmq]# sed '/Linux/d' linux 
HELLO LINUX!  
This is a linux testfile! 

# 可以看到匹配到的Linux行全被删了

2.7 替换内容

# 替换内容
# 1.替换也是一样,字符是c。举个例子
[root@c83 zmq]# sed '/Linux/cWindows' linux 
HELLO LINUX!  
Windows
This is a linux testfile!  
Windows

# 可以看到将匹配到的Linux行全部替换为Windows

# 2.替换还有个字符是s,但是用法由不太一样了,最常见的用法:sed 's/old/new/g'其中old代表想要匹配的字符,new是想要替换的字符,比如:
[root@c83 zmq]# sed 's/Linux/Windows/g' linux 
HELLO LINUX!  
Windows is a free unix-type opterating system.  
This is a linux testfile!  
Windows test

# 这里可以看到是将Linux这一个字符替换为Windows,而不是整行内容
# 这里的/g的意思是一行中的每一次匹配,因为一行中可能匹配到很多次
# 举个例子
# 编辑一个新文本
[root@c83 zmq]# cat xx 
aaaaaaaa
bbbbabbb
cccaabbb

# 3.假设我们想把一行中的第三次及以后出现的a变成大写A,那应该这么写:
[root@c83 zmq]# sed  's/a/A/3g' xx
aaAAAAAA
bbbbabbb
cccaabbb

# 可以看出只有第一行的有的改了,因为第二第三行没有这么多a出现。
# 关于s还有很多用法,还是回到第一个文件,比如可以用/^/和/$/分别代表行首和行尾:


2.8 多个匹配

# 1.用-e命令可以执行多次匹配,相当于顺序依次执行两个sed命令:
[root@c83 zmq]# sed -e 's/Linux/Windows/' linux
HELLO LINUX!  
Windows is a free unix-type opterating system.  
This is a linux testfile!  
Windows test

[root@c83 zmq]# sed -e 's/Linux/Windows/' -e 's/Windows/Mac OS/' linux
HELLO LINUX!  
Mac OS is a free unix-type opterating system.  
This is a linux testfile!  
Mac OS test

# 相当于在前面命令的基础上执行后面的命令

2.9 转换内容

# 转换命令是特有的,不仅因为它在所有的sed命令中拥有最小的肋记符。这个命令按位置将字符串abc中的每个字符,都转换成字符串xyz中的等价字符,它的语法如下:    y/abc/ABC/

# 查看文本
[root@c83 zmq]# cat linux 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test

# 1.现在我们将文本内容全部变成大写字母
[root@c83 zmq]# sed  'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' linux
HELLO LINUX!  
LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
THIS IS A LINUX TESTFILE!  
LINUX TEST

# 2.将Linux这一行文本内容全部变成大写字母
[root@c83 zmq]# sed  '/Linux/{y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/}' linux
HELLO LINUX!  
LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
This is a linux testfile!  
LINUX TEST

2.10 打印内容

# 打印命令(p)输出模式空间的内容。它既不清除模式空间也不改变脚本中的控制流。然而,它频繁地用在改变流控制的命令(d,N, b)之前。除非抑制(-n)默认的输出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值