正则表达式

1、是一套处理字符串的规则和方法,以行为单位对字符串进行处理; 访问日志、错误日志如何快速过滤我们需要的内容,需要正则;

cut -d ':' -f1 /etc/passwd |head -n 3 把passwd 以:为分割 取出第一列的前3行的值 Awk Sed grep -n 给每一行过滤的加行号

则:
2、符号

1)^word 以word开头的 ^.*word

2) word$ 以word结尾的: word.*$ grep "^M" -i以m开头的,-i是不区分大小写

3). 任意一个字符,有且只有一个 a、在正则表达式里是任意一个字符,代表且只能代表任意一个字符 b、 隐藏文件的标示 c、本级目录 个、rep "bl.g"以bl开头,g结尾的进行过滤

4)\ 在需要转译的还原前使用,具备有特殊意义的字符还原之前的意思,例如$是以**结尾,但是之前不是这个意思,所以加\$还原之前的意思。 转译字符

5)* 匹配字符,重复前面的字符0次或多次

6).* 匹配所有字符,任意或者多个字符开头

7)[] 字符集合重复字符集 Grep "g[ol]b" 中间是gob或者glb进行匹配,这个只能是一个字符选择

8)[^word] 匹配不包含中括号内任意字符,就是不包含word的

9)a\{n,m\},重复前面的字符 至少n次至多m次,

如果用egrep可以去掉斜线 a \{,m\} 重复前一个字符至多m次(目前6以后的系统没有了) \ {n,\} 重复前一个字符至少n次 \{n\} 重复前一个字符 重复 n次 Grep "490 \{2,3\}480" 重复0有2-3次的进行匹配 Grep "490 \{5\}480" 重复0有5次的进行匹配

扩展的正则表达式 ERE在用grep必须用-E匹配多个条件:

1) + 重复一个或 一个以上的字符 Grep -E "490+480" 0重复一次或以上都匹配

2)? 0个或一个字符

3) | 或的方式查找多个字符串 grep -E "22|23" /etc/services

4)()找出“用户组”的字符串 Grep -E "b(oo|ll)g" 中间可以是boog 或者 是bllg都进行匹配 这里可以是一组字符匹配选择

案例:过滤Linux eh0的IP地址

方法一:

1、用grep取行

2、用cut取列以:为分隔符取出第二列

3、用cut取列以空格为分隔符取出第一列

[root@web-01 ~]# ifconfig eth0 | grep "inet addr"|cut -d ":" -f2 10.12.99.102 Bcast

[root@web-01 ~]# ifconfig eth0 | grep "inet addr"|cut -d ":" -f2|cut -d " " -f1 10.12.99.102

方法二: Awk -F “:”以:为分隔符

[root@web-01 ~]# ifconfig eth0 | grep "inet addr"|awk -F ":" '{print$2}'|awk -F " " '{print$1}'

10.12.99.102

方法三: 以:或者空格为分隔符取出第十三列:空格和:都作为分隔符

[root@web-01 ~]# ifconfig eth0 | grep "inet addr"| awk -F "[: ]" '{print$13}'

10.12.99.102

方法四: 带上+是连续分隔符的就当一个; 前面重复的:和空格多个分隔符算一个;

[root@web-01 ~]# ifconfig eth0 | grep "inet addr"| awk -F "[: ]+" '{print$4}'

10.12.99.102

方法五: 用sed取行,有行号的取第二行

[root@web-01 ~]# ifconfig eth0 | sed -n '2p'|awk -F "[: ]+" '{print$4}'

10.12.99.102

方法六: 用awk取行,NR==2为第二行

[root@web-01 ~]# ifconfig eth0 | awk -F "[: ]+" 'NR==2 {print$4}'

10.12.99.102

方法:print $NF 从最后一列取,

 默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容

通过sed取行跟grep "inet addr"一个效果

sed -n '行数1、行数2p' :取出行数1到行数二之间的数据

ifconfig eth0 | sed -n '/inet addr/p' |Sed 's#^.*addr:##g' 以任何字符多个开头,以addr:结尾

[root@web-01 ~]# ifconfig eth0 | sed -n '/inet addr/p' | sed 's#^.*addr:##g'| sed 's# Bc.*$##g' 以两个空格Bc开头,任意结尾分割

10.12.99.102

通过\(.*\)取数:

.任意字符、*多个开头多个字符 ^.*是以任意多个字符开头;

离目标最近的addr:字符;

需要的内容用 \(.*\),

离目标最近后面的空格空格Bcast开头的所有多个字符结尾;

\1 去取()中的内容,(第二个括号用\2)

-n取消输出,由于之前-n取消默认输出,所以需要在后面加个p打印出来

[root@web-01 ~]# ifconfig eth0 | sed -n 's#^.*addr:\(.*\) Bcast.*$#\1#gp'

10.12.99.102

 

 

posted @ 2017-09-26 09:44  shadow_eric  阅读(119)  评论(0)    收藏  举报