1怀酷、為何要使用正則表達(dá)式
1)給定一個(gè)正則表達(dá)式和另一個(gè)字符串稻爬,我們可以達(dá)到如下目的
2)給定的字符串是否符合正則表達(dá)式的過濾邏輯(稱作“匹配”)
3)可以通過正則表達(dá)式,從字符串中獲取我們想要的特定部分
4)取出文件中正確的身份證號碼
5)幫我們快速過濾
2蜕依、正則表達(dá)式分類
1)POSIX規(guī)范將正則表達(dá)式分為兩種
2)基本正則表達(dá)式(BRE桅锄,basic regular expression)
3)擴(kuò)展正則表達(dá)式(ERE,extended regular expression)————高級功能
4) BRE和ERE的區(qū)別僅僅是元字符的不同样眠,BRE(基礎(chǔ)正則表達(dá)式)只承認(rèn)的元字符有^ $ . [] *其他字符識別為普通字符
5)ERE(擴(kuò)展正則表達(dá)式)則添加了() {} 友瘤?+ |等
6)只有在用反斜線“\”進(jìn)行轉(zhuǎn)義的情況下,字符(){} 才會BRE被當(dāng)作元字符處理檐束,而ERE中辫秧,任何元字符前面加上反斜杠反而會使其被當(dāng)作普通字符來處理
3、正則與通配符區(qū)別
1)通配符
作用:查找文件名
支持的命令:Linux大部分命令都支持 ? ? 以.txt 結(jié)尾的文件
2)正則
作用:在文件中過濾內(nèi)容
支持的命令:三劍客sed被丧,grep盟戏,awk ? ? ? ? ?? python? java
4绪妹、基礎(chǔ)正則
1)正則表達(dá)式:為處理大量的字符串而定義的一套規(guī)則和方法,通過定義這些特殊符號的輔助柿究,系統(tǒng)管理員可以快速過濾邮旷,替換或輸出需要的字符串
環(huán)境:
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
問題1:輸出oldboy.txt的第2-3行內(nèi)容※。
[root@oldboyedu ~/test]# sed -n '2,3p' oldgirl.txt?
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]# head -3 oldgirl.txt |tail -2
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
問題2:過濾出含有oldboy字符串的行※蝇摸。
[root@oldboyedu ~/test]# sed -n '/oldboy/p' oldgirl.txt?
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]# grep oldboy oldgirl.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
問題3:刪除含有oldboy字符串的行※婶肩。
[root@oldboyedu ~/test]# sed '/oldboy/d' oldgirl.txt?
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
[root@oldboyedu ~/test]# grep -v "oldboy" oldgirl.txt
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
問題4:將文件中的oldboy字符串全部替換為oldgirl※。
[root@oldboyedu ~/test]# sed 's#oldboy#oldgirl#g' oldgirl.txt
I am oldgirl teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldgirledu.com
my qq num is 49000448.
vim替換:
問題5:將文件中的oldboy字符串全部替換為oldgirl探入,同時(shí)將QQ號碼49000448改為31333741狡孔。
[root@oldboyedu ~/test]# sed -e 's#oldboy#oldgirl#2' -e 's#49000448#31333741#g' oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 31333741.
問題6:在oldboy.txt文件的第2行后追加文本懂诗。
[root@oldboyedu ~/test]# sed '2a I teacher linux.' oldgirl.txt?
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# cat oldgirl.txt?
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# sed -i '2a I teacher linux.' oldgirl.txt?
[root@oldboyedu ~/test]# cat oldgirl.txt?
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# sed '2i I teacher linux.i' oldgirl.txt?
I am oldboy teacher!
I teacher linux.i
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
問題1:取出Linux中執(zhí)行ifconfig eth0后對應(yīng)的IP地址(只能輸出IP地址)蜂嗽。
方法1:
[root@oldboyedu ~/test]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's# ?netm.*$##g'
10.0.0.201
三劍客自身有特長的。
grep 過濾查找內(nèi)容殃恒。篩子
sed ?取行植旧,替換,刪除离唐,追加
awk ?取列
cut 按列切割
-d 指定分隔符 -f指定哪列病附,多列用逗號
[root@oldboyedu ~]# cat a.txt?
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu ~]# cut -d" " -f1,3,5 a.txt?
1 3 5
[root@oldboyedu ~]# cut -d" " -f3-5 a.txt?
3 4 5
練習(xí)
[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@oldboyedu ~]# cut -d":" -f3,4 /etc/passwd
0:0
1:1
2:2
[root@oldboyedu ~]# cat b.txt?
oldboy 49000448
[root@oldboyedu ~]# cut -c1-6,8- b.txt?
oldboy4900044
awk語法:
awk ?[option] ? 'pattern{action}' file ...
awk ? [參數(shù)] ? ? ?'條件{動作}' ? ?文件 ...
參數(shù):
-F 指定分隔符
打印第一列:
[root@oldboyedu ~]# awk -F ":" '{print $1}' oldboyedu.txt?
root
bin
daemon
adm
lp
[root@oldboyedu ~]# awk -F ":" '{print $3,$5}' oldboyedu.txt?
0 root
1 bin
2 daemon
3 adm
4 lp
列:$1第一列 $2第二列 以此類推....
$0 ?整行
$NF 最后一列 倒數(shù)第一列
$(NF-1) 倒數(shù)第二列
[root@oldboyedu ~]# awk -F ":" '{print $NF}' oldboyedu.txt?
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
[root@oldboyedu ~]# awk -F ":" '{print $0}' 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
練習(xí):打印 1 2 和最后一列。
[root@oldboyedu ~]# awk -F ":" '{print $1,$2,$NF}' oldboyedu.txt?
root x /bin/bash
bin x /sbin/nologin
daemon x /sbin/nologin
adm x /sbin/nologin
lp x /sbin/nologin
問題1:取test.txt文件的第2行到第3行的內(nèi)容亥鬓。
[root@oldboyedu ~]# awk 'NR>1&&NR<4' oldboyedu.txt?
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@oldboyedu ~]# awk 'NR==2,NR==3' oldboyedu.txt?
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
問題2:過濾出含有root字符串的行※完沪。
[root@oldboyedu ~]# awk '/root/' oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk /root/ oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]#?
[root@oldboyedu ~]# awk "/root/" oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
問題3:刪除含有root字符串的行※。
[root@oldboyedu ~]# awk '/^[^r]/' oldboyedu.txt
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
[^r] ?非r
^[^r] 以非r字符卡頭
問題4:取文件的第一列嵌戈、第三列和最后一列內(nèi)容覆积,并打印行號※。
[root@oldboyedu ~]# awk -F ":" '{print NR,$1,$3,$NF}' oldboyedu.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中執(zhí)行ifconfig eth0后對應(yīng)的IP地址(只能輸出IP地址)熟呛。
[root@oldboyedu ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.201
C6
[root@oldboy ~]# ifconfig eth0
eth0 ? ? ?Link encap:Ethernet ?HWaddr 00:0C:29:D0:87:20 ?
? ? ? ? ? inet addr:10.0.0.202 ?Bcast:10.0.0.255 ?Mask:255.255.255.0
? ? ? ? ? inet6 addr: fe80::20c:29ff:fed0:8720/64 Scope:Link
? ? ? ? ? UP BROADCAST RUNNING MULTICAST ?MTU:1500 ?Metric:1
? ? ? ? ? RX packets:243 errors:0 dropped:0 overruns:0 frame:0
? ? ? ? ? TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
? ? ? ? ? collisions:0 txqueuelen:1000?
? ? ? ? ? RX bytes:20674 (20.1 KiB) ?TX bytes:8706 (8.5 KiB)
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'
addr:10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'|awk -F ":" '{print $2}'
10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
10.0.0.202
問題6:過濾文件中第一列內(nèi)容匹配root的字符串宽档,把符合的行的最后一列輸出
awk -F ":" '$1~/root/ {print $NF}' test.txt?
~匹配