欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

linux基础三剑客之grep

程序员文章站 2022-11-25 16:30:38
linux基础三剑客之grep 1、grep命令 基本介绍 grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrep个fgrep。 grep英文名:Global search Regular expression and Print out the line grep命 ......

    

linux基础三剑客之grep

1、grep命令

基本介绍

  grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrepfgrep

  grep英文名:global  search  regular  expression  and  print  out  the  line

  grep命令的作用:文本所搜工具。根据用户指定的模式对目标文件逐行进行匹配检查,并且打印匹配的行

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

  正则表达式:英文名regular  expression,解释:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或者通配的功能

  正则表达式分类

    基本正则表达式:basic  regular  expression,简写bre

    扩展正则表达式:extend regular  expression,简写ere

    注意:grep默认支持的是基本正则表达式,但是grep命令可以是用选项-e来使用扩展正则表达式。egrep命令默认支持扩展正则表达式

  正则表达式引擎:检查一个模式是否匹配一段文本信息的程序,不同的编程语言使用的正则表达式引擎可能不同。引擎不同,检查字符匹配的算法不同。

  grep命令内部自带了正则表达式引擎来实现文本的检查

  基本语法

     grep [options] pattern [file...]

     grep [options] [-e pattern | -f file] [file...]

      常用选项

        --color-auto:对匹配的文本内容进行着色

        -v:显示不能够被pattern匹配的行

        -i:忽略字符大小写

        -o:仅显示匹配到的字符串

        -q:对匹配或者不匹配的内容不输出任何信息,表示是静默模式

        -a  num:显示匹配到的行及在这之后多显示num

        -b  num:显示匹配到的行及在这之前多显示num

        -c  num:显示匹配到的行及在这之前和之后显示num

        -e:使用扩展正则表达式

        -f:使用固定字符正则表达式

        -g:表示使用基本正则表达式

        -p:表示使用perl正则表达式

  基本正则表达式的元字符

    字符匹配元字符

      .:匹配任意单个字符

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

      [^]:匹配范围之外的任意单个字符

      也支持字符集范围表示

      [:digit:][:alnum:][:alpha:][:lower:][:upper:][:punct:]

        使用案例

[root@oldboy ~]# grep "^[[:alpha:]].[[:alpha:]]$" a.txt

hal

kde

lvm

ntp

opt

pki

ppp

rpc

rpm

ssh

ssl

xdg

xml

yum

qwe

    匹配次数元字符

      基本介绍

        用在要指定次数的字符后边,用于指定前面的字符要出现的次数

    匹配次数元字符

      *:匹配前面的字符0次或者多次

      使用案例

[root@oldboy ~]# grep "x*y" grep.txt
xay
xbby 

      \?:匹配前面的字符0次或者1

.      *:匹配任意长度字符

      \+:匹配前面字符至少一次

      \{m\}:匹配前面的字符m次。

      \{m,n\}:匹配掐面字符至少m次,至多n

        \{m,\}:匹配前面字符至少m次,多则不限

        \{0,n\}:匹配前面的字符至多n

 

        使用注意

          为什么要使用\?-----因为?问号、加号+、大括号{}linuxbash解释器中有特殊意义,用反斜线在意就让他表示?问号原来的意义,即?问号在bash中表示任意字符,{}大括号在bash中表示内容展开,因此为了避免在bash中被解释,那么使用反斜线转义

    位置锚定元字符

      基本介绍

        要求指定的字符串模式必须出现在特定位置,那么得使用位置锚定元字符

      位置锚定元字符有

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

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

        ^pattern$:用于模式匹配整行

        ^$:匹配空行

          ^[[:space:]]*$:匹配整行为空格行或者空行

        \<或者\b:单词的词首锚定,用于单词模式的左侧

        \>或者\b:单词的词尾锚定,用于单词模式的右侧

        \<pattern\>:单词锚定,用于匹配整个单词

    分组

      \(\):用于将一个后者多个字符串捆绑在一起,当做一个整体进行处理,小括号在bash中也表示特殊符号

      后项引用:引用前面的分组括号中的模式所有匹配的字符(并不是引用匹配的模式,而是引用的匹配模式下的字符串)

      案例演示:

linux基础三剑客之grep
[root@oldboy ~]# grep "\(\<[[:alpha:]]\{1,3\}t\>\).*\1" /etc/passwd

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

halt:x:7:0:halt:/sbin:/sbin/halt
view code

      使用注意:

        分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1\2\3...

        \1:表示第一次被分组小括号所匹配的内容

        \2:表示第二次被分组小括号所匹配的内容

        .....

        举例:

          \(ab\+\(xy\{2,\}\))*

            \1匹配上面的:ab\+\(xy\)

            \2匹配上面的:xy\{2,\}

        使用注意

          grep命令默认使用的是贪婪模式匹配,即最大匹配。

      为什么要使用位置锚定符?

        grep正则匹配默认是每一行按照正则模式一个字符一个字符的匹配,那么有匹配的字符串可能出现在一行内容的任意位置,因此,如果我们有需求要匹配的字符串在指定的位置(比如:在行首、行尾、词首、词尾),那么就得使用位置锚定元字符

      单词:在linux正则表达式中表示由特殊符号分割的一个字符串,纯数字字符串也算一个单词(虽然在显示不算真正意义的单词)

    案例演示题库

      显示/proc/meminfo文件中以大小写ab开头的行

