一、grep程序
Linux下有文本处理三剑客:grep、sed、awk
grep:文本 行过滤工具
sed:文本 行编辑器(流编辑器)
awk:报告生成器(做文本输出格式化)
1、grep
grep包含三个命令:grep、egrep、fgrep,他们是用来进行 行模式(patten)匹配的
egrep == grep -E
fgrep == fast grep //只使用文件通配符进行匹配
grep默认使用正则表达式进行文本匹配
2、grep的用法
grep [option]… PATTEN [filename]
3、grep的常见选项
-E 支持使用扩展的正则表达式(regexp)
-P 使用perl语言的正则表达式引擎进行搜索(每一种语言的正则表达式引擎都不相同,甚至sed grep awk 使用的regexp引擎也不相同)
-i 忽略大小写
-v 进行反选
-o 仅仅输出匹配的内容(默认输出匹配到的行
--color=auto 语法着色
-n 显示行号
-w 匹配固定的单词
4、PATTEN—正则表达式
作用:通过一些特殊字符,来表示一类字符内容,交给前面的命令来执行;如果使用特殊字符本身含义就需要使用 \ 进行转义
a) 文件通配符: * ? [ ] [^ ]
b) 字符匹配:
. 任意一个字符
[ ] 范围内的任意一个字符
[^ ] 范围外的任意一个字符
字符类:
[:alnum:] 字母+数字
[:alpha:] 字母
[:upper:] 大写字母
[:lower:] 小写字母
[:digit:] 数字
[:punct:] 表示特殊字符
[:space:] 空格 ^[[:space:]]*$ 有空格键的空行
c) 次数匹配
* 匹配前一个字符0次到多次 .*表示任意长度的任意字符
\? 匹配前一个字符0次到1次
\+ 匹配前一个字符1次到n次
\{m\} 匹配前一个字符m次 a\{7\} == aaaaaaa
\{m,n\} 匹配前一个字符m到n次
\{0,n\} 匹配前一个字符0到n次
\{m,\} 匹配前一个字符至少m次
d) 位置锚定
^ 锚定行首
$ 锚定行尾
\b 锚定词首和锚定词尾
\> 锚定词尾
\< 锚定词首
e) 分组 分组的特性:默认情况下,Linux系统会为分组指定变量,变量的表示形式为\1 \2 \3 …
\(\) 实例: \(abc\) 把abc看成一个整体匹配
练习:
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 /bin/bash useradd testbash useradd basher useradd -s /sbin/nologin nologin grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd