正则表达式与grep
文本编辑工具
grep:是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来;
sed :是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用;
awk :是一种编程语言,用于在linux/unix下对文本和数据进行处理;
grep使用
grep [OPTION] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
选项:
–color=auto:自动加颜色;
-i :ignorecase,忽略字符大小写;
-o :仅显示匹配道德字符串本身;
-v :–invert-match:显示不能被模式匹配到的行;
-E :支持使用扩展的正则表达式元字符;
-q :不输出任何信息;
-A<显示列数>:除了显示符合范本样式的那一行之外,并显示该行之后的内容;
-B<显示列数>:在显示符合范本样式的那一行之外,并显示该行之前的内容;
-C<显示列数>:除了显示符合范本样式的那一列之外,并显示该列之前后的内容;
正则表达式
正则表达式,又称规则表达式。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式元字符
(1)字符匹配:
. :匹配任意单个字符;
[] :匹配指定范围内的任意单个字符;
[^] :匹配指定范围外的任意单个字符;
(2)匹配次数:
* :匹配其前面的字符任意次;
.* :匹配任意长度的任意字符;
\? :匹配其前面的字符至多1次;
\+ :匹配其前面的字符至少1次;
\{m\} :匹配其前面的字符m次;
\{m,n\} :匹配其前面的字符至少m次,至多n次;
\{0,n\} :匹配其前面的字符至多n次;
\{m,\} :匹配其前面的字符至少m次;
(3)位置锚定:
^ :行首锚定;
$ :行尾锚定;
^PATTERN$ :用PATTERN来匹配整行;
^$ :匹配空白行;
^[[:space:]]*$ :包含空白字符的行或空行;
单词:非特殊字符组成的连续字符;
\<或<b :词首锚定;
\>或\b :词尾锚定;
\<PATTERN\> :匹配完整单词;
(4)分组及引用:
\(\) :将一个或多个字符当作一个整体;分组括号中的内容会被记录于内部变量中,可作为引用;
后向引用:
\1 :引用第一个括号中匹配到的字符;
\2 :引用第二个括号中匹配到的字符;
… …
示例
1.显示当前系统上root、fedora或user1用户的默认shell;
# less /etc/passwd | egrep "^(root|fedora|user1)\>" | cut -d: -f1,7 root:/bin/bash user1:/bin/bash fedora:/bin/bash 或 # less /etc/passwd | grep "^\(root\|fedora\|user1\)\>" | cut -d: -f1,7 root:/bin/bash user1:/bin/bash fedora:/bin/bash
2.找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();
# egrep "\<[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions checkpid() { daemon() { killproc() { pidfileofproc() { pidofproc() { status() { success() { failure() { passed() { warning() { action() { strstr() {
3.使用echo命令输出一个绝对路径,使用grep取出其基名;
扩展:取出其路径名;
# echo "/var/log/cron" | egrep -o "[^/]+/?$" # echo "/var/log/cron" | egrep -o "^(/[^/]+)+/$"
4.找出ifconfig命令结果中的1-255之间数字;
# ifconfig | egrep -o "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"
5.挑战题:写一个模式,能匹配合理的IP地址;
#ifconfig | egrep -o "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
6.挑战题:写一个模式,能匹配出所有的邮件地址;
# egrep -o "[[:alnum:]]+\@[[:alnum:]]+\.[[:alnum:]]"
7.查找/var目录下属主为root,且属组为mail的所有文件或目录;
# find /var -user root -a -group mail
8.查找当前系统上没有属主或属组的文件;
进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录;
# find / -nouser -o -nogroup # find / \( -nouser -o -nogroup \) -atime -3
9.查找/etc目录下所有用户都有写权限的文件;
# find /etc -perm -222
10.查找/etc目录下大于1M,且类型为普通文件的所有文件;
# find /etc/ -size +1M -type f -exec ls -lh {} \
11.查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的文件;
# find /etc/init.d/ -perm -113 -type f
12.查找/usr目录下不属于root、bin或hadoop的文件;
# find /usr/ -not \( -user root -o -user bin -o -user hadoop \)
13.查找/etc/目录下至少有一类用户没有写权限的文件;
# find /etc/ -not -perm -222
14.查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件;
# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)
原创文章,作者:N22-无锡-沉默,如若转载,请注明出处:http://www.178linux.com/48939
评论列表(1条)
第二个问题看一下man grep的参数