且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Linux文本处理“三剑客”之grep

更新时间:2022-09-16 21:17:37

    在linux中,因为一切皆文件,而大部分程序的配置文件是文本形式的。所以对文本的处理就显得相当的重要了。对文本的处理包括对文本内容的搜索,文本内容的处理。下面就介绍文本的搜索相关知识。


文本内容搜索

    文本搜索的含义是:根据用户指定的文本搜索模式(搜索条件)对目标文件进行逐行的扫扫描,将匹配到的行打印在屏幕上。文本搜索的主要作用是用于统计相关信息。


一、正则表达式 

1、正则表达式的概念

    是一类字符的书写模式,这些个字符不代表本字符的意义,而是具有特殊意义。一般是对控制或通配的功能。


2、正则表达式的识别

    靠正则表达式引擎来负责翻译或者解释其中元字符的含义,正则表达式引擎是一段程序。通常每种语言(包括shell)的正则表达式引擎都不一样,从而导致了每种语言的正则表达式的元字符所代表的意义都不尽相同。


3、正则表达式的元字符

    正则表达式元字符:就是代表特殊意义的特殊字符。

1)字符集种类及表示方法

种类 意义
0-9 或 [:digit:] 0-9数字
a-z 或 [:lower:] 小写字母
A-Z 或 [:upper:] 大写字母
[:space:] 空格或TAB空白字符
[:punct:] 特殊字符
[:alpha:] 大小写字母
[:alnum:] 字母和数字的组合

2)基本正则表达式的元字符:

元字符种类 具体含义 示例
字符匹配 . 表示匹配任意单个字符 l..k  匹配像:love,like
[] 匹配指定范围内任意单个字符

[0-9] 0-9任意一个数字

[[:upper:]] 匹配大写字母中的任意一个

[^] 匹配指定范围外的任意单个字符

[^a-z] 匹配除a-z以外的任意字符

[^[:alnum:]] 匹配除数字和字母以外的任意字符

次数匹配 * 匹配前面字符任意次,包括0次 ca*  匹配像:c,ca,caa,caaa等
\? 匹配前面字符至多一次,就是说前面的字符可有可无 ha\?  匹配的只有:he,h
\{m\} 精确匹配前面的字符m次 hm\{2}\  匹配的只有:hmm
\{m,\} 匹配前面的字符至少m次 hm\{2,}\  匹配像:hmm,hmmm等
\{m,n\} 匹配前面字符至少m次,至多n次 hm\{2,4\} 匹配:hmm,hmmm,hmmmm
\{0,m\} 匹配前面的字符至多n次 hm\{0,3\} 匹配:hm,hmm,hmmm
位置锚定 ^ 锚定行首,写在最左侧 ^abc  
$ 锚定行尾,写在最右侧 abc$
\<  \b 锚定单词词首,出现与单词最左侧  \<abc \babc
\>   \b 锚定单词词尾,出现单词的最右侧 abc\> abc\b
分组 \(\) 分组中的模式匹配到的内容,可由正则表达式引擎保存在内存中,之后可被引用 \(abc\)
\# 引用定#个括号所配到的内容,而非模式本身。#确定方法自左向右左括号的个数 \1,\2

    注意:在这里单词的意思是,不包含特殊字符的连续字符组成的字符串就叫做单词。

3)扩展正则表达式的元字符:


元字符种类 具体含义 示例
字符匹配 . [] [^] 同基本正则表达式完全一样
次数匹配

* ? {m}{m,}

{m,n} {0,m}

同基本正则表达式一样,但注意一点是:?和{}在使用的时候不用转义了
+ 匹配前面的字符至少1次 hm+ 匹配:hm,hmm,hmmm等
位置锚定 ^ $ \<  \b  \> 同基本正则表达式完全一样
分组
() 同基本正则表达式一样,但注意一点是()在使用的时候不用转义了
或者 |

表示选择关系

c|Cat 匹配的是:c 或者 Cat

|整个左边是一部分,|整个右边是一部分


二、文本内容搜索命令

    常用的文本搜索命令有grep,egrep,fgrep

1、grep:Golbal search REgular and Print out the line.

    文本搜索的含义是:根据用户指定的文本搜索模式(搜索条件)对目标文件进行逐行的扫扫描,将匹配到的行打印在屏幕上。

    Usage: grep [option]... 'PATTERN' FILE...

    对于PATTERN的条件的设定或者说书写,可以借助于正则表达式。

常用参数 参数意义 示例
-i
匹配时PATTERN中的条件,忽略器大小写 grep -i 'Root' /etc/passwd
-v
反向匹配,显示没有匹配到的行 grep -v 'linux' /etc/passwd
-o 只显示匹配到的内容 grep -o 'gentoo' /etc/passwd
--color=auto 支持扩展表达式 grep --color=auto 'root' /etc/passwd
-A 显示匹配行的后面指定数目行 grep -A 2 'linux' /etc/passwd
-B 显示匹配行的前面指定数目行 grep -B 3 'linux' /etc/passwd
-C 显示匹配行的前后指定相同数目行 grep -C 2 'linux' /etc/passwd
-n 显示输出行的行号 grep -nC 2 'linux' /etc/passwd
-E 支持扩展正则表达式 grep -E '[0-9]+' /etc/passwd
-c 只显示匹配到行的数目 grep -c '^root\>' /etc/passwd

2)egrep相等于grep -E。

3)fgrep:fast grep,这里不支持正则表达式,常用选项和grep一样。


三、综合练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#1、显示/proc/cpuinfo文件中以大写或小写C开头的行,并显示出对应的行号;
#实现命令:
#grep -n '^[Cc]' /proc/cpuinfo 
#grep -nE '^c|C' /proc/cpuinfo 
#grep -i '^c' /proc/cpuinfo
#演示结果 
[root@server ~]# grep -n '^[Cc]' /proc/cpuinfo | head -n 3
3:cpu family   : 6
7:cpu MHz      : 2394.620
8:cache size   : 3072 KB
 
#2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的,并且UID最小的用户
[root@server ~]# grep '/sbin/nologin$' /etc/passwd | sort -n -t: -k3 | head -n 1 | cut -d: -f1
bin
 
#3、找出/etc/passwd文件中的一位数或两位数或三位数;
[root@server ~]#grep "\<[0-9]\{1,3\}\>" /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
 
 
#4、-c:只显示匹配到行的数目
[root@server ~]# grep 'root' -n /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@server ~]# grep 'root' -c /etc/passwd
2


1
2
#5、找出ifconfig命令结果中的1-255之间的数字
# ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

Linux文本处理“三剑客”之grep











本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1435072,如需转载请自行联系原作者