国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 服务器 > linux shell篇(五)正则表达式

linux shell篇(五)正则表达式

来源:程序员人生   发布时间:2016-07-13 08:45:04 阅读次数:2922次
1.正则表达式:


   
正则表达式    RE  、  Regular Expression
     是1种字符模式,是在匹配文本时,使用1些特殊符号,匹配到用户想要的东西


字符模式:
    普通字符:没有任何特殊含义的字符
    元字符:具有特殊含义的字符    ^  $  *  .   []  ()  {} 
    
正则表达式1般是夹在双斜线之间的   如:/^abc/等
介绍正则表达式元字符
元字符          功能                             例子                匹配结果
^            行首定位符                       /^root/             匹配以root开头的行
$            行尾定位符                          /sh$/              匹配以sh结尾的行
.       匹配任意单个字符(除换行符)      /l.ve/             匹配live、love、... ...
*       前导符
        匹配0个或多个它前面的模式      /l*ve/             匹配ve、lve、llve、... ...
.*      匹配0到多个任意字符                  
[]      匹配1组字符中的任意1个          /l[ioIO]ve/       匹配live、love、lIve、lOve
[x-y]  匹配1段范围中的任意1个         /l[o-z]ve/          匹配love、lpve、lqve、... ...、lzve
        [0⑼]           数字
        [a-z]           小写字母 
        [A-Z]           大写字母
        [a-z0⑼]        小写字母或数字
        [-+*/]           +-*/ 4则运算
        [a-Z]             字母
[^]    表示取反                              /^[^abc]ve/           匹配除ave、bve、cve之外的3个字符的字符串
        [^0⑼]     不是数字
\       用于转义元字符的                  /93\.4/                匹配93.4
\<     词首定位符                          /\<bin/                 匹配bin、binary、... ...                 
\>      词尾定位符                         /sh\>/                  匹配bash、csh、ksh、... ...


rootfs
模式的重复{}
    x\{m\}              x是字符或字符串,m是数字,表示次数
                匹配x出现m次            /a\{3\}/         匹配到aaa
    x\{m,\}         匹配x出现最少m次       /a\{3,\}/       匹配aaa、aaaa、aaaaaaaa、aaaaaaa、... ...
    x\{m,n\}        匹配x出现m次到n次     /a\{3,5\}/     匹配aaa、aaaa、aaaaa


(root)
(a+(b-c)*d)
\(...\)     分组、标签 
& \1 \2
/\(love\)/ \1r  
     \(root\).*\(bin\).*\2\1                        \1ly   
     
            a  and b
            \(a\) and \(b\)    ==> \2 and \1           
     
 2.正则表达式用法
(1).vim与正则表达式
1、查找替换(letter)       tom换成mary
~# vim letter
:%s/\<[Tt]om\>/mary/       ——>    tom  Tom


2、行首行尾    picnic
/^love
/love$

3、任意字符    picnic
/l.ve

4、前导符   picnic
/o*v 

5、范围   picnic                                                                 
/love[a-z]

6、取反    picnic
/love[^a-z]

7、综合      invite
/^[A-Z]..$            匹配Dan这1行
/^[A-Z][a-z]*.*3[0⑸]   匹配到There are around 30 to 35    
//由此可以看出,正则表达式履行的是最大匹配

8、标签                
  :%s/\(Ginger\) and \(Larry\)/\2 and \1/  
  
  :%s/\(Ginger\)\(.*\)\(Larry\)/\3\2\1/
  
  s@@@    s###   s%%%   s///   等价的
  
(2).grep与正则表达式
GREP —— Global Regular Expression Print     
    好处:非交互
    
    不影响原文件内容,目的就是过滤出用户感兴趣的内容
    
命令格式
grep [选项] "正则表达式" 文件列表

