正则表达式
是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
sed
特色功能是替换指定字符,也可以完成grep的功能。
- 下面语句实现grep的匹配功能:
[root@tanyvlinux ~]# sed -n '/root/'p passwd #匹配root的正则,-n禁止打印无关内容, p把内容打印出来;
operator:x:11:0:operator:/root:/sbin/nologin
[root@tanyvlinux ~]# sed -n '1,5'p passwd #打印1-5行;
1111111111111111111r
kdkk
ooooo
ooo
oo oo
[root@tanyvlinux ~]# sed -n '/sh$/'p passwd #sh结尾的行;
r ot:x:0:0:t:/t:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
[root@tanyvlinux ~]# sed -n -e '/sh$/'p -e '1,3'p passwd #-e指定多个条件,同时生效的行,会打印2次;
1111111111111111111r
kdkk
ooooo
r ot:x:0:0:t:/t:/bin/bash
[root@tanyvlinux ~]# sed -n -e '/nfs/'Ip passwd #I不区分大小写;
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
- 下面语句可完成编缉功能:
sed '1,3’d passed #去除1-3行,后显示内容;
sed ‘1,2s/ot/to/g’ passwd #1-2行中所有ot改成to显示出来;
[root@tanyvlinux ~]# sed -r 's/([^:]*):(.*):([^:]*)/\3:\2:\1/' passwd #第一段与最后一段的替换,\3 \2\1代表前面的小括号内容,-r可以识别扩展符号例如(), +;
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
[root@tanyvlinux ~]# sed 's/^.*$/111&/g' -i passwd #&代表查找出来的内容,这里是全部匹配,在行前面加上111, -i把内容写入文件;
111bin:x:1:1:bin:/bin:/sbin/nologin
111daemon:x:2:2:daemon:/sbin:/sbin/nologin
sed 's/([0-9]+)(.*)/\2/' -i my_lish.h #可以把文件所有行码去除,用空格分开的文字;
awk
[root@tanyvlinux ~]# awk -F ':' '{print $1":"$3,$4}' passwd #-F指定分隔符:,打印出每行的第一第三第四段,打印格式用双引号添加分隔符,以逗号分隔用空格分隔;$0为所有段;
bin:1 1
daemon:2 2
[root@tanyvlinux ~]# awk -F ':' '$6 ~ /home/ {print $1,$3,$4} /mysql/ {print $1,$3,$4}' passwd #同时判断了两个条件,条件1:第六段$6匹配home, 条件2:整句匹配mysql;
vsftpd 1000 1000
user1 1001 1001
user2 1002 1001
msql 1003 1003
mysql 1004 1004
mysql 1004 1004
user3 1005 1005
mys 1006 1007
php-fpm 1007 1008
fftp 1008 1009
ut1 1011 10
[root@tanyvlinux ~]# awk -F ':' '$3>1010 {print $1,$3,$4}' passwd #可以使用等于==,大于,小于,不等于!=作判断,数字加上双引号判断为字符以ASCII排序;
nfsnobody 65534 65534
ut1 1011 10
[root@tanyvlinux ~]# awk -F ':' '$3>"1010" {print $1,$3,$4}' passwd
daemon 2 2
adm 3 4
[root@tanyvlinux ~]# awk -F ':' '$7!="/sbin/nologin" {print $1,$3,$4}' passwd
sync 5 0
shutdown 6 0
[root@tanyvlinux ~]# awk -F ':' '$3==$4 && $3>=1000 {print $1,$3,$4} ' passwd #字段比较,&&同时满足前后两个条件;
vsftpd 1000 1000
user1 1001 1001
nfsnobody 65534 65534
msql 1003 1003
mysql 1004 1004
user3 1005 1005
[root@tanyvlinux ~]# awk -F ':' '$3!=$4 || $3==0 {print $1,$3,$4} {OFS=":"}' passwd #||或者,OFS定义输出格式分格符,不用一个个写出来;
root:0:0
adm:3:4
lp:4:7
[root@tanyvlinux ~]# awk -F ':' '{print NR":"NF}' passwd #打印每一行的行号NR和段数NF;
1:0
2:7
3:7
[root@tanyvlinux ~]# awk -F ':' 'NR>40 || NR==1' passwd #NF,NR作为条件使用;
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
saned:x:990:984:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
[root@tanyvlinux ~]# awk -F ':' '{if($1!="root") {print $1,$3,$7}}' passwd #if作条件判断,是之前判断的完整写法,if需要将print包括在里面;
daemon 2 /sbin/nologin
bin 1 /sbin/nologin
[root@tanyvlinux ~]# awk -F ":" '{(tot=tot+$3)} END {print tot}' passwd #循环语句,没有END遍历一行就print一次tot;
91285
[root@tanyvlinux ~]# awk -F ":" 'NR>7 {print $(NR/7)":"NR":"$NF}' passwd #$加数字是第几段;
shutdown:8:/sbin/shutdown #显示第一段:行号:第七段;$(NR/7)小于7行变成$0,打印整行;
halt:9:/sbin/halt
[root@tanyvlinux ~]# tail -3 passwd |awk -F ":" '$3="root"' #对第三段赋值;
fftp x root 1009 /home/fftp /bin/bash
zabbix x root 979 Zabbix Monitoring System /var/lib/zabbix /sbin/nologin
ut1 x root 10 /home/ut2 /bin/bash
- 用选取一段匹配另外一个变量;
cat file.txt | awk '{ if ($7~/'"$i"'/) {print $0} }'| wc -l ;