Linux三剑客之grep

grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来)是一个强大的文本搜索工具,使用正则表达式搜索文本的文本,并把结果打印出来。Unix家族包括grep、egrep和fgrep。egrep是扩张的正则表达式它支持更多的字符,fgrep是fast grep它不支持元字符搜索,但搜索速度更快。grep搜索结果不影响原文件。


grep命令

全面搜索正则表达式并把行打印出来

常用语法grep [OPTIONS] PATTERN [FILE…]

命令  选项    模式   文件

PATTERN 模式 是由正则表达式的元字符和普通字符所指定的过滤条件。

常用选项

-A NUM, –after-context=NUM#显示匹配行的后NUM行

-B NUM, –before-context=NUM#显示匹配行的前NUM行

-C NUM, -NUM, –context=NUM#显示匹配行的前后NUM行

-E, –extended-regexp#扩张的正则表达式-n, 

–line-number#显示匹配的行号

-q, –quiet, –silent#静默模式,不做任何输出

-o, –only-matching #只显示匹配到的行

–color[=WHEN], –colour[=WHEN]#匹配高亮显示,cent6.#默认没启用

-c, –count #统计匹配的行数-i, 

–ignore-case #忽略大小写

-v, –invert-match#显示不能够被pattern到的行 (取反)

-w, –word-regexp#单词匹配而不是字符


在使用grep前先了解了解正则表达式。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则表达式的元字符可以做

字符匹配   匹配次数 位置锚定 分组

正则表达式使用的是贪婪模式,能匹配多长就尽量匹配多长

grep不加引号直接过滤字符串;grep在进行模式匹配的时候必须加引号,单引和双引号都可以;grep在引用变量的时候必须加双引号

如果要匹配特殊字符的话要使用\转义来匹配特殊字符  如\$ \@等

字符匹配

. 匹配任意单个字符

[]匹配括号能指定的字符

[^]匹配括号外的指定字符

[alpha]:匹配所有字符

[:alnum:] 除了换行符外的所有字符

[:punct:] 所有标点符号

[:space:] 空格和tab

[:digit:] [0-9] 匹配所有数字

[:lowwer:][a-z] 匹配所有小写字符

[:upper:] [A-Z] 匹配所有的大写字符

匹配次数

* 匹配前面字符0次、1次或多次

.* 匹配任意长度任意字符

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

\+ 匹配前面字符至少一次或以上多次

\{m\} 匹配前面字符m次

\m,n\} 匹配前面字符最少m次,最多n次

\{,n\} 匹配前面字符做多n次\

{m,\} 匹配前面字符最少m次

位置锚定

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

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

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

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

\> 或\b:词尾锚定;用于单词模式的右侧\<PATTERN\>:匹配整个单词

分组\(PATTERN\) 将一个或多个字符捆绑在一起,当作一个整体进行处理。引用第一个小括号的分组\1,第二个是\2,以此类推。

示例

test1.png

test 2.png

1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)

 grep -i '^s' /proc/meminfo grep  '^[sS] /proc/meminfo

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

 grep -v '/bin/bash$' /etc/passwd

3、显示用户rpc默认的shell程序

 grep '\<rpc\>' /etc/passwd|cut -d: -f7

4、找出/etc/passwd中的两位或三位数

   grep '\<[1-9][0-9]\{1,2\}\>' /etc/passwd

5、显示/etc/grub.conf文件中,至少以一个空白字符开头的且后面存非空白字符的行

 grep '^[[:space:]]\+[^[:space:]]' /etc/grub.conf

6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行

 netstat -tan|grep '\<LISTEN[[:space:]]*'

7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行

 grep '^\(.*\)\>.*\1$' /etc/passwd


egrep是扩展的正则表达式

即grep -E

常用语法grep [OPTIONS] PATTERN [FILE…]

命令  选项    模式   文件

egrep常用选项和字符匹配基本和grep就不多做解释了

次数匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

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

位置锚定:

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

$ :行尾锚定,用于行的左右侧

\<, \b :词首锚定。

\>, \b :词尾锚定

分组:

(pattern)  将一个或多个字符捆绑在一起,当作一个整体进行处理。引用第一个小括号的分组\1,第二个是\2,以此类推。

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

或者:

a|b :a或b

C|cat: C或cat

(C|c)at:Cat或cat


示例

 1、显示当前系统root、mage或wang用户的UID和默认shell

   egrep '^root\>|^mage\>|^wang\>' /etc/passwd|cut -d: -f3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

   egrep '[[:alnum:]_]\(\)' /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

   echo "/etc/rc.d/init.d/functions " |egrep -o '(.*/)+(.*)\1'

   

4、使用egrep取出上面路径的目录名

   echo "/etc/rc.d/inittab/functions" |grep '[^/]\+/\?$'

5、统计以root身份登录的每个远程主机IP地址的登录次数

   last |egrep –color=auto  '^root\>.*(.*\.){3}[0-9]{3}\> '

|tr -s ' '|cut -d' ' -f3|sort |uniq -c

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

     

egrep '\<[0-9]\>' :0-9

egrep '\<[1-9][0-9]\>' :10-99

egrep \<1[0-9]{2}\>:100-199

egrep \<2[0-4][0-9]\> :200-249

egrep \<25[0-5]\>:250-255

7、显示ifconfig命令结果中所有IPv4地址

egrep '((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-4]|[01]?[0-9][0-9]?)'

原创文章,作者:ladsdm,如若转载,请注明出处:http://www.178linux.com/33743

(0)
ladsdmladsdm
上一篇 2016-08-12 14:45
下一篇 2016-08-12 14:45

相关推荐

  • 22期第九周课堂作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash declare -i a=0 declare -i b=0 n=`cat /etc/passwd |cu…

    Linux干货 2016-10-17
  • N25-第一周作业

    一,描述计算机的组成及其功能。        计算机(Computer)是一种能够按照事先存储的程序,自动、高速地进行大量数值计算和各种信息处理的现代化智能电子设备。由硬件和软件所组成,两者是不可分割的。        计算机的组成分为控制…

    Linux干货 2016-12-03
  • 马哥教育网络19期+第五周练习博客

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;   grep "^[[:space:]]\+.*" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; &n…

    Linux干货 2016-06-19
  • Linux发展史

    一、从 Unix 到 Linux 这一段历史         早在 Linux 出现之前的二十年 ( 大约在 1970 年代 , 就有一个相当稳定而成熟的操作系统存在了!那就是 Linux 的老大哥『 Unix 』是也!怎么这么说呢?!他们这两个家伙有什么关系呀?这里就给他说一说啰!众所皆知的,Linux 的核心是由 …

    Linux干货 2016-10-14
  • vim功能及使用

    vim 简介:   vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。 文本编辑种类: 行编辑器: sed全屏编辑器:nano, vivim – Vi Improved 一、基本操作语法 vim [OPTION…

    Linux干货 2016-08-11
  • Linux命令中特殊符号的用法

    Linux命令中特殊符号的用法 在马哥教育学习了将近一周的Linux运维,由最初对Linux系统的一无所知,到了解了Linux的发展历程,学习了一些基本命令,惊叹于Linux的强大功能。下面根据我学到的,介绍一下关于Linux命令中特殊符号的用法。 $的用法 1.$()或’’引用命令执行的结果 例如:如果我们想要创建一个以当前日期命名的目录,可以执行 #mk…

    2017-07-15