windows ubuntu linux三剑客,sed awk grep 篇,1.

sed awk 提高你的 UNIX Linux 水平

第一章:Sed 语法和基本命令

所有的示例都要用到下面的 employee.txt 文件,请先行创建该文件。
$ vi employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
        上面的雇员数据,每行记录都包含下面几列:
        z 雇员 ID z 雇员姓名
        z 雇员职位
        Sed 代表 Strem Editor( 流编辑器 ), 是操作、过滤和转换文本内容的强大工具。 Sed 可以从文件
和管道中读取输入。在你的 bash 启动文件中,就可能有不少用来设置各种环境的 sed 命令,
对于新手来说, sed 脚本看起来可能比较晦涩难懂,一旦你详细理解了 sed 命令,你就可以
写出能解决很多复杂问题的 sed 脚本。

1.1 Sed 命令语法

        本部分内容旨在带你熟悉 sed 命令的语法和结构,但并不解释命令的含义,后面会详细解释
这些命令。
Sed 基本语法:
sed [options] {sed-commands} {input-file}
sed 每次从 input-file 中读取一行记录,并在该记录上执行 sed-commands
sed 首先从 input-file 中读取第一行,然后执行所有的 sed-commands ;再读取第二行,执行
所有 sed-commands, 重复这个过程,直到 input-file 结束
通过制定 [options] 还可以给 sed 传递一些可选的选项
 下面的例子演示了 sed 的基本语法,它打印出 /etc/passwd 文件中的所有行
sed –n ‘p’ /etc/passwd
该例子的重点在于, {sed-commands} 既可以是单个命令,也可以是多个命令。你也可以把多
sed 命令合并到一个文件中,这个文件被称为 sed 脚本,然后使用 -f 选项调用它,如下面
的例子:
使用 sed 脚本的基本语法:
sed [ options ] –f {sed-commands-in-a-file} {input-file}
下面的例子演示了使用 sed 脚本的用法,这个例子将打印 /etc/passwd 问中以 root nobody
开头的行:
$ vi test-script.sed
/^root/ p
/^nobody/ p
$ sed –n –f test-script.sed /etc/passwd
你也可以使用 –e 选项,执行多个 sed 命令,如下所示 :
-e 的使用方法:
sed [ options ] –e {sed-command-1} –e {sed-command-2} {input-file}
下面的例子演示了 -e 的使用方法,它打印 /etc/passwd 中以 root nobody 开头的行 :
sed –n –e ‘/^root/ p’ –e ‘/^nobody/ p’ /etc/passwd
如果使用-e 执行多个命令,也可以使用反斜杠\把它们分割到多行执行:
Sed –n \
-e ‘/^root/ p’ \
-e ‘/^nobody/ p’ \
/etc/passwd
也可以使用 { } 将多个命令分组执行:
{}的使用方法:
sed [options] ‘{
sed-command-1
sed-command-2
}’ input-file
下面的例子演示了 {} 的使用方法,打印 /etc/passwd 中以 root nobody 开头的行 :
sed –n ‘{
/^root/ p
/^nobody/ p
}’ /etc/passwd
注意 :sed 绝不会修改原始文件 input-file, 它只是将结果内容输出到标准输出设备。如果要保
持变更,应该使用重定向 > filename.txt

1.2 Sed 脚本执行流程

Sed 脚本执行遵从下面简单易记的顺序: Read,Execute,Print,Repeat( 读取,执行,打印,重复 )
简称 REPR
分析脚本执行顺序:
z 读取一行到模式空间 (sed 内部的一个临时缓存,用于存放读取到的内容 )
z 在模式空间中执行命令。如果使用了 { } –e 指定了多个命令, sed 将依次执行每
个命令
z 打印模式空间的内容,然后清空模式空间
z 重复上述过程,直到文件结束

1.3.打印模式空间(命令 p)

