正则表达式,指定格式额字符串,有一定的规律
正则表达式的作用:指定格式的字符串去匹配指定的行得出想要的结果
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选项就支持了