grep与正则表达式
Posted www-k
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep与正则表达式相关的知识,希望对你有一定的参考价值。
一、grep程序
1、Linux下有文本处理三剑客:grep sed awk
grep:文本 行过滤工具
sed : 文本行编辑器(流编辑器),改文件一般用sed
awk:报告生成器(做文本输出格式化)
2、Grep
包含三个命令:它们是用来进行行匹配(pattern)匹配的
(1)grep的分类
grep
egrep = grep -E /使用扩展的正则表达式进行匹配
fgrep = fast grep //只使用文件通配符进行匹配
grep默认使用正则表达式进行文本匹配
(2)grep的用法
grep [option] … PATTERN [filename]
(3) grep的常见选项
-E 支持使用扩展的正则表达式(ERE)regexp
-P 使用perl语言的正则表达式引擎进行搜索(每种语言的正则表达式引擎搜索机制都不同,甚至sed grep awk使用的regexp引擎也不相同)
-i 忽略大小写
-v 进行反选
-o 仅仅输出匹配的内容(默认输出的是匹配到的行)
--color=auto 语法着色
-n 显示行号
二、PATTERN—正则表达式
作用:通过一些特殊字符,来表示一类字符内容,然后交给前面的命令来执行;如果使用他特殊字符本身含义,就需要\进行转义
1、 字符匹配
. 代表任意一个字符 ?
[ ] 代表范围内的任意一个字符
[^ ] 代表范围外的任意一个字符
[0-9] [:digit:] [:alnum:][:alpha:][:upper:][:space:][:punct:]
2、 次数匹配
* 匹配前面的字符0到无数次
? 匹配前面的字符0到1次
+ 匹配前面的字符1到n次
\m\ 匹配前面的字符m次
\m,n\ 匹配前面的字符m到n次
\m,\ 匹配至少m次
示例:[abc] + abbbbcccc
a\7\ 匹配a7次,即aaaaaaa
\0,n\ 匹配前面的字符0次到n次 【0次要不要】
3、 位置锚定
^ 锚定行首
$ 锚定行尾
\b 锚定词首和锚定词尾
\> 锚定词尾
<\ 锚定词首
示例:<\root\> //锚定单个单词
4、 分组
分组特性:默认情况下,Linux系统会分为分组指定变量,变量的表示形式\1 \2 \3……
abc* ->abcccccc 此时我们需要把abc看成一个整体
\(\)
示例:\(abc\)* -> abcabcabc
\(ab+\(xy\)*\),其中\1=ab+\(xy\)*,\2=xy
三、练习
1、显示/proc/meminfo文件中大小写s开头的行
grep -i "^s" /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd
3、显示/etc/passwd文件中UID号最大的用户的用户名
sort -n -t:-k3 /etc/passwd | tail -1 |cut -d:-f1
4、如果用户root存在,显示其默认的shell程序
grep "^root\>" /etc/passwd &> /dev/null && grep "root\>" /etc/passwd |cut -d: -f7
id root &> /dev/null && grep "^root\>" /etc/passwd |cut -d: -f7
5、找出/etc/passwd中的两位或三位数
grep "[0-9]\2,3\" /etc/passwd
6、显示/etc/rc.d/rc/sysinit文件中,至少以一个空白字符开头的且后面为非空白字符的行
grep "^[[:space:]]\+.*[^[:space:]]$" /etc/rc.d/rc.sysinit
7、找出"netstat -tan"命令的结果中,以"LISTEN"后跟0、1或多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行
useradd bash
useradd testbash
useradd basher
useradd -s /sbin/nologin nologin
grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd
以上是关于grep与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章