使用命令 p ,可以打印当前模式空间的内容。
sed 在执行完命令后会默认打印模式空间的内容,既然如此,那么你可能会问为何还需要命
p 呢。
有如下原因,命令 p 可以控制只输出你指定的内容。通常使用 p 时,还需要使用 -n 选项来
屏蔽 sed 的默认输出,否则当执行命令 p 时,每行记录会输出两次。
下面的例子打印 employee.txt 文件,每行会输出两次:
$ sed ‘p’ employee.txt
101,John Doe,CEO
101,John Doe,CEO
102,Jason Smith,IT Manager
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
105,Jane Miller,Sales Manager
输出 employee.txt 的内容,只打印一行 ( cat employee.txt 命令作用相同 ):
$ sed –n ‘p’ employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
指定地址范围
如果在命令前面不指定地址范围,那么默认会匹配所有行。下面的例子,在命令前面指定了
地址范围:
只打印第 2 :
$ sed -n '2 p' employee.txt
102,Jason Smith,IT Manager
打印第 1 至第 4 :
$ sed -n '1,4 p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
打印第 2 行至最后一行 ($ 代表最后一行 ):
$ sed -n '2,$ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
修改地址范围
可以使用逗号、加号、和波浪号来修改地址范围。
上面的例子里面,就已经使用了逗号参与地址范围的指定。其意思很明了 : n,m 代表第 n
m 行。
加号 + 配合逗号使用,可以指定相的若干行,而不是绝对的几行。如 n,+m 表示从第 n 行开
始后的 m
波浪号 ~ 也可以指定地址范围。它指定每次要跳过的行数。如 n~m 表示从第 n 行开始,每次
跳过 m 行:
z 1~2 匹配 1,3,5,7,……
z 2~2 匹配 2,4,6,8,……
z 1~3 匹配 1,4,7,10,…..
z 2~3 匹配 2,5,8,11,…..
只打印奇数行 :
$ sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
模式匹配
一如可以使用数字指定地址 ( 或地址范围 ), 也可以使用一个模式 ( 或模式范围 )来匹配,如下面
的例子所示。
打印匹配模式 ”Jane” 的行 :
$ sed -n '/Jane/ p' employee.txt
105,Jane Miller,Sales Manager
打印第一次匹配 Jason 的行至第 4 行的内容:
$ sed -n '/Jason/,4 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
注意 :如果开始的 4 行中,没有匹配到 Jason, 那么 sed 会打印第 4 行以后匹配到 Jason 的内
打印从第一次匹配 Raj 的行到最后的所有行:
$ sed -n '/Raj/,$ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
打印自匹配 Raj 的行开始到匹配 Jane 的行之间的所有内容:
$ sed -n '/Raj/,/Jane/ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
打印匹配 Jason 的行和其后面的两行:
$ sed -n '/Jane/,+2 p' employee.txt
105,Jane Miller,Sales Manager

4.删除行

