一、grep命令及正则表达式的用途

  #cat 默认对整篇文本做处理,#head,#tail允许我们对文本切头去尾,过滤一些不需要的信息,还可以搭配#sort精确显示我们所需要的行,但是这建立在我们对文本内容了解的基础之上,假如我们不了解这篇文本而又要寻找查看文本中是否有需要的关键字该怎么办?#less然后/keyword或者?keyword。那假如关键字不止一个,且需要符合一定的格式并且能够只显示有关键字的行该怎么办呢?这时我们就需要用到#grep以及正则表达式了。

二、grep命令的用法

  #grep:global search regular expression=\'#\'" ) and print out the line

  Linux中的一种文本搜索工具,能够根据指定的文本模式对目标文件进行逐行搜索,并显示能够被模式匹配到的行。

linux正则表达式基础语法符号

. - 匹配任意一个字符。

[] - 字符集匹配,匹配方括号中定义的字符集之一。

[^] - 字符集否定匹配,匹配没有在方括号中定义的字符。

^ - 匹配开始位置。

$ - 匹配结束位置。

\(\) - 定义子表达式。

\n - 子表达式向前引用,n 为 1-9 之间的数字。 由于此功能已超出正则语义,需

要在字符串中回溯,因此需要使用 NFA 算法进行匹配。

* - 任意次匹配(零次或多次匹配) 例子:x*y(xxy,xy,y)都能够匹配

\{m,n\} - 至少 m 次,至多 n 次匹配;\{m\} 表示 m 次精确匹配;\{m,\} 表示至少 m次匹配,\{0,n\}:至多n次.

? - 最多一次匹配(零次或一次匹配)。例子:x\?y(xy,y,xxy)

位置锚定:用于指定字符出现的位置

^:锚定行首     例子 [root@station21 ~]# grep --color "^l" ceshi   liker He love his

$: 锚定行尾     例子 [root@station21 ~]# grep --color "s$" ceshi     liker He love his

^$: 锚定空白行

\<char:锚定词首或者使用,\bchar 例子

wKioL1MIAdbjvi_YAABpNo02QPE786.jpg

char\>:锚定词尾或者使用,char\b

例子

wKiom1MIAoaCtu6dAABpNo02QPE143.jpg

分组:\(\)            \(ab\)*xy

引用:

\1: 后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容

\2   .....     如果我们要找到love,like,后面加r结尾,这就要用到分组引用了。            

\(a.b\)xy\1: a6bxya6b,

wKioL1MICgrSeN9SAAA6V3XEhII586.jpg

He like his lover.

She love her liker.

He love his lover.

She like her liker.

wKiom1MICU3hloUaAABU67oTn4k711.jpg



字符匹配:

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

[:alnum:] 字母和数字

[:alpha:] \a 字母

[:lower:] \l 小写字母

[:upper:] \u 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:] \s 所有空格符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

[:digit:] \d 十进制数字

[:xdigit:] \x 十六进制数字

[:graph:] 可打印的非空白字符

[:print:] \p 可打印字符

[:punct:] 标点符号



grep命令的常用选项

1.作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

2.格式
grep [options]

3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。

-h:查询多文件时不显示文件名。

-i: 不区分字符大小写, ignore-case

-l:查询多文件时只输出包含匹配字符的文件名。

-n:显示匹配行及 行号。

-s:不显示不存在或无匹配文本的错误信息。

-v:显示不包含匹配文本的所有行

-o: 仅显示被模式匹配到的字串,而非整行;

-E: 支持扩展的正则表达式



egrep: 使用扩展正则表达来构建模式,相当于grep -E

元字符:

字符匹配:

.: 任意单个字符

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

[^]: 指定范围外的任意单个字符

次数匹配:

*:匹配其前面的字符任意次;

?: 匹配其前面的字符0或1次;

+: 匹配其前面的字符至少1次   例子[root@station21 ~]# grep -E   "a+b" ceshi1       aaab      aab

{m}: 匹配其前面的字符m次;  列子:[root@station21 ~]# grep -E "a{2}" ceshi1   aaab     aab

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

wKioL1MIJPewfpIFAABQF8KL7KE807.jpg

  • {m,}: 至少m次;

wKiom1MIJWuyiV8rAAA8uyrwgSU899.jpg

{0,n}:至多n次;

wKiom1MIJc3BmYGoAAA5bHNo-xE120.jpg

锚定:

^: 行首

$: 行尾

\<, \b: 词首

\>, \b:词尾

分组:

(): 分组里头可以加或者符号:

|: 或者, ac|bc

wKioL1MIJ2Py9Z0iAAA3ZvjNP-4608.jpg

grep -E "con(C|c)at"

conC或cat

wKiom1MIJ6Kjuny1AAA7H8ARMjQ905.jpg

conCat或concat



grep命令使用简单实例

1、显示/proc/meminfo文件中以大小写s开头的行;

当然啦也可以  grep -i  “^s” /proc、meminfo,选择很多总有一款适合你的

wKioL1MIDpKxjYbjAACrzCip5uI169.jpg

2.如果我们要找到linux中所有非bash的用户怎么找呢

cut命令解释:-d指定分割的符号,-f取第几段

[root@station21 ~]# grep --color -v "bash$"  /etc/passwd | cut -d: -f1

3、如果我们要取出默认shell为bash的且其ID号最大的用户;

sort: 按字符进行比较

sort [option] file...

-f: 忽略字符大小写;

-n: 比较数值大小;

-t: 指定分隔符

-k: 指定分隔后进行比较字段

-u: 重复的行,只显示一次;

[root@station21 ~]# grep -v "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1

nfsnobody

4.如果我们要显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

wKioL1MIEpLAE-s1AADUOHxE-FM208.jpg

注释:这里我们只显示部分结果,亲

5、如果我们要显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

[root@station21 ~]# grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf

注释:这题我们就不显示结果啦

6、如果我们找出/etc/passwd文件中一位数或两位数;

注释:这里头的意思是:个位数任意,后面跟着次数匹配前面数字的次数至少1次至多2次.

wKiom1MIFWfwxRvOAAFh2J3COdk130.jpg

7、如何找出ifconfig命令结果中的1到255之间的整数;

注释:这里我们用到了扩展正则,现用词首词尾锚定数字,然后分组,用或者符号讲数字串联起来。

wKiom1MIGBSB2wMMAAGmv8ikMhI450.jpg

8、如何查看当前系统上root用户的所有信息;

[root@station21 ~]# grep "^root\>" /etc/passwd

root:x:0:0:root:/root:/bin/bash

9、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;

wKiom1MIHArTjQWeAAC_FwFRfIU429.jpg

10、怎么找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHED”结尾的行;

wKioL1MIH2fyYOpOAAG9yZbHB5c628.jpg

11、取出当前系统上所有用户的shell,要求:每种shell只显示一次,且按升序显示;

cut -d: -f7 /etc/passwd | sort -u

12、挑战题:写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254)

grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"