linux-shell编程三剑客之--sed

文章目录

    • tzk_shell三剑客(sed awk grep)
      • sed --》 sed [选项] [命令] [文件]
        • 常用选项:
        • 常用命令:
        • sed的单引号和双引号
        • sed查找方式
        • sed中的三种替换标记:g/p/w
        • sed取奇数行(1~2)、偶数行(2~2)
        • 小练习:
      • sed高级用法
        • 模式空间(pattern space)、缓存空间(hold space)
        • 标签的用法
        • sed中正则灵活使用
          • 将有邮箱的列把邮箱和后面的名字交换

tzk_shell三剑客(sed awk grep)

sed --》 sed [选项] [命令] [文件]

常用选项:

-n:只显示匹配处理的行
-i:直接在文件中进行修改
-r:对扩展正则的支持(基本正则中:^$\d这样的元字符很少)

常用命令:

p:打印匹配行print   --》常和-n联用
d:删除指定行delete
a:在匹配行的下面一行追加append
i:在匹配行前面插入insert
c:整行替换
r:将文件的内容读入read
w:将文件写入文件write
s:字符串替换
N:将下一行一起读入模式空间作为一行\n分隔

sed -n ‘10,15p’ t1.txt

sed -n ‘1p;3p;5p’ t1.txt

# -r  -w这两个比较拗口
sed -i '/luhaisen/r sed.txt' name.txt  
#将sed.txt的内容导入到name.txt文件里的luhaisen行的后面

sed -i '1,5w sed.txt'  name.txt  
#将name.txt的1到5行的内容写入到sed.txt文件里,会覆盖里面的内容

sed的单引号和双引号

双引号里可以使用shell里的变量
	单引号不行
	单引号和双引号里都可以存放模式
[root@cali 5_23]# a=5
[root@cali 5_23]# b=10
[root@cali 5_23]# cat -n passwd |sed -n "${a}p;${b}p"
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    10	uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@cali 5_23]#
[root@cali 5_23]# cat -n passwd |sed -n '${a}p;${b}p'
sed: -e expression #1, char 0: unmatched `{'
[root@cali 5_23]#

sed查找方式

  • 行号查找 :sed -n ‘/bash/p’ /etc/passwd

  • 模式查找 :

    sed -n -r  '/.* ***tzk.****bash/p'  /etc/passwd
    sed  -nr  '/^[^0-9]/p'  /etc/passwd
               已不是数字开头的
    ,逗号是连接符、:取两个模式之间的数据用,逗号隔开
    !感叹号是取反符
    

sed中的三种替换标记:g/p/w

  • sed -n [行号或模式]s/查找内容/替换内容/[替换标记] 文件

数字:替换每行的第几个
g:全局替换,否则只替换一行中第一个字符串。例如ng从第n个开始替换
p:显示被执行替换操作的行和-n合用
w:将执行替换操作的行输出到指定文件

#### sed中的s命令

将文件中每行的第2个root替换为ROOT

​```shell
sed -n 's/root/ROOT/2p' /etc/passwd

将文件中找到以id开头的行中的:3:替换成:5:

sed '/^id/s/:3:/:5:/' /etc/inittab

禁止本地用户登陆

sed  '/^local_enable/s/YES/NO/'  vsftpd.conf

将文件中的:号替换为换行符

sed 's/:/\n/g' /etc/passwd

将文件中bash替换成nologin,同时将sbin替换成bin

sed 's/bash/nologin/;s/sbin/bin/' /etc/passwd

在前面加元素,和后面加元素

sed -n '2,10s/^/#/p' passwd
#在2到10行前面加上注释
sed -n 's/$/?/p' passwd
#在每行末尾加上?

sed取奇数行(12)、偶数行(22)

[root@nginx-bianyi lianxi]# cat passwd -n|sed -n '1~2p'
     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
    13	nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
    15	systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
    17	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    19	unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    21	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@nginx-bianyi lianxi]# cat passwd -n|sed -n '2~2p'
     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
    14	dbus:x:81:81:System message bus:/:/sbin/nologin
    16	systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
    18	polkitd:x:998:996:User for polkitd:/:/sbin/nologin
    20	sssd:x:996:993:User for sssd:/:/sbin/nologin
    22	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

小练习:

#1.在每行前面加一个字符串

#2.一个文件
#		0.0.0.0
#		1.1.1.1
#		2.2.2.2
#		输出以下形式:
#		0.0.0.0:80,1.1.1.1:80,2.2.2.2:80

# 答:
sed -i 's/$/:80/;N;N;s/\n/,/' t1.sh

# 把passwd文件前的数字和空格全部去掉
cat -n passwd |sed -nr 's/\s+[0-9]+\s+//p'

sed高级用法

模式空间(pattern space)、缓存空间(hold space)

linux-shell编程三剑客之--sed_第1张图片

标签的用法

1、将passwd中的uid后面加个0,gid前面加个1

cat passwd |sed -nr '/^root/!s/([0-9]+):([0-9]+)/\10:1\2/p'

2、将文件里的a.txt里的内容
1
2
3
4
5
修改为 sc:5 sc:4 sc:3 sc:2 sc:1

 sed -i -r 'N;N;N;N;s/\n/ /g;s/([0-9])+\s([0-9])+\s([0-9])+\s([0-9])+\s([0-9])+/sc:\5 sc:\4 sc:\3 sc:\2 sc:\1/' a.txt

sed中正则灵活使用

将有邮箱的列把邮箱和后面的名字交换
[root@sanchuang-sed lianxi]# cat test.txt
0.0.0.0
1.1.1.1
2.2.2.2
https://www.baidu.com/map/feng.htm
https://www.qq.com/sanchuang/tan.html
https://www.163.com/lihu/li.htm
tan123@sc.com  tanzikun
feng_dy@sina.com  cali
ran123@163.com  ran
cali@facebook.cn  califeng
[root@sanchuang-sed lianxi]# cat test.txt|sed -n 's/(\w+@\w+\.[a-Z]+)(.*)/\2 \1/p'
tanzikun tan123@sc.com
cali feng_dy@sina.com
ran ran123@163.com
califeng cali@facebook.cn

在这里,其实使用awk更加便利
–》》》awk的使用

[root@sanchuang-sed lianxi]# cat test.txt|awk '/@/{print $2,$1}'
tanzikun [email protected]
cali [email protected]
ran [email protected]
califeng [email protected]

你可能感兴趣的:(linux)