Linux入门之文本处理三剑客之grep

Linux入门之文本处理三剑客之grep

 文本处理工具:

 grep,sed(流编辑器),awk

 

 grep简述及特点

简介:全局搜索正则表达式出来的行并打印 (Global search REgular expression and Print out  the line),一种按照特定模式(pattern)的文本过滤工具

模式:pattern,通过有正则表达式(refexp)特殊字符以及文本字符组成的条件来过滤

正则表达式:refexp,有一些bash支持的特殊文本字符来表示特殊含义,如果特殊字符当原本字符匹配需要转义

 

 正则表达式一般分两类

 基本正则表达式: BRE

 扩展正则表达式: ERE

 

 grep 命令基本语法

 

 grep [option] [refexp]  file

    –color 用特定的颜色高亮显示模式中匹配的字符串,一般为红色

    -v  显示不被模式PATTERN匹配的行

    -o  表示只显示被模式匹配的字符,而不是整个行

    -q  静默模式不输出信息

    -A # after 显示到匹配到的后 #

    -B # before 显示到匹配的前 #

    -C # context 显示匹配的前后各几行

    -E  使用扩展正则表达式

        (基本和扩展的功能类似,只是转义方式不同)

 

 基本正则表达式:

 字符匹配

 . :  任意单个字符

 ? :  匹配其前单个字符01

 * :  匹配其前单个字符任意次

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

 [] : 表示匹配[]里的字符集,[ab]及包含ab的字符

 [^]: 表示匹配除了[]里的其它任意字符,[^ab]及不包含ab的字符

 

 []里同样支持特殊通配符:

 [0-9] 表示单个09的数字

 [:digit:] 表示所有数值,同上

 [a-z] [:lower:] 表示单个小写字母

 [A-Z] [:upper:] 表示单个大写字母

 [:alpha:] [a-zA-Z] 表示单个字母

 [:alnum:] 表示字母或数字

 [:space:] 匹配空格

 [:punct:] 表示所有标点符合

 注意:在使用中,[::]这种格式[::]里带特殊单词的需要再加[]来表示,比如匹配空格则为'[[:space:]]'

 

 次数匹配

 \?  : 0次或1

 \+  : 匹配其前字符一次以上

 \{m\}     :匹配其前字符m

 \{m,\}    : 匹配其前字符至少m

 \{m,n\}   :匹配其前字符至少m次,至多n

 

字符锚定

 ^ : 行首锚定

 $ : 行尾锚定

 ^$ : 表示空行匹配

 \< \b: 行首锚定

 \> \b: 行尾锚定

 \<PATTERN\> 锚定匹配PATTERN的作为单词 \<root\>  \broot\b

 \(\) : 对()里匹配PATTERN的做分组

     \1为后项引用前面第一个分组

 

 

扩展正则表达式:

 

用法

grep -E 'PATTERN' [file]

egrep  'PATTERN'  [file]

 

字符匹配和基本相同

[] [^] [[::]] 用法一样

 

次数匹配

* 匹配前面字符任意次

? 01

+ 1次以上

{m} 匹配多少次

{m,} 至少m

{m,n} 只是m次,至多n

{0,n} 至多n

 

锚定和基本用法一样

 

分组直接使用(),不要用\转义

后项引用 \1 \2 \3

 

扩展的功能:

或者

(c|C)at : cat后者Cat

(root|tom|user1)

 

 

 

练习1

1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
grep -i '^s' /proc/meminfo
grep  '^[Ss]' /proc/meminfo
grep  -E  '^(s|S)' /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  '\<[0-9][0-9]\?\>'  /etc/passwd
grep  '\<[0-9]\{2,3\}\>'  /etc/passwd
5、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
grep  '^[[:space:]]\+.*[^[:space:]]'  /etc/grub2.cfg
6、找出"netstat -tan"命令的结果中以'LISTEN'后跟任意个空白字符结尾的行
netstat  -tan  '.*LISTEN[[:space:]]*$'
7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
grep  '^\<\(.*\)\>.*/\1$'  /etc/passwd
grep  '^\<\(.*\)\>.*\<\1\>$' /etc/passwd

 

练习2

1、显示当前系统root、mage或wang用户的UID和默认shell
grep -E '^(root|mage|wang)\>' /etc/passwd |cut -d: -f7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
grep -E -o '^\<[[:alnum:]_]+\>\(\)' /etc/rc.d/init.d/functins
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions" grep -E -o '[^/]+/?$'
4、使用egrep取出上面路径的目录名
echo "/etc/rc.d/init.d/functions" | grep -E '/.*/'  
5、统计以root身份登录的每个远程主机IP地址的登录次数
last | grep -o 'root\>.*\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]' | tr -s ' '| cut -d' ' -f3 | uniq -c
v6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
grep  -E  '\<([0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>'
v7、显示ifconfig命令结果中所有IPv4地址
ifconfig | grep -o '\(\([0-9]\|1[0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([0-9]\|1[0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]\)'

 

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

(0)
上一篇 2016-08-07 22:07
下一篇 2016-08-07 22:07

相关推荐

  • 【N25第一周作业】Linux基础

    题目:   1、描述计算机的组成及其功能。   2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。   3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。   4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、his…

    Linux干货 2016-12-03
  • 磁盘分区管理与文件系统的创建

    磁盘分区管理与文件系统的创建   不光是linux文件系统,所有的大结构,多数据凑到一块的时候,单一的管理是没有能力处理这样庞大规模的存在的。所谓“君王不下县”也就是这个道理。要系统的,规范的管理一个国家,存在着省、市这样的层级结构。linux系统也是这样,将整个系统划分为若干个分区,实现不同功能,不同层级的规范管理,这就是创建磁盘分区的意义。既然…

    Linux干货 2016-09-01
  • 系统基础之vim工具详解

    vim工具详解 作为运维人员,每天要面对大量的文件操作,如何使用一个功能强大,操作快捷的文本编辑器,就至关重要.那天,今天给大家详细的介绍下vim这款编辑器,完全符合我们的要求,下面让我们一起来看看吧! 概论:  文本编辑器:  文本:纯文本信息,   ASCII text:  纯粹的,不加修饰的文字  文本…

    Linux干货 2016-08-10
  • 马哥教育网络班21期第4周课程练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 # cp -r /etc/skel/ /home/tuser1 # chmod -R go= /home/tuser1/ 2、编辑/etc/gr…

    Linux干货 2016-07-27
  • 进程管理

    linux维护工作中,常常需要对系统上运行的程序进行管理,那么进程管理就显得相当重要。 进程初识 什么是进程?   进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念。它代表CPU所能处理的单个任务。 什么是线程?   线程是程序流执行的最小单元,可以理解为进程中执行的一段程序片段。 进程与线程联…

    Linux干货 2016-09-07
  • 内部命令与外部命令

    内部命令与外部命令 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。 外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。 1.type type COMMAND 判断一个命令的类型即判断一个命令是否为内置命令。   2.enable(内部命令) enable既可以查看内部命令,同时也可以判断是否为内部命令 enable 显示所有…

    2017-07-15