2.正则
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.正则相关的知识,希望对你有一定的参考价值。
[TOC]
一,DAY4
1.什么是正则
- 正则是一串有规律的安符串
- 掌握好正则对于编写shell脚本有很大帮助
- 名种编程语言中都有正则,原理是一样的
- 本章将要学习grep/egrep、sed、awk (egrep是grep的扩展)
2.grep
- grep [-cinvABC] ‘word‘ filename
- -c行数
- -i 不区分大小写
- -n 显示行号
- -v 取反
- -r遍历所有子目录
- -A后面跟数字,过滤出符合要求的行以及下面n行
- -B同上,过滤出符合要求的行以及上面n行
-
-C同上,同时过滤出符合要求的行以及上下各n行
- 演示
[root@localhost grep]# grep -c ‘root‘ passwd 2 [root@localhost grep]# grep -n ‘root‘ passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin [root@localhost grep]# grep -nv ‘nologin‘ passwd 1:root:x:0:0:root:/root:/bin/bash 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 [root@localhost grep]# grep -nA2 ‘root‘ passwd 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 -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@localhost grep]# grep -nB2 ‘root‘ passwd 1:root:x:0:0:root:/root:/bin/bash -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin [root@localhost grep]# grep -nC2 ‘root‘ passwd 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 -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
grep/egrep示例
grep -n ‘root‘ /etc/passwd
grep -nv ‘nologin‘ /etc/passwd
grep ‘[0-9]‘/etc/inittab 过滤包含数字0到9的行
grep -v ‘[0-9]‘/etc/inittab 过滤不包含数字0到9的行
grep -v ‘^#‘ /etc/inittab 过滤给不以#号开头的行
grep -v ‘^#‘ /etc/inittab|grep -v ‘^$‘ 过滤出不以#号开头以及空行的行
grep -n ‘^[^0-9]‘ passwd 过滤出以非数字开头的行
grep ‘^[^a-zA-Z]‘ test.txt 过滤出非a-z A-Z 开头的行
grep ‘r.o‘ test.txt .点表示任意一个字符,
grep ‘o*‘ test.txt *表示*号左边的那个字符可重复0-n次,有o和没有o的行都会过滤出来
grep ‘.*‘ test.txt .* 点星表示任意个任意字符
grep ‘o{2}‘ /etc/passwd 在正则中花括号表示前面字符的重复范围,o{2}表示o出现两次,这里使用是因为使用grep时花括号需要脱意
egrep ‘o{2}‘ /etc/passwd 使用egrep时,可以不使用脱意符号 ,过滤出o连续出现两次的行,像这样aobo不连续的不会过滤
egrep ‘o+‘ /etc/passwd +号表示+号左边字符可得复1-n次
egrep ‘oo?‘ /etc/passwd ?号表示前面那个字符重复0-1次, 包含0个o的或者1个o的都会过滤出来
egrep ‘root|nologin‘ /etc/passwd | 表示或者的意思,过滤出包含root或者nologin的行
egrep ‘(oo){2}‘ /etc/passwd 过滤出oo连续出现两次的行
sed
sed也能实现grep的功能,但是比较麻烦,sed的强项是替换指定字符
sed -n ‘5‘p test.txt
sed -n ‘1,5‘p test.txt
sed -n ‘1,$‘p test.txt
sed -n ‘/root/‘p test.txt -n表示只匹配有root的行,不加-n会把所有的行打印出来,p表示打印的意思
sed -n ‘/o+t/‘p passwd
sed -nr ‘/o+t/‘p passwd 和sed -n ‘/o+t/‘p passwd一样,加-r就可以不用脱意符号
sed -n ‘/^1/‘p test.txt
sed -n ‘in$‘p test.txt
sed -n ‘/r..o/‘p test.txt
sed -n ‘oo*‘p test.txt
sed -e ‘1‘p -e ‘/111/‘p -n test.txt
sed ‘1‘d test.txt
sed ‘1,3‘d test.txt
sed ‘/oot/‘d test.txt
sed ‘1,2s/ot/to/g‘ test.txt
sed ‘s#ot#to#g‘ test.txt
sed ‘s/[0-9]//g‘ test.txt
sed ‘s/[a-zA-Z]//g‘ test.txt
sed -r ‘s/(rot)(.*)(bash)/321/‘ test.txt
sed ‘s/^.*$/123&/‘ test.txt
sed -i ‘s/ot/to/g‘ test.txt
二,DAY5
awk
head -n2 test.txt|awk -F ‘:‘ ‘{print $1}‘
head -n2 test.txt|awk -F ‘:‘ ‘{print $0}‘
awk -F ‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘
awk ‘/oo/‘ test.txt
awk -F ‘:‘ ‘$1 ~/oo/‘ test.txt
awk -F ‘:‘ ‘/root/ {print $1,$3} /test/ {print $1,$3}‘ test.txt
awk -F ‘:‘ ‘$3=="0"‘ /etc/passwd
awk -F ‘:‘ ‘$3>="500"‘ /etc/passwd
awk -F ‘:‘ ‘$3>=500‘ /etc/passwd
awk -F ‘:‘ ‘$7!="/sbin/nologin"‘ /etc/passwd
awk -F ‘:‘ ‘$3<$4‘ /etc/passwd
awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ /etc/passwd
awk -F ‘:‘ ‘$3>1000 || $7=="/bin/bash"‘ /etc/passwd
head -5 /etc/passwd |awk -F ‘:‘ ‘{OFS="#"} {print $1,$3,$4}‘
awk -F ‘:‘ ‘{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}‘ /etc/passwd
head -n3 /etc/passwd | awk -F ‘:‘ ‘{print NF}‘
head -n3 /etc/passwd | awk -F ‘:‘ ‘{print NR}‘
awk ‘NR>40‘ /etc/passwd
awk -F ‘:‘ ‘NR<20 && $1 ~ /roo/‘ /etc/passwd
head -n 3 /etc/passwd |awk -F ‘:‘ ‘$1="root"‘
awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ /etc/passwd
awk -F ‘:‘ ‘{if ($1=="root") {print $0}}‘ /etc/passwd
以上是关于2.正则的主要内容,如果未能解决你的问题,请参考以下文章