【sed命令基础命令】

‘p’ 打印当前行

[root@centos7~]# sed 'p' /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
::1       localhost localhost.localdomain localhost6 localhost6.localdomain6

当没有指定条件时,默认会匹配所有的数据行,因此/etc/hosts文件有多少行p指令就被执行多少次,sed读取文件的第1行执行p指令将该行内容显示在屏幕上,接着读取文件的第2行继续执行p指令再将该行内容显示在屏幕上。但是,为什么最终每个数据行却打印显示了两次呢?因为哪怕没有p指令,sed也会默认将读取到的所有数据行显示在屏幕上,所以p指令数据行被打印显示了一次,接着sed默认又将读取的数据行再显示了一次,最终每行显示了两次。可以使用-n选项屏蔽sed默认的输出功能。关闭默认的输出功能后,所有的数据行将仅显示一次。

-n 屏蔽sed的默认输出功能

liweideAir:~ liwei$ sed -n 'p' /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section
liweideAir:~ liwei$ 

只显示第一行 用1p

liweideAir:~ liwei$ sed -n '1p' /etc/hosts
##

只显示第二行 2p

liweideAir:~ liwei$ sed -n '2p' /etc/hosts
# Host Database

从管道读取数据

liweideAir:~ liwei$ df -h
Filesystem       Size   Used  Avail Capacity iused     ifree %iused  Mounted on
/dev/disk1s5s1  113Gi  8.2Gi   60Gi    13%  348618 624709360    0%   /
devfs           187Ki  187Ki    0Bi   100%     648         0  100%   /dev
/dev/disk1s2    113Gi  1.7Gi   60Gi     3%    1902 624709360    0%   /System/Volumes/Preboot
/dev/disk1s4    113Gi   20Ki   60Gi     1%       0 624709360    0%   /System/Volumes/VM
/dev/disk1s6    113Gi  5.8Mi   60Gi     1%      18 624709360    0%   /System/Volumes/Update
/dev/disk1s1    113Gi   42Gi   60Gi    42%  465650 624709360    0%   /System/Volumes/Data
map auto_home     0Bi    0Bi    0Bi   100%       0         0  100%   /System/Volumes/Data/home
liweideAir:~ liwei$ df -h |sed -n '2p'
/dev/disk1s5s1  113Gi  8.2Gi   60Gi    13%  348618 624488040    0%   /
liweideAir:~ liwei$ 

逗号表区间
分号表分隔
刀了表末尾
加好表加几行
波浪线是步长
两斜杠之间匹配 / /
尖角是开头

