grep+正则表达式

grep简介:

  grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

命令格式:

  grep    [OPTIONS]   'word'   filename 

常用选项 :

-A:<显示列数> 除了显示符合范本样式的那一行外,并显示该行之后的内容。例如:-A2指输出符合要求的行和之后的两行
-B:<显示列数> 除了显示符合范本样式的那一行外,并显示该行之前的内容。例如:-A2指输出符合要求的行和之前的两行
-c:表示打印符合要求的行数
--color: 指定颜色.--color=auto 自动高亮显示匹配到的字符
-C:<显示列数n>除了显示符合范文样式的那一行外,并显示该行前后n行内容。例如:-C2指输出符合要求的行和上下各两行
-d:<进行动作>当指定的查找的为目录而非文件时用此选项
-e:<范文样式>指定字符串作为查找文件内容的范本样式
-E:支持扩展
-i:表示忽略大小写
-n:表示查找到关键字的行并打印行号
-o:只查找文件中匹配到的部分
-v:反转查找

 

实例学习:

1、过滤出/etc/passwd文件中abm用户上下两行

# grep -C2 --color=auto abm /etc/passwd //注意,这里我abm下面两行只打印了一行是因为之下只剩一行

gdm:x:42:42::/var/lib/gdm:/sbin/nologin

gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin

abm:x:1000:1000:abm:/home/abm:/bin/bash

virftp:x:1001:1001::/home/virftp:/sbin/nologin

2.较复杂的选项-d实例,假设要在‘/usr/src/linux/Doc’目录下搜索带字符串‘magic’的文件

$ grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
grep -r
grep -d skip 都可忽略子目录: 如果有很多 输出时,您可以通过管道将其转到’less’上阅读: $ grep magic /usr/src/Linux/Documentation/* | less 这样,您就可以更方便地阅读。

3.选项-e制动多个匹配样式:

#echo this is a text line | grep -e "is" -e "line" -o     //-e 指定了多个,-o只输出匹配的字符
is
line

写一个patfile
cat patfile aaa bbb #echo aaa bbb ccc ddd eee | grep -f patfile -o //-f 指定用文件内容来匹配
aaa
bbb

4.-E扩展的grep表达式

[root@localhost ~]# grep 'abm|root' passwd           //无输出,
[root@localhost ~]# grep -E 'abm|root' passwd     //可以输出,
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
abm:x:1000:1000:abm:/home/abm:/bin/bash

5.用-i忽略大小写,找出文件中关键字所在行,并打印

[root@localhost ~]# grep -i -n abc test.txt 
1:Abcdefg

6.-o查找文件中的ip地址并打印出来

[root@localhost ~]# ifconfig | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]' 
192.168.1.7
255.255.255.0
192.168.1.2
127.0.0.1
255.0.0.0

7.-v反向,查找系统挂载设置

[root@localhost ~]# grep -v -E "^#|^$" /etc/fstab             //这里排除了注释信息
UUID=4924e7a8-3a04-4efe-a0c1-2cfaee781f16 /                       xfs     defaults        1 1
UUID=fecbd2dc-60b6-4aad-b5c8-da5e56edfa86 /boot                   xfs     defaults        1 2
UUID=66d0952d-4f7d-4504-8574-912be3586d49 swap                    swap    defaults        0

取出默认shell为非bash的用户

grep -v "bash$" /etc/passwd |cut -d: -f1

 

egrep

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

  在表示正则表达式时可以省略转义符号

配合正则进行匹配

  正则表达式:是一类字符所书写出的模式(pattern)
    元字符:类似通配符,不表示字符本身的意义,用于额外功能性的描述

  基本正则表达式和扩展正则表达式
  基本正则表达式的元字符:
      .        任意单个字符
      []        指定范围内的任意单个字符
      [0-9],[[:digit:]]              表示0-9任意数字
      [a-z],[[:lower:]]       表示小写子母
      [A-Z],[[:upper:]]      表示大写字母
           [[:alpha:]]        表示所有的字母
      [[:alnum:]]         表示字母+数字:
      [[:space:]]         表示空格
      [[:putct:]]        表示标点符号
      [^]                指定范围外的任意单个字符


    次数匹配:用来指定匹配其前面的字符的次数
      *:任意次
      例子:x*y        xxy xy y 都能匹配
      .*        匹配任意长度的任意字符
      \?        前面字符出现0次或者1次的
      \{m\}       匹配m次
      \{m,n\}      至少m次,至多n次
      \{m,\}        至少m次
      \{0,n}        至多n次


    做变量换算需要使用""
      贪婪模式:尽可能的长的去匹配字符:

    位置锚定:用于指定字符出现的位置
      ^:锚定行首
        ^Char
      $:锚定行尾
        grepchar$
      ^$:空白行


    单词的位置锚定
      \<char :锚定词首,\b
      char\> : 锚定词尾,char\b

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


    引用:
      \1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式匹配到的内容,意思是说前面出现一次,在\1这也要出现一次

实例:

1、取出默认shell为bash的且其ID号最大的用户

grep  "bash$" /etc/passwd | sort -n -t: -k3 | cut -d: -f1 |tail -1

#grep bash$ --- 查找以bash结尾
#sort --- 排序:“-n”数值排序,-t指定分隔符为“:”,-k定位分隔后的第三个字符,将id最大的一行放到了最顶底
#cut --- 截取:"-d"指定分隔符为“:”,-f显示指定字段的内容

2、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行

grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit 

#\{1,\}         --- 表示至少一个

3、显示/boot/grub/grub.conf中至少一个空白字符的行

grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf 

4、查出/etc/passwd中一位数或两位数

grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd

# \<          --- 锚定词首
# \>          --- 锚定词尾
# \{1,2\}       --- 匹配1到2次,代表一位数或两位数

5、找出ifconfig命令结果中的1到255之间的整数

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

# -E         --- 扩展,就可以省去特殊符号的转义符

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

grep "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd

# [:alnum:]      --- 表示字母加数字
# .*          --- 代表任意
# \1          --- 代表再次匹配前面()中的内容

7、找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHEN”结尾的行

metstat -tan |grep -E “(LISETN|ESTABLISHED)[[:space:]]*"

8、取出当前系统上所有用户的shell,要求:每种shell中显示一次,且升序排序显示

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

# sort -u       --- “-u”表示去重 

 

转载于:https://www.cnblogs.com/-abm/p/8013034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值