linux运维实战练习-2015年8月27日课程作业

基本正则表达式 grep命令

一、总结:

grep, egrep, fgrep

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

1、grep:Global search REgular expression and Print out the line.

  作用:文本搜索工具,根据用户指定的“模式(pattern)”逐行去搜索目标文本,打印匹配到的     行;PATTERN:是文本字符和正则表达式的元字符组合而成的匹配条件,可用单引号‘ ’将pattern括   起来以避免shell通配的影响,强引用不替换而显示字符本身。" " 双引号,字符串中的` ` ,$, \    等特殊字符会被shell解释替换后,再传递给grep。对普通的字符串(没有特殊字符和空格的字符   串)也可以不加引号,直接搜索。 

  模式:由正则表达式的元字符及文本字符所编写的过滤条件;

  语法:grep [options]PATTERN [FILE...] 

  常用参数: --color=auto:对匹配到的串做高亮显示;

 -v:显示模式匹配不到行;

 -i: 忽略字符大小写;

 -o: 仅显示能够被模式匹配到的串本行;

 -q: 静默模式;

 -c 显示被匹配到的行数 

-n 输出行号 

-v 反向选择,即找没有搜索字符串的行 

-w 匹配单词 

-A # 连同匹配行的下#行一并显示,#代表任意数字 

 -B # 连同匹配行的上#行一并显示,#代表任意数字 

-C # 连同匹配行的上下#行一并显示,#代表任意数字 

-R或-r 递归搜索目录或子目录下匹配的字所在文件(可配合find命令 

-E  相当于egrep 支持扩展的正则表达式 

-F  相当于fgrep 不支持正则表达式 

  基本正则表达式元字符:   

字符匹配:.: 匹配任意单个字符;

[]:匹配指定范围内的任意单个字符;

[^]:匹配指定范围内的任意单个字符;

POSIX特殊字符类:可以通过 man 7 glob查看 

   [:alpha:]   文字字符   [A-Za-z]

   [:digit:]   数字字符   [0-9]

   [:graph:]   非空字符(非空格、控制字符)

   [:lower:]   小写字符  [a-z]

   [:upper:]   大写字符  [A-Z]

   [:alnum:]    [0-9a-zA-Z]

   [:cntrl:]   控制字符 

   [:print:]   非空字符(包括空格)

   [:punct:]    标点符号

   [:space:]    所有空白字符(新行,空格,制表符),制表符还可以用\t表示

   [:xdigit:]    十六进制数字和字母(0-9,a-f,A-F)

我们在用时要这样用:[[:alpha:]],如果取反就是[^[:digit:]]

次数匹配:用于要指定其次数的字符的后面;

*: 任意次;

\?:0或1次;

\+:1或多次; 

\{m\}:精确限制为m次;

\{m,n\}: 至少m次,至多n次,[m,n]

\{0,n\}:至多n次;

\{m,\}:至少m次;

.*: 匹配任意长度的任意字符;


位置锚定:

^: 行首锚定;用于模式的最左侧;

$: 行尾锚定;用于模式的最右侧;

\<, \b: 词首锚定;用于表示单词的模式的左侧;

\>, \b:词尾锚定;用于表示单词的模式的右侧;

^$: 空白行;


分组:\(\)

分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量中;这些变量分别是\1, \2, ...

\1: 从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容;

\2:

...

   后向引用:使用变量引用前面的分组括号中的模式所匹配到的字符;

扩展的正则表达式:

grep家庭有三个命令:

grep:基本正则表达式

 -E: 扩展正则表达式

 -F:不支持正则表达式

egrep:扩展正则表达式

fgrep:不支持正则表达式


 扩展正则表达式的元字符:

字符匹配:

.: 任意单个字符

[]:

[^]:

次数匹配:

*

?: 0次或1次;

+: 1次以上;

{m}: 精确匹配m次;

{m,n}: 至少m次,至多n次;


锚定:

^: 锚定行首

$: 锚定行尾

\<, \b

\>, \b

分组:()

后向引用:\1, \2, ...

或者:

a|b 

C|cat: 不表示Cat或cat,而表示C或cat;

要写成(C|c)at


二、练习   

 1、显示/etc/passwd文件中以bash结尾的行   

wKiom1XjL9qQti6mAAEw052LYa0062.jpg

 2、显示/etc/passwd文件中的两位数或三位数

[Task@magedu ~]$ grep  -o '[[:digit:]]\{2,3\}' /etc/passwd
12
10
14
11
12
100
13
30
14
50
99
99
81
81
69
69
499
76
89
89
74
74
500
500
501
27
51
502
502
51
503
503
504
504


  3、显示`netstat-tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行   

wKioL1XjNruCKko4AAEjMibad-0852.jpg


  4、 添加用户bash、testbash、basher以及nologin用户(nologin用户的shell      

     为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行   

[Task@magedu ~]$ grep  '^\(.*\):.*\1$' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:505:505::/home/bash:/bin/bash
nologin:x:508:508::/home/nologin:/sbin/nologin


  5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

     

[Task@magedu ~]$  grep -E '^(root|centos|user1)' /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
centos:509:/bin/bash
user1:510:/bin/bash


  6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

wKiom1XkCVGhXXFTAAJKY1LKOLA034.jpg

  7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名   

[Task@magedu ~]$ echo /usr/share/man/man8/iptables-1.4.7.8.gz | egrep -o '[^/]+/?$'
iptables-1.4.7.8.gz
[Task@magedu ~]$ echo /usr/share/man/man8/iptables-1.4.7.8.gz | egrep -o '^/.*/'
/usr/share/man/man8/


 8、找出ifconfig命令执行结果中1-255之间的数字

   ifconfig | grep --color=auto  '[^[:alpha:]|0|[:punct:]|[:space:]]'

wKioL1XkNyrSrf6eAAKk_6a5id8952.jpg


你可能感兴趣的:(正则表达式grep)