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)
ailisa5520ailisa5520
上一篇 2016-08-07 22:07
下一篇 2016-08-07 22:07

相关推荐

  • 2016/10/19作业:软链接与硬链接的区别

    软链接和硬链接的区别 linux中链接分为两种,一种是硬链接(Hard Link),一种是符号链接(Symbolic Link),其中,符号链接又称为软链接。 硬链接: 在Linux文件系统中 ,磁盘中的所有文件都有一个编号,这个编号称为索引节点(Inode)。在Linux中,多个同一索引节点可以有多个文件名,这就是硬链接。硬链…

    Linux干货 2016-10-20
  • 22期第七周课堂练习

    1、创建一个10G分区,并格式为ext4文件系统;        (1) 要求其block大小为2048, 预留空间百分比为2,   卷标为MYDATA, 默认挂载属性包含acl;        (2)   挂载至/data/mydata目录,要求挂载时禁止程…

    Linux干货 2016-10-09
  • nginx

    1.Nginx的程序架构:        master/worker            一个master进程:     &nb…

    2017-06-19
  • N21_第7周_磁盘及文件系统管理

    N21_第7周_磁盘及文件系统管理 作业题目: 1、创建一个10G分区,并格式为ext4文件系统;    (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳…

    Linux干货 2016-09-26
  • 硬链接和软链接的区别

                        硬链接和软链接的区别     硬链接: 1.创建命令:ln或link 2.同一文…

    Linux干货 2016-12-05
  • 显示列表和复制文件的各种实例

    显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。 [root@localhost tmp]# ls -d /var/l*[[:lower:]] 显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。 [root@localhost tmp]# ls -d /etc/[0-9]*[^0-9…

    Linux干货 2018-03-01