正则(二)

1.sed命令:

打印某行:

[root@ligenkelong ~]# sed -n '1,3'p passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@ligenkelong ~]# sed -n '3,$'p passwd     #最后一行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

打印包含某个字符串的行:

[root@ligenkelong ~]# sed -n '/root/'p passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@ligenkelong ~]# sed -n '/^ro/'p passwd     以ro开头的字符
root:x:0:0:root:/root:/bin/bash
[root@ligenkelong ~]#  sed -n '/\blogin$/'p passwd     
aaa:x:1000:1000::/home/aaa:/sbin/login
[root@ligenkelong ~]#  sed -n '/\blogin\b/'p passwd   #\b匹配任何单词边界
aaa:x:1000:1000::/home/aaa:/sbin/login
[root@ligenkelong ~]# sed -n '/r..t/'p passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

删除某些行:

[root@ligenkelong ~]# sed '1'd passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@ligenkelong ~]# sed '/o/'d passwd     
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
[root@ligenkelong ~]# sed '/.*/'d passwd      #删除全部

替换字符或者字符串:

[root@ligenkelong ~]# sed '1,2s/ro/tt/g' passwd 
ttot:x:0:0:ttot:/ttot:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@ligenkelong ~]# sed '1,2s#ro#tt#g' passwd       #除了用/分隔,还可以用#或者@
ttot:x:0:0:ttot:/ttot:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@ligenkelong ~]# sed 's/[0-9]//g' passwd       #删除数字
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
[root@ligenkelong ~]# sed 's/[0-9a-Z]//g' passwd     #删除所有数字字符
:::::/://
:::::/://

调换两个字符串的位置:

[root@ligenkelong ~]# sed -r 's/(root)(.*)(bash)/\3\2\1/' passwd    #-r转义
bash:x:0:0:root:/root:/bin/root
bin:x:1:1:bin:/bin:/sbin/nologin
[root@ligenkelong ~]# sed -r 's/^.*$/123&/' passwd    #增加内容
123root:x:0:0:root:/root:/bin/bash
123bin:x:1:1:bin:/bin:/sbin/nologin
123daemon:x:2:2:daemon:/sbin:/sbin/nologin
123adm:x:3:4:adm:/var/adm:/sbin/nologin

2.awk工具:

-F:指定分隔符
$1:第一个字段
$0:表示全部字段

截取文档中的某个段:

[root@ligenkelong ~]# head -n 2 passwd | awk -F ':' '{print $1}'
root
bin
[root@ligenkelong ~]# head -n 2 passwd | awk -F ':' '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@ligenkelong ~]# head -n 2 passwd | awk -F ':' '{print $1"#"$2"#"$3}'  #自定义的内容要用双引号
root#x#0
bin#x#1

匹配字符或者字符串:

[root@ligenkelong ~]# awk '/oo/' passwd 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@ligenkelong ~]# awk -F ':' '$1 ~/oo/' passwd       
root:x:0:0:root:/root:/bin/bash
[root@ligenkelong ~]# awk -F ':' '/root/ {print $1,$2} /mail/ {print $1,$2}' passwd  #多次匹配
root x
mail x
operator x

条件操作符:若把比较的数字用双引号引起来,不会认为是数字,而认为是字符
&&和||表示并且和或者

[root@ligenkelong ~]# awk -F ':' '$3=="0"' passwd 
root:x:0:0:root:/root:/bin/bash

[root@ligenkelong ~]# awk -F ':' '$3>=500' passwd 
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
aaa:x:1000:1000::/home/aaa:/sbin/login
bbb:x:1001:1001::/home/bbb:/bin/bash
user1:x:1002:100::/home/user1:/bin/bash

[root@ligenkelong ~]# awk -F ':' '$3>$4' passwd 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
user1:x:1002:100::/home/user1:/bin/bash

awk的内置变量:
NF:一共有多少段
NR:行号
OFS:定义分隔符

[root@ligenkelong ~]# head -n 3 passwd | awk -F ':' '{OFS="#"} {print $1,$2,$3}'
root#x#0
bin#x#1
daemon#x#2
[root@ligenkelong ~]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' passwd 
bbb#x#1001#1001
user1#x#1002#100
[root@ligenkelong ~]# head -n 3 passwd | awk -F ':' '{print NF}'
7
7
7
[root@ligenkelong ~]# head -n 3 passwd | awk -F ':' '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
[root@ligenkelong ~]# head -n 3 passwd | awk -F ':' '{print $NR}'
root
x
2

awk中的数学运算:

[root@ligenkelong ~]# head -n 2 passwd | awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin

课堂笔记
选取某行到某行之间:
[root@ligenkelong ~]# sed -n '/root/,/aaa/'p passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
aaa:x:1000:1000::/home/aaa:/sbin/login

把每个单词的第一个小写字母变大写:

[root@ligenkelong ~]# sed 's/\b[a-z]/\u&/g' passwd 
Root:X:0:0:Root:/Root:/Bin/Bash
Bin:X:1:1:Bin:/Bin:/Sbin/Nologin
Daemon:X:2:2:Daemon:/Sbin:/Sbin/Nologin
Adm:X:3:4:Adm:/Var/Adm:/Sbin/Nologin

&、\1:
&表示\ \之间,\1表示\ \之间的第一个()。

[root@ligenkelong ~]# sed -rn 's/(^r.*)/&12/'p passwd 
root:x:0:0:root:/root:/bin/bash12
[root@ligenkelong ~]# sed -n '1,10{/root/p}' passwd   #1到10行匹配root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值