grep履行状态返回值3种
0:该文件中搜索到了匹配行
1:该文件中未搜索到匹配行
2: 搜索的文件不存在
~# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
~# echo $?
0
~# grep "roooot" /etc/passwd
~# echo $?
1
~# grep "root" /etc/passwd1
grep: /etc/passwd1: No such file or directory
~# echo $?
2


grep基本使用
设定别名
#alias grep='grep --color=auto'
# vim /etc/bashrc 


1、--color    带色彩显示匹配到的关键字
~# grep --color "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2、-i   疏忽大小写
~# cat pass 
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
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
~# grep "root" pass --color
Root:x:0:0:root:/root:/bin/bash
~# grep -i "root" pass --color
Root:x:0:0:root:/root:/bin/bash
3、-v   取反
~# grep -v "nologin" /etc/passwd    //打印不包括nologin的行
4、^
打印/root/.bashrc文件中的注释行    
~# grep ^# /root/.bashrc
打印/etc/inittab文件中的非注释行 
~# grep -v ^# /etc/inittab 
id:5:initdefault:
5、$
显示passwd文件中以bash结尾的行
~# grep bash$ /etc/passwd
6、^$     空行
~# grep -v ^$ /etc/rc.local
7、-c   count   统计匹配到的行数
  统计非空行的数量
~# grep -cv ^$ /etc/rc.local  
7
  统计空行的数量
~# grep -c ^$ /etc/rc.local  
1        
8、-r      递归检索    

9、-l       1般与-r联用,只文显示包括关键字的件名,而不是显示文件内容
~# grep -rl "if" /script/       
/script/adduser1.sh
/script/if7.sh
/script/for9.sh
/script/fuwu.sh
/script/if1.sh
10、-q      quiet    静默输出    1般在写脚本时候用
~# grep -q root /etc/passwd 
~# echo $?
0
11、-n   显示匹配行的行号
~# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
 
其他选项
-A
-B
-C     
    
练习:
1、显示/etc/group文件中含有root的行
grep root /etc/group
2、显示/etc/passwd中以rp开头的行
grep ^rp /etc/passwd
3、显示/etc/group中不以:结尾的行
grep -v :$ /etc/group
4、显示/etc/rc.local的空行及其行号
grep -n ^$ /etc/rc.local
5、显示仅/mnt/cdrom目录下的文件类型为目录的文件(不使用find)
ll /mnt/cdrom | grep ^d

grep 支持的正则元字符
^  $  .   *   []    [^]   \<    \>      \{\}     \(\)
 
~# vim example1.txt
asdf
ad
bsd
nsd
a.d
5.6
b.c
bcc
aff
~# grep a.d example1.txt 
asdf
a.d
~# grep "a\.d" example1.txt 
a.d
~# grep a*d example1.txt
asdf
ad
bsd
nsd
a.d
练习:/etc/passwd文件
1、匹配第2个字符是a的行
~# grep --color ^.a /etc/passwd
2、查找出/usr/bin目录下具有suid权限的文件(不使用find)
~# ll /usr/bin/ | grep ^...[sS] --color
3、找出uid是两位数的行
[0⑼][0⑼]
~# grep --color x:[0⑼][0⑼]: /etc/passwd
~# grep --color :[0⑼][0⑼]:[0⑼] /etc/passwd    
4、显示passwd文件中含有两个bin的行
bin.*bin
~# grep --color "bin.*bin" /etc/passwd
~# grep --color "\<bin.*\<bin" /etc/passwd   //仅仅是bin
bin:x:1:1:bin:/bin:/sbin/nologin
5、显示passwd文件中含有3个root的行
~# grep "\(root\).*\1.*\1" /etc/passwd --color
root:x:0:0:root:/root:/bin/bash
6、显示passwd文件中有9个连续的小写字母的行
[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]
[a-z]\{9\}
~# grep "[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" /etc/passwd --color
~# grep "[a-z]\{9\}" /etc/passwd --color

  ~# vim e2.txt     
aabbcc
aaabbbccc
aaaannnmms
@@@##$
@@##@@
$$@#$%
  1、找出e2.txt文件中含有3个连续的相同字符的行