[root@centos7~]# cat -n /etc/passwd > /tmp/passwd     #生产带行号的素材文件
[root@centos7~]# sed -n '1,3p' /tmp/passwd            #显示文件的第1到3行
1   root:x:0:0:root:/root:/bin/bash
2   bin:x:1:1:bin:/bin:/sbin/nologin
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@centos7~]# sed -n '1p;3p;6p' / tmp/passwd       #多条指令使用分号分隔
1   root:x:0:0:root:/root:/bin/bash
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
6   sync:x:5:0:sync:/sbin:/bin/sync
[root@centos7~]# sed -n '2p;8p' /tmp/passwd           #显示第2行和第8行
2   bin:x:1:1:bin:/bin:/sbin/nologin
8   halt:x:7:0:halt:/sbin:/sbin/halt
[root@centos7~]# sed -n '3,5p' /tmp/passwd        #显示文件的第3到5行
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
4   adm:x:3:4:adm:/var/adm:/sbin/nologin
5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@centos7~]# sed -n '4, $p' /tmp/passwd        #显示第4行到末尾所有行
4   adm:x:3:4:adm:/var/adm:/sbin/nologin
5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6   sync:x:5:0:sync:/sbin:/bin/sync
7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8   halt:x:7:0:halt:/sbin:/sbin/halt
...忽略部分输出内容...
[root@centos7~]# sed -n '3, +3p' /tmp/passwd       #显示第3行以及后面的3行
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
4   adm:x:3:4:adm:/var/adm:/sbin/nologin
5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6   sync:x:5:0:sync:/sbin:/bin/sync
[root@centos7~]# sed -n '1~2p' /tmp/passwd    #显示1,3,5...奇数行(步长为2)
1   root:x:0:0:root:/root:/bin/bash
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11  games:x:12:100:games:/usr/games:/sbin/nologin
...忽略部分输出内容...
[root@centos7~]# sed -n '2~2p' /tmp/passwd    #显示2,4,6...偶数行(步长为2)
2   bin:x:1:1:bin:/bin:/sbin/nologin
4   adm:x:3:4:adm:/var/adm:/sbin/nologin
6   sync:x:5:0:sync:/sbin:/bin/sync
8   halt:x:7:0:halt:/sbin:/sbin/halt
10  operator:x:11:0:operator:/root:/sbin/nologin
12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...忽略部分输出内容...
[root@centos7~]# sed -n '4~2p' /tmp/passwd    #显示4,6,8...偶数行(步长为2)
4   adm:x:3:4:adm:/var/adm:/sbin/nologin
6   sync:x:5:0:sync:/sbin:/bin/sync
8   halt:x:7:0:halt:/sbin:/sbin/halt
10  operator:x:11:0:operator:/root:/sbin/nologin
12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos7~]# cat -n /etc/passwd > /tmp/passwd     #生产带行号的素材文件
[root@centos7~]# sed -n '1,3p' /tmp/passwd            #显示文件的第1到3行
1   root:x:0:0:root:/root:/bin/bash
2   bin:x:1:1:bin:/bin:/sbin/nologin
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@centos7~]# sed -n '1p;3p;6p' / tmp/passwd       #多条指令使用分号分隔
1   root:x:0:0:root:/root:/bin/bash
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
6   sync:x:5:0:sync:/sbin:/bin/sync
[root@centos7~]# sed -n '2p;8p' /tmp/passwd           #显示第2行和第8行
...忽略部分输出内容...
[root@centos7~]# sed -n '3~2p' /tmp/passwd    #显示3,5,7...奇数行(步长为2)
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11  games:x:12:100:games:/usr/games:/sbin/nologin
13  nobody:x:99:99:Nobody:/:/sbin/nologin
...忽略部分输出内容...
[root@centos7~]# sed -n '3~4p' /tmp/passwd    #显示3,7,11...(步长为4)
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
11  games:x:12:100:games:/usr/games:/sbin/nologin
15  dbus:x:81:81:System message bus:/:/sbin/nologin
19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
...忽略部分输出内容...
[root@centos7~]# sed -n '4~5p' /tmp/passwd    #显示4,9,14...(步长为5)
4   adm:x:3:4:adm:/var/adm:/sbin/nologin
9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@centos7~]# sed -n '$p' /tmp/passwd          #显示文件最后一行的内容
19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@centos7~]# sed -n '/root/p' /tmp/passwd     #匹配包含root的行并显示
1   root:x:0:0:root:/root:/bin/bash
10  operator:x:11:0:operator:/root:/sbin/nologin
[root@centos7~]# sed -n '/[0-9]/p' /tmp/passwd    #匹配包含数字的行并显示
1   root:x:0:0:root:/root:/bin/bash
2   bin:x:1:1:bin:/bin:/sbin/nologin
3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
...忽略部分输出内容...
[root@centos7~]# sed -n '/^http/p' /etc/services  #显示以http开头的数据行
http           80/tcp        www www-http        # WorldWideWeb HTTP
http           80/udp        www www-http        # HyperText Transfer
Protocol
http           80/sctp                           # HyperText Transfer
Protocol
https          443/tcp                           # http protocol over TLS/SSL
https          443/udp                           # http protocol over TLS/SSL
https          443/sctp                          # http protocol over TLS/SSL
...忽略部分输出内容...

-r 开启正则表达式

[root@centos7~]# sed -n '/^(icmp|igmp)/p' /etc/protocols  #默认不支持扩展正则
[root@centos7~]# sed -rn '/^(icmp|igmp)/p' /etc/protocols #开启扩展正则功能
icmp    1   ICMP        # internet control message protocol
igmp    2   IGMP        # internet group management protocol
[root@centos7~]# sed -n '\cUIDcp' /etc/login.defs #正则匹配包含UID的行并显示
UID_MIN             1000
UID_MAX             60000
SYS_UID_MIN         201
SYS_UID_MAX         999
[root@centos7~]# sed -n '\xbashxp' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n '\1bash1p' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n '\:bash:p' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n '\, bash, p' /etc/shells #正则匹配包含bash的行并显示
/bin/bash
/usr/bin/bash
[root@centos7~]# sed -n 'l' /etc/shells        #显示数据内容时打印控制字符
/bin/sh$
/bin/bash$
/sbin/nologin$
/usr/bin/sh$
/usr/bin/bash$
/usr/sbin/nologin$
/bin/tcsh$
/bin/csh$

