2019-03-20 第十一章 linux正则表达式与三剑客之 swk 知识应用实践

Day15

作者:方维超

归档:课堂笔记

时间:2019/3/20

学无止境,老男孩教育成就你人生的起点!

(接昨天问题)问题六——插入行内容:

[root@oldboy/test]# sed '2a wo ai shao di' oldgirl.txt

I am oldboy teacher!

I teach linux.

wo ai shao di

I like badminton ball ,billiard ball and chinese chess!

our site is http://www.oldboyedu.com

my qq num is 49000448.

not 4900000448

my god,iam not oldboy,butOLDBOY!

[root@oldboy/test]# sed '1a wo ai shao di' oldgirl.txt

I am oldboy teacher!

wo ai shao di

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

our site is http://www.oldboyedu.com

my qq num is 49000448.

not 4900000448

my god,iam not oldboy,butOLDBOY!

2019-03-20 第十一章 linux正则表达式与三剑客之 swk 知识应用实践_第1张图片
image.png

练习sed

正则是贪婪匹配模式,人性是贪婪的。

问题1****:取出Linux****中执行ifconfig eth0****后对应的IP****地址(只能输出IP****地址)。

方法1:

[root@oldboy/test]# ifconfig eth0|sed -n 2p|sed -e 's#^.inet##g' -e 's#netm.$##g'

10.0.0.200

[root@oldboy/test]# ifconfig eth0|sed -ne 's#^.inet##g' -e 's#netm.$##gp'

10.0.0.200

[root@oldboy/test]# ifconfig eth0|sed -n 2p|sed 's#^.inet##g'|sed 's#netm.$##g'

10.0.0.200

方法:要取一个目标,删除目标两边的,就得到了目标:

先匹配上,然后在删除

逻辑图:


image.png
image.png

验证是否懂了的练习题:

stat /etc/hosts****自行取其中的644

[root@oldboy/test]# stat /etc/hosts|sed -n 4p|sed 's#^.(0##g'|sed 's#/-.$##g'

644

[root@oldboy/test]# stat /etc/hosts|sed -nr 's#^.(0(.)/-.*$#\1#gp'

644

[root@oldboy/test]# stat /etc/hosts|sed -rn 's#^.(0(.)/-.*$#\1#gp'

644

考试:ip add****的输出取出IP****。

[root@oldboy/test]# ip add |sed -n 9p|sed 's#^.inet ##g'|sed 's#/24.$##g'

10.0.0.200

[root@oldboy/test]# ip add |sed -n 9p|sed -e 's#^.inet ##g' -e 's#/24.$##g'

10.0.0.200

[root@oldboy/test]# ip add |sed -rn 's#^.inet(.)/24.*$#\1#gp'

10.0.0.200

2019-03-20 第十一章 linux正则表达式与三剑客之 swk 知识应用实践_第2张图片
image.png

三剑客自身特长:

grep 过滤查找内容(相当于筛子)

sed 取行,替换,删除,追加

awk 取列

awk****语法

2019-03-20 第十一章 linux正则表达式与三剑客之 swk 知识应用实践_第3张图片
image.png

参数:

-F 指定分隔符

打印第一列

列:2第二列

$0整行

(NF-1)倒数第二列

cut 按列切割

-d 指定分隔符

-f 指定哪列,多列用,连续多列如:f1-5****;f3-5

练习:

[root@oldboy/test]# cut -d"/" -f1,4,3,5 a.txt

1/3/4/5

[root@oldboy/test]# cut -d" " -f1-7 a.txt

1 2 3 4 5 6 7

[root@oldboy/test]# cut -d" " -f1,5,2,6 a.txt

1 2 5 6

练习:

[root@oldboyedu ~]# sed -n '1,5p' /etc/passwd >oldboyedu.txt

[root@oldboyedu ~]# cat oldboyedu.txt

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

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@oldboy/test]# cut -d":" -f3,4 b.txt

0:0

1:1

2:2

3:4

4:7

问题1:取test.txt文件的第2行到第3行的内容。

[root@oldboy/test]# awk 'NR==2,NR==3' test.txt

PROXY_METHOD=none

BROWSER_ONLY=no

问题2:过滤出含有root字符串的行※。

[root@oldboy/test]# awk '/IP/' test.txt

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

IPADDR=10.0.0.200

IPV6_PRIVACY=no

[root@oldboy/test]# grep "IP" test.txt

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

IPADDR=10.0.0.200

IPV6_PRIVACY=no

问题3:删除含有root字符串的行※。

[root@oldboy/test]# awk '/[I]/' test.txt

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=none

DEFROUTE=yes

NAME=eth0

UUID=b5b390e4-85a9-4923-a26b-18445fb1858a

DEVICE=eth0

ONBOOT=yes

PREFIX=24

GATEWAY=10.0.0.254

DNS1=223.5.5.5

[root@oldboy/test]# sed '/IP/d' test.txt

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=none

DEFROUTE=yes

NAME=eth0

UUID=b5b390e4-85a9-4923-a26b-18445fb1858a

DEVICE=eth0

ONBOOT=yes

PREFIX=24

GATEWAY=10.0.0.254

DNS1=223.5.5.5

问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。

[root@oldboy/test]# cat -n b.txt |awk -F":" '{print 3,$NF}' b.txt

root 0 /bin/bash

bin 1 /sbin/nologin

daemon 2 /sbin/nologin

adm 3 /sbin/nologin

lp 4 /sbin/nologin

[root@oldboy/test]# awk -F":" '{print NR,3,$NF}' b.txt

1 root 0 /bin/bash

2 bin 1 /sbin/nologin

3 daemon 2 /sbin/nologin

4 adm 3 /sbin/nologin

5 lp 4 /sbin/nologin

问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。

[root@oldboy/test]# ifconfig eth0|sed -n 2p|sed 's#^.inet ##g'|sed 's#netm.$##g'

10.0.0.200

问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出

[root@oldboy/test]# awk -F":" 'NF}' b.txt

/bin/bash

问题7:过滤下列c.txt文件中第三列内容分数大于70,并且小于95的人名和性别。

[root@oldboy/test]# awk '3<95{print 2}' c.txt

张三 男

王五 男

你可能感兴趣的:(2019-03-20 第十一章 linux正则表达式与三剑客之 swk 知识应用实践)