~# grep "\(.\)\1\1" e2.txt --color
aaabbbccc
aaaannnmms
@@@##$

POSIX表示法
Portable Operating System Interface   ——  可移植操作系统接口

也是适用于非英文环境的系统,即适用于所有的语言环境


括号类                  含义                                                 匹配范围
[:space:]       包括换行符、空格、tab等所有空白字符
[:blank:]        空格和制表符                                             空格和tab
[:alpha:]         字母                                                         a-zA-Z
[:alnum:]       字母和数字                                                 a-Z0⑼
[:cntrl:]           控制字符                                                ctrl、backspace等等
[:lower:]          小写字母                                                 a-z
[:upper:]           大写字母                                                A-Z
[:digit:]             10进制数                                              0⑼
[:xdigit:]           106进制数                                             0⑼a-fA-F
[:punct:]           标点符号                                               ,.?:' "


[^[:alpha:]]       取反,表示不是字母


~# grep "[[:space:]]\.[[:digit:]][[:space:]]" datafile --color
southwest SW Lewis Dalsass 2.7 .8 218
southeast SE Patricia Hemenway 4.0 .7 417


|       或
?       表示0个或1个它前面的字符         a?d    ==>    d   ad
+      表示1个或多个它前面的字符        a+d    ==>   ad  aad  aaad ... ...
()
x{m}
x{m,}
x{m,n}


|
显示datafile文件中含有NW或是WE的行
~# egrep "NW|WE" datafile --color
~# grep -E "NW|WE" datafile --color



~# egrep "2\.?[0⑼]" datafile --color

+  
~# egrep "a+" e2.txt --color
aabbcc
aaabbbccc
aaaannnmms       
3.sed
sed     流编辑器    stream editor
是1种非交互式文本编辑器,默许是不会修改原文件的

工作原理
 1行1行处理的
 从文件的第1行开始读取,放到模式空间中进行相应处理,处理完将结果输出到屏幕上,然后继续读取下1行,直到所有的行都处理终了,sed结束。
 sed1般用于处理大文件。
    
语法:
sed [选项] 'AddressCommand'  文件列表

1、经常使用的选项
-n:静默输出,关闭模式空间的输出,1般与p1起用
-e:允许进行多项编辑,也就是说对同1行做屡次处理、也能够做多点编辑  
-e '动作' -e '动作'   等价于  '动作1;动作2'
-f sed脚本 : 指定运行的sed脚本的
-r:允许使用扩大正则
-i:直接修改原文件
  2、Address :  定址、地址
1)单独的行号
如:  1   就表示要处理第1行
$   表示最后1行
2)起始行,结束行
如:  1,5         处理第1行到第5行
3)/正则表达式/
如:/^root/     处理以root开头的行
4)/正则表达式1/,/正则表达式2/        最小匹配
表示处理从匹配到正则表达式1的行开始,到第1次匹配到正则表达式2之间的所有行
如果正则表达式1匹配到了,正则表达式2未匹配到,那末就从匹配到正则表达式1的行开始,1直处理到文件结束
如果正则表达式1未匹配到,那末就不对文件做处理。            
  如:/^bin/,/bash$/    
binsdadaddaddass
dsfasidsfdhfj09bash
dasdasdasdf--bash
5)起始位置,+N     不是特别经常使用
表示从起始位置开始,后面的N行都处理
如:3,+5       处理3⑻行            
3、Command      
经常使用的:d   p   s   y   q
其他的:a   c   i   r   w
h   H   g   G

