sed

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

  1. sed [OPTION]... {script-only-if-no-other-script} [input-file]...

选项说明:

  • -i[SUFFIX], —in-place[=SUFFIX] 以脚本处理并写入文件
  • -e script, —expression=script 以脚本处理后输出
  • -f script-file, —file=script-file 以脚本文件内容操作文件
  • -n, —quiet, —silent 只输出匹配到的行
  • —help 帮助
  • —version 版本

动作说明:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

示例

以下示例以此文件为原始文件:

  1. $ cat > a <<EOF
  2. > 1
  3. > 2
  4. > 3
  5. > 4
  6. > 5
  7. > EOF
  8. $ cat a
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5

列出文件内容

仅列出目标文件2-3行内容

$ sed -n '2,3p' a
2
3

仅输出

使用 -e 选项 仅输出修改后的内容, 不改变文件内容本身

$ sed -e '4a\newLine' a
1
2
3
4
newLine
5
$ cat a
1
2
3
4
5

:::warning sed 后面接的动作,请务必以 ‘’ 两个单引号括住喔 :::

修改内容

通过 -i 选项可以直接对文件进行修改

在第4行下面添加新行

sed -i '4a\newLine' a
$ cat a
1
2
3
4
newLine
5

或者

sed -i '4a newLine' a

如果是在某行前面添加新行:

sed -i '2i newLine' a

在文件末尾添加新行:

sed -i '$a lastline' a

其中 $ 代表最后一行

添加多行

每一行末尾都可以使用 \ 来连接新行

$ nl a | sed '2a newLine1 ......\
> newLine2'
     1    1
     2    2
newLine1 ......
newLine2
     3    3
     4    4
     5    5

以脚本文件内容编辑文件内容

使用 -f 选项可以使用某个文件的内容对目标文件进行处理

新建一个文件 b 并输入 4a\newLine

sed -i -f b a

效果跟执行 sed -i 4a\newLine a 一样

删除文件内容

$ nl a | sed '2,3d'
     1    1
     4    4
     5    5

sed 的动作为 ‘2,3d’ ,那个 d 就是删除!因为 2-3 行给他删除了,所以显示的数据就没有 2-3 行

:::warning 原本应该是要下达 sed -e 才对,没有 -e 也行 :::

类似的操作:

# 只删除第 2 行
sed '2d' a
# 删除第 3 到最后一行
sed '3,$d' a

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

替换文件内容

将2-3行内容替换为指定内容:

$ sed '2,3c No 2-3 number' a
1
No 2-3 number
4
5

搜索内容

数据的搜寻并显示

搜索 /etc/passwd 中包含字符串 root 的行

$ nl /etc/passwd | sed -n '/root/p'
     1    root:x:0:0:root:/root:/bin/bash
    10    operator:x:11:0:operator:/root:/sbin/nologin
    23    dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

使用 p 进行打印内容, 前面是要是搜索内容的正则表达式

数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

$ nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'
1  root:x:0:0:root:/root:/bin/blueshell

数据的搜寻并删除

删除/etc/passwd所有包含root的行,其他行输出

nl /etc/passwd | sed  '/root/d'

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!

sed 's/要被取代的字串/新的字串/g'

先观察原始信息,利用 /sbin/ifconfig 查询 IP

$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部分,亦即:Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

awk

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。

参考资料