命令 d 用来删除行,需要注意的是它只删除模式空间的内容,和其他 sed 命令一样,命令 d
不会修改原始文件的内容。
如果不提供地址范围, sed 默认匹配所有行,所以下面的例子什么都不会输出,因为它匹配
了所有行并删除了它们:
sed ‘d’ employee.txt
指定要删除的地址范围更有用,下面是几个例子:
只删除第 2 :
$ sed '2 d' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
删除第 1 至第 4 行:
$ sed '1,4 d' employee.txt
105,Jane Miller,Sales Manager
删除第 2 行至最后一行:
$ sed '2,$ d' employee.txt
101,John Doe,CEO
只删除奇数行:
$ sed '1~2 d' employee.txt
102,Jason Smith,IT Manager
104,Anand Ram,Developer
删除匹配 Manager 的行:
$ sed '/Manager/ d' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
删除从第一次匹配 Jason 的行至第 4 行:
$ sed '/Jason/,4 d' employee.txt
101,John Doe,CEO
105,Jane Miller,Sales Manager
如果开头的 4 行中,没有匹配 Jason 的行,那么上述命令将删除第 4 行以后匹配 Manager
的行
删除从第一次匹配 Raj 的行至最后一行:
$ sed '/Raj/,$ d' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
删除第一次匹配 Jason 的行和紧跟着它后面的两行:
$ sed '/Jason/,+2 d' employee.txt
101,John Doe,CEO
105,Jane Miller,Sales Manager
常用的删除命令示例:
删除所有空行
sed ‘/^$/ d’ employee.txt
删除所有注释行(假定注释行以#开头)
sed ‘/^#/ ‘ employee.txt
注意:如果有多个命令, sed 遇到命令 d 时,会删除匹配到的整行数据,其余的命令将无法
操作被删除的行。

1.5把模式空间内容写到文件中(w 命令)

        命令 w 可以把当前模式空间的内容保存到文件中。默认情况下模式空间的内容每次都会打
印到标准输出,如果要把输出保存到文件同时不显示到屏幕上,还需要使用 -n 选项。
下面是几个例子:
employee.txt 的内容保存到文件 output.txt,同时显示在屏幕上
$ sed 'w output.txt' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
$ cat output.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
把 employee.txt 的内容保存到文件 output.txt,但不在屏幕上显示
$ sed -n 'w output.txt' employee.txt
$ cat output.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
只保存第 2 行:
$ sed -n '2 w output.txt' employee.txt
$ cat output.txt
102,Jason Smith,IT Manager
保存第 1 至第 4 行:
$ sed -n '1,4 w output.txt' employee.txt
$ cat output.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
保存第 2 行起至最后一行:
$ sed -n '2,$ w output.txt' employee.txt
$ cat output.txt
102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
只保存奇数行:
$ sed -n '1~2 w output.txt' employee.txt
$ cat output.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
保存匹配 Jane 的行:
$ sed -n '/Jane/ w output.txt' employee.txt
$ cat output.txt
105,Jane Miller,Sales Manager
保存第一次匹配 Jason 的行至第 4 行:
$ sed -n '/Jason/,4 w output.txt' employee.txt
$ cat output.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
注意:如果开始的 4 行里没有匹配到 Jason, 那么该命令只保存第 4 行以后匹配到 Jason
保存第一次匹配 Raj 的行至最后一行:
$ sed -n '/Raj/,$ w output.txt' employee.txt
$ cat output.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
保存匹配 Raj 的行至匹配 Jane 的行:
$ sed -n '/Raj/,/Jane/ w output.txt' employee.txt
$ cat output.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
保存匹配 Jason 的行以及紧跟在其后面的两行:
$ sed -n '/Jason/,+2 w output.txt' employee.txt
$ cat output.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。
曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。
本文只交流学习,不为获利,侵权联系立删

相关推荐

  1. windows ubuntu linux剑客,sed awk grep 1.

    2024-04-24 11:30:06       29 阅读
  2. Linux文本剑客1

    2024-04-24 11:30:06       43 阅读
  3. linux剑客

    2024-04-24 11:30:06       26 阅读
  4. Docker 剑客

    2024-04-24 11:30:06       30 阅读
  5. redis-缓存剑客

    2024-04-24 11:30:06       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-24 11:30:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 11:30:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 11:30:06       87 阅读
  4. Python语言-面向对象

    2024-04-24 11:30:06       96 阅读

热门阅读

  1. 深入浅出MySQL-01-【SQL基础】

    2024-04-24 11:30:06       30 阅读
  2. 停车场管理系统(栈和队列的实现和应用)(cpp)

    2024-04-24 11:30:06       37 阅读
  3. 各类数据引擎指定schema或者数据库

    2024-04-24 11:30:06       32 阅读
  4. linux中新建一个超级管理员

    2024-04-24 11:30:06       39 阅读
  5. vue-json-editor

    2024-04-24 11:30:06       36 阅读
  6. map_or

    2024-04-24 11:30:06       32 阅读
  7. 如何对同一docker注册表使用多个身份验证/登录

    2024-04-24 11:30:06       31 阅读
  8. 深入Spring Boot配置机制:如何高效管理应用配置

    2024-04-24 11:30:06       27 阅读