1)d:删除
~# sed '/UUID/d' /etc/fstab    
~# sed '1,5d' /etc/fstab
~# sed '$d' /etc/fstab
~# sed '/tmp/,/sfs/d' /etc/fstab
~# sed '/UUID/,+5d' /etc/fstab 
删除从第5行开始到最后1行的所有内容
~# sed '5,$d' /etc/passwd
2)p:打印
  ~# cat -n /etc/passwd | head > pass
  ~# sed 'p' pass    //每行会打印两遍,1遍是处理结果,1遍是模式空间的输出
  ~# sed -n 'p' pass      //只会打印1遍,由于模式空间的输出被关闭了
  ~# sed -n '3,5p' pass   // 打印文件的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     
 ~# sed -n '3p' pass
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 
! 非
~# sed '3!d' pass     //等价于打印第3行
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
练习:
用sed分别实现head ⑴ 和 tail ⑴的功能
head ⑴
~# sed -n '1p' pass
1 root:x:0:0:root:/root:/bin/bash
~# sed '1!d' pass
1 root:x:0:0:root:/root:/bin/bash

tail ⑴
~# sed -n '$p' pass
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
~# sed '$!d' pass
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
 
3)r   读取
~# sed '/^root/r /etc/issue' /etc/passwd
 1 root:x:0:0:root:/root:/bin/bash
Red Hat Enterprise Linux Server release 6.4 (Santiago)
Kernel \r on an \m


2 bin:x:1:1:bin:/bin:/sbin/nologin
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
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
4)w 写
~# sed '/root/w /tmp/douni' pass  //将匹配到的行另存到文件中
~# cat /tmp/douni      
1 root:x:0:0:root:/root:/bin/bash   
5)a   追加   在匹配到的行的下1行插入内容
~# sed '/root/a hello root' pass | head ⑸
1 root:x:0:0:root:/root:/bin/bash
hello root
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
在文件的最后1行插入新内容
~# sed '$a The End' pass 
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
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
The End
6)i  插入     在匹配行的上1行插入内容
~# sed '/daemon/i SO COOL' pass | head ⑸
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
SO COOL
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
~# sed '1i BEGINNING' pass  | head ⑸   //在第1行插入内容
BEGINNING
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
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
7)c  修改       本行替换,将匹配到的行的内容替换成新内容
~# sed '/root/c ROOT' pass    
    1  ROOT
ROOT:x:0:0:root
2 bin:x:1:1:bin:/bin:/sbin/nologin
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
~# sed '/IPADDR/c IPADDR=172.16.254.201' /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=172.16.254.201
NETMASK=255.255.0.0
GATEWAY=172.16.254.1  
8)y      转换的命令,对应替换
  y///
  y/123/ABC/   
  ~# sed 'y/1234/ABCF/' pass
A root:x:0:0:root:/root:/bin/bash
B bin:x:A:A:bin:/bin:/sbin/nologin
C daemon:x:B:B:daemon:/sbin:/sbin/nologin
F adm:x:C:F:adm:/var/adm:/sbin/nologin
5 lp:x:F: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
9 mail:x:8:AB:mail:/var/spool/mail:/sbin/nologin
A0 uucp:x:A0:AF:uucp:/var/spool/uucp:/sbin/nologin
 将文件中所有的小写字母转换成大写字母
~# sed 'y/qwertyuiopasdfghjklzxcvbnm/QWERTYUIOPASDFGHJKLZXCVBNM/' pass 
  9)n     next     处理匹配行的下1行,用的较少
~# sed -n '/root/p' pass
1 root:x:0:0:root:/root:/bin/bash
~# sed -n '/root/{n;p}' pass    //{}里面写多个命令,之间用分号分隔
2 bin:x:1:1:bin:/bin:/sbin/nologin
  10)q   退出       不再向模式空间读入新行
