正则表达式,指定格式额字符串,有一定的规律 正则表达式的作用:指定格式的字符串去匹配指定的行得出想要的结果
grep匹配,sed替换,awk分段
如何使用正则表达式? 工具一:grep过滤出指定的行,满足一定的条件. 任意一个字符 * 表示0个或多个*前面的字符 .* 任意个数任意字符 ? 0个或1个?前面字符 + 1个或多个+前面的字符 ? + () {} | 在使用的时候需要脱意 ,或者使用egrep grep命令 [root@daixuan ~]# grep 'root' /etc/passwd /etc/passwd 中匹配字符root root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@daixuan ~]# cp /etc/passwd 1.txt cp:是否覆盖"1.txt"? y [root@daixuan ~]#grep --color'root' 1.txt 标注匹配的字符root颜色为红色 root:x:0:0::/:/bin/bash operator:x:11:0:operator:/:/sbin/nologin [root@daixuan ~]# grep --color -n'root' 1.txt -n写出匹配字符串所在的行 1:root:x:0:0:root:/root:/bin/bash 11:operator:x:11:0:operator:/root:/sbin/nologin [root@daixuan ~]# alias cg='grep --color' 给常用的指令grep --color设置别名cg [root@daixuan ~]# alias alias cg='grep --color' [root@daixuan ~]# vim ~/.bash .bash_history.bash_logout .bash_profile.bashrc [root@daixuan ~]# vim ~/.bashrc 永久使用cg,需要编辑家目录下的.bashrc文件 # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' [root@daixuan ~]# cg -v 'root' 1.txt -v取反, -v找到1.txt下不包括root的行 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@daixuan ~]# cg-c'root' 1.txt -c (count计数)统计1.txt文件中包含root的行数 2 [root@daixuan ~]# cg -n -B 2 'root' 1.txt -B找到包含root的行,并显示上面的两行 -- 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11:operator:x:11:0:operator:/root:/sbin/nologin [root@daixuan ~]# cg -n-A2 'root' 1.txt -A找到包含root的行,并显示下面的两行 1::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 12-games:x:12:100:games:/usr/games:/sbin/nologin 13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin [root@daixuan ~]# cg -n -C 2 'root' 1.txt -C找到包含root的行,并显示上下面的两行 1:root:x:0:0:root:/cg -r 'iptables' /etc -r遍历一个目录,匹配iptables /etc/sysconfig/iptables:# Generated by iptables-save v1.4.7 on Sat Oct 24 09:51:22 2015 /etc/sysconfig/iptables-config:# Load additional iptables modules (nat helpers) /etc/sysconfig/iptables-config:# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped [root@daixuan ~]# cg -rh'iptables' /etc/* -h匹配字符串后,只保留结果, 将文件名删掉 iptables -t nat -P OUTPUT ACCEPT iptables -t nat -P POSTROUTING ACCEPT cg '[0-9]' 1.txt 匹配1.txt中包含数字0到9中的其中之一数字的行 cg '[0123456789]' 1.txt 匹配1.txt中包含数字0到9中其中之一数字的行 cg '[a-zA-Z]' 1.txt 匹配1.txt中包含数字a到z或者包含A-Z中其中之一字母的行 [root@daixuan ~]# cg -v '[a-zA-Z]' 1.txt -v '[a-zA-Z]' 不包含a-z、A-Z的字符的行,特殊字符、空格、数字匹配 !@#$%^&*(@#$%^&*
12345678087653456 '^[a-z]'1.txt 以a-z开头的行^[a-z] root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@daixuan ~]# cg '^[0-9]' 1.txt 以数字开头的行^[0-9] 12345678087653456 [root@daixuan ~]# cg -v '^[0-9]' 1.txt 开头,-v '^[0-9]'表示不以数字开头的行,包括了以特殊字符、空格、字母开头的行 root:x:0:0:root:/root:/bin/bash '[^0-9]'1.txt 内容,'[^0-9]'表示0-9数字以外的字符,只要这行内容不是纯数字的就列出来,有数字也好,但只要有一个字母(字符)就会列出了 root:x:0:0:root:/root:/bin/bash '^[^0-9]'1.txt 表示任何非数字开头的行 [root@daixuan ~]# cg '^$' 1.txt ^是开头,$是结尾,表示空行 -v '^$'1.txt -v '^$' 匹配空行以外的行 特殊符号 'r.o'1.txt .代表匹配任何一个字符 root:x:0:0:root:/root:/bin/bash riomon:x:2:2:daemon:/sbin:/sbin/nologin admr_o3:4:adm:/var/adm:/sbin/nologin r2olp:x:4r*olp:/var/spool/lpd:/sbin/nologin 'r*o'1.txt *代表匹配任何*符号前面的字符,0个、1个或则多个r ralt:x:7:r@o0:halt:/sbin:/sbin/haltrrrro rrrrro l:x:8:12:mail:/var/spool/mail:/sbin/nroooooologin ro oooooo operatrrrrrro:x:11:0:operator:/root:/sbin/nologin 'r.*o'1.txt .任意一个字符,*代表任意个*前面的字符,.*表示任意个任意字符,只要是r开头,o结尾,中间是什么都可以 root:x:0:0:root:/root:/bin/bash riomon:x:2:2:daemon:/sbin:/sbin/nologin admr_o3:4:adm:/var/adm:/sbin/nologin r2olp:x:4r*olp:/var/spool/lpd:/sbin/nologin
[root@daixuan ~]# cg 'r?o' 1.txt 是脱意符号,?表示0个或者1个?前面的字符r,ro,o 都满足 t:x:0:0:t:/t:/bin/bash ro o bin:x:1:1:bin:/bin:/sbin/nolo[root@daixuan ~]# cg -E 'r?o' 1.txt 不想加脱意符号,使用grep -E<==>egrep,能够达到脱意?的目的 t:/bin/bash ro o gin
[root@daixuan ~]# egrep --color 'r?o' 1.txt egrep不用脱意字符了,'r?o'表示0个或者1个?前面的字符r l[root@daixuan ~]# egrep --color'r+o'1.txt +表示1个或者多个+前面的r,这三条命令结果一样 [root@daixuan ~]# cg -E 'r+o' 1.txt [root@daixuan ~]# cg 'r+o' 1.txt root:x:0:0:root:/root:/bin/bash ralt:x:7:r@o0:halt:/sbin:/sbin/haltrrrro [root@daixuan ~]# egrep --color 'root|nologin' 1.txt 包含root或者nologin的行 [root@daixuan ~]# grep --color 'root' 1.txt | grep --color 'nologin' 管道符实现包含root和nologin operatrrrrrro:x:11:0:operator:/root:/sbin/nologin [root@daixuan ~]# egrep --color '(rr)+' 1.txt rr是一个整体,包含偶数个r,2、4、6.。 ralt:x:7:r@o0:halt:/sbin:/sbin/haltrrrro rrrrro l:x:8:12:mail:/var/spool/mail:/sbin/nroooooologin [root@daixuan ~]# egrep --color '(rr){3}' 1.txt rr匹配3次
sed命令 [root@daixuan ~]# sed -n '10'p 1.txt 查看1.txt的第10行 shutdor:own:x:6:0:shutdown:/sbin:/sbin/shutdown [root@daixuan ~]# sed '10'p 1.txt 没有-n选项,则第十行打印了两次 riomon:x:2:2:daemon:/sbin:/sbin/nologin r2olp:x:4r*olp:/var/spool/lpd:/sbin/nologin synrooc:x:5:0:sync:/sbin:/bin/sync [root@daixuan ~]# sed -n '1,10'p 1.txt 打印第1-10行 [root@daixuan ~]# sed -n '33,$'p 1.txt 打印第33行到末行 daixuan:x:500:500:daixuan:/home/daixuan:/bin/bash daixuan123:x:501:512::/home/daixuan123:/bin/bash user3:x:506:512::/home/user3:/bin/false [root@daixuan ~]# sed -n '/root/'p 1.txt sed实现grep的功能,查找包含root的行 [root@daixuan ~]# sed -n '/r.o/'p 1.txt .代表任意一个字符 [root@daixuan ~]# sed -n '/r*o/'p 1.txt *代表有0个或者多个*前面的字符r,一个o也满足 [root@daixuan ~]# sed -n '/r.*o/'p 1.txt .*代表r和o之间有任意个任意字符 r2olp:x:4r*olp:/var/spool/lpd:/sbin/nolog [root@daixuan ~]# sed -n '/r?o/'p 1.txt 脱意?,表示0个或者1个r,ro,o都满足 [root@daixuan ~]# sed -n '/r+o/'p 1.txt 脱意+,表示1个或者多个r,ro,rro,rrro [root@daixuan ~]# sed -n '/root|nologin/'p 1.txt 包含root或者nologin [root@daixuan ~]# sed -n '/(oo)+/'p 1.txt oo +一对或者多对oo,-r选项sed 自动脱意 [root@daixuan ~]# sed -n -r '/(oo)+/'p 1.txt [root@daixuan ~]# sed '/^$/'d 1.txt 删除空行之后显示,并没有真正删除 [root@daixuan ~]# sed '/[a-zA-Z]/'d 1.txt 删除包含字母的行之后显示,并没有真正的删除 [root@daixuan ~]# sed -i '/[a-zA-Z]/'d 1.txt -i选项,真正删除文件内容并显示 [root@daixuan ~]# cat 1.txt sed中打印含有关键字的,比如/root/,/nologin/ 左右两边要加/,而grep就不用直接用引号引起来就行, 这是sed的语法,包括awk也是用//
我想删除第10行和第12行怎么写? sed '10d; 12d' 1.txt 这样用是没有问题的,如果你想直接在文件中生效,需要加-ised替换功能 [root@daixuan ~]# sed '1,10s/nologin/login/g' 1.txt g global全局替换1-10行的nologin为login,加i,真正修改文件内容 bin:x:1:1:bin:/bin:/sbin/login daemon:x:2:2:daemon:/sbin:/sbin/login adm:x:3:4:adm:/var/adm:/sbin/login [root@daixuan ~]# sed 's#^.*#login#' 1.txt 把任何字符开头的行替换成login login login
awk分段匹配替换,可以进行数据运算,比较,进行逻辑运算 [root@daixuan ~]# awk -F ':' '{print $3,$4}' 1.txt 打印第三段和第四段,':' 分隔符, 0 0 1 1 2 2 [root@daixuan ~]# awk -F ':' 'OFS="##"{print $3,$4}' 1.txt 使用OFS="##"指定打印出来的分隔符是## 0##0 1##1 2##2 [root@daixuan ~]# awk'/user|root/'1.txt 匹配含有user或者root的字符 saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin [root@daixuan ~]# awk '/r.o/' 1.txt 代表匹配任何一个字符,必须是一个字符 [root@daixuan ~]# awk '/r*o/' 1.txt *代表匹配任何*符号前面的字符,0个、1个或则多个r,o,ro,raao,rrrro [root@daixuan ~]# awk '/r.*o/' 1.txt .*代表任意个任意字符 adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@daixuan ~]# awk '/r?o/' 1.txt ?表示0个或者1个?前面的字符r [root@daixuan ~]# awk '/r+o/' 1.txt +表示1个或者多个+前面的r [root@daixuan ~]# awk -F ':' '$1~/r*o/' 1.txt 查询1.txt文件中第一段包含r*o的并且打印出来该行 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown [root@daixuan ~]# awk -F ':' '$1~/r*o/ {print $1}' 1.txt 查询1.txt文件中第一段包含r*o的并且打印出来第一段 root daemon shutdown [root@daixuan ~]# awk -F ':' '$1~/r*o|daixuan/{print $1,$2,$3}' 1.txt 查询1.txt文件中第一段包含r*o的并且打印出来第一段,| 包含r*o或者daixuan 打印1,2,3段 root x 0 daemon x 2 shutdown x 6 daixuan x 500 daixuan123 x 501[root@daixuan ~]# awk -F ':' '$1=="root"' 1.txt 第一段=root显示该行 [root@daixuan ~]# awk -F ':' '$1=="root"||$7~/nologin/' 1.txt $3=root或者$7匹配nologin [root@daixuan ~]# awk -F ':' '$3>500' 1.txt $3>500 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@daixuan ~]# awk -F ':' '$7!="/sbin/nologin"' 1.txt $7!=/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt [root@daixuan ~]# awk -F ':' '$7!~/nolog/' 1.txt $7不匹配nolog [root@daixuan ~]# awk -F ':' '$3<$4' 1.txt [root@daixuan ~]# awk -F ':' '$3==$4' 1.txt [root@daixuan ~]# awk -F ':' 'NR<10 {print $1,$5,$7}' 1.txt root root /bin/bash bin bin /sbin/nologin daemon daemon /sbin/nologin
awk的内置变量OFS分隔符,NR row行,NF 段 [root@daixuan ~]# awk -F: 'NR==10 {print $1,$5}' 1.txt 打印第10行的第一段和第五段 uucp uucp [root@daixuan ~]# awk -F: '{if(NR==10)print $1,$5}' 1.txt 如果行为10,打印第10行的第一段和第五段 [root@daixuan ~]# awk -F: 'OFS=":"{if(NR==10)print $1,$5}' 1.txt 设定分割符号: uucp:uucp [root@daixuan ~]# awk -F ':' '{print NF}' 1.txt 每一行共7段 7 [root@daixuan ~]# awk -F ':' '{if(NF==7)print $1}' 1.txt 每行为7段的打印第一段 bin AWK数字运算 [root@daixuan ~]# awk -F ':' '$7=$3+$4' 1.txt 把第7段修改为第3段和第4段相加的和 bin x 1 1 bin /bin 2 daemon x 2 2 daemon /sbin 4 adm x 3 4 adm /var/adm 7 [root@daixuan ~]# awk -F ':' '{(sum=sum+$3)}; END {print sum}' 1.txt 循环把所有的$3第三段想加为sum并输出 69422 [root@daixuan ~]# awk -F ':' 'OFS=":" {$7=$3+$4;print $0,$3}' 1.txt root:x:0:0:root:/root:0:0 bin:x:1:1:bin:/bin:2:1 daemon:x:2:2:daemon:/sbin:4:2 因为awk 不支持 {},所以 {1,3}不生效 awk 加上 --posix选项就支持了 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|