linux基础三剑客之grep
[root@oldboy ~]# grep -i "^a" /proc/meminfo

active:            38640 kb

active(anon):      19756 kb

active(file):      18884 kb

anonpages:         19592 kb

anonhugepages:         0 kb

[root@oldboy ~]# grep "^[aa].*" /proc/meminfo

active:            38612 kb

active(anon):      19720 kb

active(file):      18892 kb

anonpages:         19592 kb

anonhugepages:         0 kb

 
view code

      显示/etc/passwd文件中不以/bin/bash结尾的行

[root@oldboy ~]# grep -v  "/bin/bash$"  /etc/passwd 

      显示/etc/passwd文件中gid最大的用户名

linux基础三剑客之grep
[root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 1

www:x:515:518::/home/www2:/bin/bash

[root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 1|cut -d: -f1

www

 
view code

      显示/etc/passwdoldboy用户是否存在,如果存在显示他的默认shell

linux基础三剑客之grep
[root@oldboy ~]# grep "^\<oldboy\>" /etc/passwd

oldboy:x:500:515:lan:/home/oldboy:/bin/csh

[root@oldboy ~]# grep "^\<root\>" /etc/passwd && grep "^\<root\>" /etc/passwd|cut -d: -f7

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

/bin/bash 
view code

      显示/etc/passwd文件中uid是三位数的用户名

linux基础三剑客之grep
[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd

[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd|cut -d: -f1

 
view code

      显示netstat  -tan中出现statelisten的行

linux基础三剑客之grep
[root@oldboy ~]# netstat -tan|grep "listen[[:space:]]*"

tcp     0      0 0.0.0.0:22           0.0.0.0:*                   listen      

tcp        0      0 127.0.0.1:631     0.0.0.0:*                   listen      

tcp        0      0 127.0.0.1:25      0.0.0.0:*                   listen      

tcp        0      0 :::22           :::*                        listen      

tcp        0      0 ::1:631            :::*                      listen      
view code

      显示/etc/passwd文件中用户名与默认shell名相同的行

linux基础三剑客之grep
[root@oldboy ~]# grep "\(\<[[:alnum:]]\+\>\).*\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:516:519::/home/bash:/bin/bash
view code

2、egrep命令

基本介绍

  扩展正则表达式

    egrep = egrep  -e

基本语法

   grep [options] pattern [file...]

  grep [options] [-e pattern | -f file] [file...]

  扩展正则表达式的元字符

    字符匹配

      .:匹配任意一个字符

      []:匹配范围内的字符

      [^]:匹配范围外的字符

    次数匹配

      *:匹配0次或者多次

      ?:匹配0次或者1

      +:匹配1次或者多次

      {m}:匹配m

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

    锚定字符

      ^:锚定行首

      $:锚定行尾

      \<:锚定词首

      \>:锚定词尾

    分组

      ()

      后项引用变量\1\2\3....

    或者

      a|b:支持二选一(扩展正则表达式比基本正则表达式元字符多了二选一)

  练习问题

    显示当前系统能够rootcentos或者oldboy用户的默认shelluid

linux基础三剑客之grep
[root@oldboy ~]# grep -e "^(root|centos|oldboy)\>" /etc/passwd

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

oldboy:x:500:515:lan:/home/oldboy:/bin/csh
view code

    找出/etc/rc.d/init.d/functions文件中,某单词跟一个小括号的行

linux基础三剑客之grep
[root@oldboy~]#egrep "^\<[_[:alpha:]]+\>[[:space:]]*\(\)" /etc/rc.d/init.d/functions
view code

    使用echo命令输出一个命令,使用egrep取出路径的基名(基名:整个路径的最后一个文件或者目录)

linux基础三剑客之grep
[root@oldboy ~]# echo "/etc/fstab" |grep -e -o "[^/]+\/?\>$"

fstab
view code

    找出ifconfig命令结果中的ip地址

linux基础三剑客之grep
[root@oldboy ~]# ifconfig|grep -e -o "(\<[[:digit:]]+\>\.?){3}\.?[[:digit:]]+"

192.168.173.140

192.168.173.255

255.255.255.0

127.0.0.1

255.0.0.
view code

找出ifconfig命令结果中的1-255的数值

linux基础三剑客之grep
[root@oldboy ~]# ifconfig | grep -e -o "\<[0-5]+\>"|sort -u -n

00

1

2

3

50

140

255

1000

1500
view code

   使用注意

     如果是扩展正则表达式,那么它的匹配模式的扩展正则元字符有一些不用转义,比如:小括号,大括号,加号等,但是锚定词首和词尾都需要加转义字符

3、fgrep命令

基本介绍

  fgrep命令不支持正则表达式搜索,你搜索字符是什么,就按照你搜索的去匹配

基本语法

  grep  [options]  [-f pattern]  [file...]

基本使用

linux基础三剑客之grep
[root@oldboy ~]# grep -f "a..t" fgrep.txt

a..t

[root@oldboy ~]# grep -f "^h" fgrep.txt

^h
view code