~# sed '/^bin/q' /etc/passwd   
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
~# sed '1q' pass    //head ⑴的又1种方法
1 root:x:0:0:root:/root:/bin/bash
练习:
1、将pass文件每行打印3次
~# sed 'p;p' pass                
2、打印passwd文件的第1行和第3行(多点编辑,用分号分隔命令)
~# sed -n '1p;3p' pass 
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
~# sed -n -e '1p' -e '3p' pass
3、使用sed修改selinux的模式为permissive
~# sed '7c SELINUX=permissive' /etc/selinux/config
4、使用sed永久修改主机名为shell
~# sed '$c HOSTNAME=shell' /etc/sysconfig/network
3、删除pass文件的第1行和最后1行
~# sed '1d;$d' pass
以下操作datafile文件 
4、在匹配到Lewis的行的下1行插入“has Lewis”
~# sed '/Lewis/a has Lewis' datafile
5、在文件的第1行插入“employee's information” 
~# sed "1i employee's information" datafile
11)s   查找替换
定址s/模式匹配(旧的内容)/新的内容/[修饰符]
s@@@    s###  s%%%
修饰符:
g:全局替换,1行中的多个
n:n为数字,1⑸12     替换第n个匹配到的内容
p:打印
w:另存为,写
~# sed 's/root/ROOT/' pass | head ⑶      //默许只替换第1次匹配到的
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
~# sed 's/root/ROOT/2' pass | head ⑶    //替换每行中第2个匹配到的
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
~# sed 's/root/ROOT/g' pass | head ⑶    //全部替换
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
  练习:
1、从以root开头,到以login结尾的行,将sbin替换成bin (/etc/passwd)
~# sed '/^root/,/login$/s/sbin/bin/' /etc/passwd | head

2、将格式为2015/09/02的日期,替换为2015; 09; 02的格式(注意分号后面有空格)
~# date "+%Y/%m/%d"
2015/09/02
~# date "+%Y/%m/%d" | sed 's#/#; #g'
2015; 09; 02
~# date "+%Y/%m/%d" | sed 's/\//; /g'
3、将selinux配置文件中的disabled替换为enforcing,暂时不作用于原文件
~# sed '/SELINUX/s/disabled/enforcing/' /etc/selinux/config

思考题:删除文件中所有的数字     ****                 //1种思想,用替换去删除字符等
~# sed 's/[0⑼]//g' pass               
  
  -i:直接作用于文件
~# sed 's/static/dhcp/' /etc/sysconfig/network-scripts/ifcfg-eth0
~# sed -i 's/static/dhcp/' /etc/sysconfig/network-scripts/ifcfg-eth0
~# sed -i.bak 's/dhcp/static/' /etc/sysconfig/network-scripts/ifcfg-eth0 
//.bak是备份文件的后缀名
~# ls /etc/sysconfig/network-scripts/ifcfg-eth0*
ifcfg-eth0      ifcfg-eth0.bak 


模式匹配时的特殊符号
^:每行的开头
给全文加注释
~# sed 's/^/#/' pass
在第8到10行的开头每行加上###
~# sed 's/^/###/' pass
$:每行的结尾
在匹配到root的行的末尾添加###    
~# sed '/root/s/$/###/' pass
1 root:x:0:0:root:/root:/bin/bash###


-r选项: 支持扩大正则
 ~# sed -r 's/[[:space:]]+//' pass     
 ~# sed 's/[[:space:]]*//' pass
 
 1、将history命令履行结果中编号前面的空白字符删掉
~# history | sed -r 's/[[:space:]]+//'
 2、删除文件中的空行和空白行
~# cat txt 
adadadadada     dasdasdadas


 
dadada   
 
gdfgdgdfgfdg
  ~# cat -A txt
adadadadada     dasdasdadas$
$
 $
dadada   $
^I^I $
gdfgdgdfgfdg$
  ~# sed -r '/^$/d;/^[[:space:]]+$/d' txt
adadadadada     dasdasdadas
dadada   
gdfgdgdfgfdg
&      援用      用来代替匹配到的模式的
将每行的行号加上括号
~# sed -r 's/[0⑼]+/(&)/' pass

~# vim test
hello, i like you
hi, my love
like ==> liker
love ==> lover
~# sed 's/l..e/l..er/' test 
hello, i liker you
hi, my lover
~# sed -r 's/(l..e)/\1r/' test 
hello, i liker you
hi, my lover

like ==> Like
love ==> Love
~# sed -r 's/l(..e)/L\1/' test 
hello, i Like you
hi, my Love
练习:
1、删除每行的第1个字符
2、删除每行的第2个字符
3、删除每行的倒数第1个字符
4、删除每行的倒数第2个字符
5、交换每行的第1个和第2个字符

  思考:
删除/etc/passwd每行的第1个字段
交换/etc/passwd文件的第1个和第2个字段

 作业:
  1、将/etc/inittab文件中的id:5:initdefault中的5替换成3
以下使用datafile3
  1、将Jon的名字改成Jonathan
  2、删除文件的前3行
  3、打印文件的第5到10行
  4、删除含有Lane的行
  5、打印生日在11月和12月的行
  6、在以Fred开头的行末尾添加3个*
  7、将所有包括Jose的行替换为Match Jose
  8、把Popeye的生日改成11/14/46,条件:需要你先匹配诞生日
  9、删除所有的行
  10、将文件中的所有大写字母用括号()括起来      




每多少行操作1次
first~step
first:起始行号
step:步长
 打印偶数行
~# sed -n '2~2p' pass
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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
  每3行打印1次
~# sed -n '1~3p' pass 
1 root:x:0:0:root:/root:/bin/bash
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin


=:打印当前行号
统计文件的行数
  ~# sed -n '$=' /etc/passwd
76

~# vim sc1.sed
/Lewis/a \
 hello everyone \
 ni hao
/Suan/c has suan
1i \
************** \
begin \
**************
$d


调用脚本
~# sed -f sc1.sed datafile
************** 
begin 
**************
northwest NW   Charles Main 3.0 .98 334
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 218
 hello everyone 
 ni hao
has suan
southeast SE Patricia Hemenway 4.0 .7 417
eastern EA TB Savage 4.4 .84 520
northeast NE AM Main Jr. 5.1 .94 313
western WE Sharon Gray 5.3 .97 5 23
north NO Margot Weber 4.5 .89 59
模式空间
用于处理文本行的
PATT,最多能够存储8192字节

保存空间
用于保存文本行的
HOLD,sed用来保存已处理过的文本行的,最多保存8192字节,默许有1个空行

触及到的命令
h:将模式空间的内容复制到保存空间   ——  覆盖模式
H:将模式空间的内容追加到保存空间  —— 追加模式
g:将保存空间的内容复制到模式空间  ——  覆盖模式
G:将保存空间的内容追加到模式空间  ——  追加模式

x:将模式空间的内容和保存空间的内容进行交换

交换第1行和第2行的内容
~# sed '1{h;d};2G' pass | head ⑸
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
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
将第1行到第3行的内容复制到第4行后面
~# sed '1h;2,3H;4G' pass  | head 
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
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
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
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
将第1行到第3行的内容剪切到第4行的后面
~# sed '1{h;d};2,3{H;d};4G' pass  
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
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
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
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
在每行的下面添加1个空行
~# sed 'G' pass


思考:倒序输出文件的每行
假定文件以下:
aa
bb
cc
dd
要求输出结果以下:
  dd
  cc
  bb
  aa

4.awk
awk     1种编程语言、文本编辑器、也是1种非交互式的编辑器


功能:对文本数据进行汇总和处理,是1个报告的生成器,能够对数据进行排版


awk        nawk        gawk       posix awk
nawk   ——  solaris
gawk,awk   ——   GNU Linux
 
工作进程
将文件中的内容逐行的进行扫描,把整行内容存入内置变量$0中;
再依照指定的分隔符(默许的分隔符是空白)将输入行切成若干个列(字段),存入变量$1~$100,再使用命令(print、printf)将变量打印输出,输出分隔符默许也是空白
再读取下1行,循环处理,直到文件处理结束。

~# ifconfig eth0 | grep Bcast | awk '{print $2}' | awk -F: '{print $2}'
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生