sed程序使用=指令可以显示行号,结合条件匹配,可以显示特定数据行的行号。

[root@centos7~]# sed -n '/root/=' /etc/passwd     #显示包含root字符串的行号
1
10
[root@centos7~]# sed -n '3=' /etc/passwd          #显示第3行的行号
3
[root@centos7~]# sed -n '$=' /etc/passwd          #显示最后一行的行号
19

在sed中支持使用感叹号(!)对匹配的条件进行取反操作。

[root@centos7~]# sed -n '1! p' /etc/hosts      #显示除第1行外的所有行数据
::1        localhost localhost.localdomain localhost6
localhost6.localdomain6
[root@centos7~]# sed -n '2! p' /etc/hosts      #除第2行外所有内容都显示
127.0.0.1   localhost localhost.localdomain localhost4
localhost4.localdomain4
[root@centos7~]# sed -n '/bash/! p' /etc/shells    #除含bash外的所有行都显示
/bin/sh
/sbin/nologin
/usr/bin/sh
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@centos7~]# cp /etc/hosts /tmp/hosts            #复制素材文件
[root@centos7~]# sed '1a add test line' /tmp/hosts   #第1行后面添加1行数据
127.0.0.1   localhost localhost.localdomain localhost4
localhost4.localdomain4
add test line
::1        localhost localhost.localdomain localhost6
localhost6.localdomain6
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: sed命令可以通过替换来修改文本中的一整行。具体来说,可以使用以下的sed命令来替换一整行: ``` sed 's/.*/要替换的内容/' 文件名 ``` 其中,将 "要替换的内容" 替换成想要替换的内容,比如新的一整行的文本。例如,要替换文件中第2行的内容为"Hello World!",可以使用以下命令: ``` sed '2s/.*/Hello World!/' 文件名 ``` 这将把文件中第2行的内容替换为"Hello World!"。 ### 回答2: sed命令是一种流编辑器,通过对文本输入进行处理和转换来实现复杂的文本编辑和替换操作。其中,替换一整行是sed命令中的一种常见操作。 替换一整行的sed命令语法如下: ``` sed 'N;s/^.*$/replace_string/' input_file ``` 其中,N表示匹配第N行,^.*$表示匹配整行文本,replace_string表示要替换的文本。 举一个简单的例子,假设我们有一个文件sample.txt,内容如下: ``` 001 abc 002 def 003 ghi 004 jkl ``` 我们想要将第3行替换为“003 xyz”。可以使用如下sed命令: ``` sed '3;s/^.*$/003 xyz/' sample.txt ``` 执行该命令后,sample.txt的内容变为: ``` 001 abc 002 def 003 xyz 004 jkl ``` 在这个命令中,3表示匹配第3行,^.*$表示匹配整行文本,003 xyz表示要替换的文本。执行该命令后,sed会在读取到第3行时将其替换为003 xyz,并将替换后的文本输出到标准输出。 需要注意的是,sed命令会将替换后的文本输出到标准输出,如果需要将替换结果写入文件中,可以使用重定向符号(>)将标准输出重定向到文件中,例如: ``` sed '3;s/^.*$/003 xyz/' sample.txt > new_sample.txt ``` 该命令将替换结果写入文件new_sample.txt中。 ### 回答3: sed命令是一款非常方便的文本编辑器,可以在文件中进行查找和替换操作。其中,sed命令替换一整行是其中的一个功能。 sed命令替换一整行的语法如下: ``` sed 's/^old_line$/new_line/' file ``` 其中,^表示行首,$表示行尾,old_line表示待替换的旧文本,new_line表示新文本,file表示待编辑的文件。 例如,有一份文件名为test.txt,内容如下: ``` hello world sed command This is a test ``` 我们想将第二行sed command替换为new command。可以使用以下命令: ``` sed 's/^sed command$/new command/' test.txt ``` 输出结果将是: ``` hello world new command This is a test ``` 总结来说,sed命令替换一整行只需要在s/old_line/new_line/的基础上增加行首行尾的符号即可。这是一种快速编辑文件内容的方法,能够较快地进行多行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个双鱼座的测开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值