文本处理中比较强悍的三个工具是:grep、sed、awk。
其中grep主要作用是对于用户给出“模式”对文本逐行进行匹配检查,然后进行打印。
模式:由正则表达式字符及文本字符编写的过滤条件
格式:grep [选项] [正则表达式字符] 文件
常用的选项:
-v:反向查找,显示没有被匹配的的行
-i:不区分大小写
-o:只显示查找的内容
-n:显示匹配的行号
-c:统计匹配的行数
-q:不输出任何内容
-A #:显示出查找到的内容的后#行
-B #:显示出查找到的内容的前#行
-C #:显示出查找到的内容的前后各#行
-e:实现多个选项之间或的关系 例如:grep -e 'root' -e 'bash' file
-w:整行匹配整个单词
-E:使用此选项开启egrep
各个选项示例:
-v选项:
示例:不显示f1文件中带有数字的行
[root@myhost testdir]# cat f1
ni hao
aaaaaa123
345 bbbbb
[root@myhost testdir]# grep -v [[:digit:]] f1
ni hao
-i选项:
示例:查找出文件中含有大小写a的行
[root@myhost testdir]# cat f1
ni hao
AAA123
345 bbbbb
[root@myhost testdir]# grep -i a f1
ni hao
AAA123
-n选项:
示例:查找出含有root的字符串并显示行号
[root@myhost testdir]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
-o选项:
示例:在/etc/passwd文件中查找出root字符串
[root@myhost testdir]# grep -o root /etc/passwd
root
root
root
root
-c选项:
示例:统计出/etc/passwd文件中以/bash/nologin结尾的一共有多少行
[root@myhost testdir]# grep -c "/sbin/nologin" /etc/passwd
29
-A选项:
示例:过滤出lisi用户所在行及后一行
[root@myhost testdir]# grep lisi -A 1 /etc/passwd
lisi:x:502:502::/home/lisi:/bin/bash
wangwu:x:503:503::/home/wangwu:/bin/bash
-B选项:
示例:过滤出mysql系统用户行及前两行
[root@myhost testdir]# grep mysql -B 2 /etc/passwd
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
-C选项:
示例:过滤出mail系统用户所在行及前后各一行
[root@myhost testdir]# grep mail -C 1 /etc/passwd
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
-e选项:
示例:过滤出f1文件中包含数字或小写字母的行
[root@myhost testdir]# cat f1
ni hao
AAA123
345 bbbbb
[root@myhost testdir]# grep -e"[0-9]" -e "[a-z]" f1
ni hao
345 bbbbb
-w选项:
示例:查找出f1文件中的含有which单词的行
[root@myhost testdir]# cat f1
which
whichabc
abcwhich
[root@myhost testdir]# grep -w which f1
which
[root@myhost testdir]# grep which f1
which
whichabc
abcwhich
-E选项
正则表达式篇:
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串其中有 些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
正则表达式分为两类:
基本正则表达式:BRE
扩展正则表达式:ERE
元字符分类::字符匹配、匹配次数、位置锚定、分组
字符匹配:
. : 匹配任意一个字符
[] :匹配指定范围内的任意一个字符
[^] :匹配除指定范围外的任意一个字符
字符集:
[:digit:] : 代表所有数字
[:lower:] : 代表所有小写字母
[:upper:] : 代表所有大写字母
[:alpha:] : 代表所有大小写字母
[:alunm:] : 代表所有字母和数字
[:space:] : 代表空格和Tab
[:punct:] : 代表所有标点符号
匹配次数:用在要指定的字符后,用于指定前面字符要出现的次数
*:匹配前面字符任意次包括0次
.*:匹配任意长度的任意字符
\?:匹配前面的字符0次或一次
\+:匹配前面的字符至少一次
\{m\}:匹配前面字符m次
\{m,n\}:匹配前面字符至少m次至多n次
\{,n\}:匹配前面字符至多n次
\{m,\}:匹配前面字符至少m次
位置锚定:定位字符出现的位置
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^模式$ :用于模式匹配整行
^$:表示空行
\< 或 \b 词首锚定,用于锚定词的左侧
\> 或 \b 词尾锚定,用于锚定词的右侧
\<模式\> 用于锚定整个单词
分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,…
\1: 从左侧起,第一个左括号以及与之匹配右括号之间 的模式所匹配到的字符;
实例: \(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
后向引用:引用前面的分组括号中的模式所匹配字符(而 非模式本身)
原创文章,作者:ZJM,如若转载,请注明出处:http://www.178linux.com/30189