grep正则表达式规范 在sed、awk及C语言中用正则表达式
1 正则表达式介绍用一个命令查找一个模式得到一类字符串时,这个模式应该包含以下信息:
规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式(Regular Expression)。
2 grep正则表达式的Extended规范各种工具和编程语言所使用的正则表达式规范的语法并不相同,表达能力也各不相同,有的正则表达式规范引入很多扩展,能表达更复杂的模式,但各种正则表达式规范的基本概念都是相通的。grep所使用的正则表达式,它大致上符合POSIX正则表达式规范,此笔记学习、练习grep使用的正则表达式。
(1) 字符类
(2) 数量限定符
(3) 位置限定符
(4) 其它特殊字符
Basic规范也有这些语法,只是字符?+{}|()应解释为普通字符,要表示上述特殊含义则需要加转义。如果用grep而不是egrep,并且不加-E参数,则应该遵照Basic规范来写正则表达式。
3 sed与正则表达式(1) sed简介sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。
sed命令不会修改原文件,只是经过sed命令后输出需要部分。
(2) sed涉及的正则表达式及编辑命令sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件然后用-f参数指定,编辑命令的格式为:
其中pattern是正则表达式,action是编辑命令。sed一行一行读出待处理文件,如果某一行与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。
sed常用编辑操作:
(3) sed命令行格式根据(2)中对sed处理的文件和编辑命令的描述可得sed命令行的基本格式为:
4 awk(1) awk介绍sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义,比如/etc/passwd文件的每一行有若干个字段,字段之间以:分隔,就可以重新定义awk的列分隔符为:并以列为单位处理这个文件。
(2) awk命令行格式awk基本用法和sed类似,awk命令行的基本形式为:
和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用-f参数指定一个脚本文件,编辑命令的格式为:
pattern是正则表达式,actions是一系列操作(编辑命令),awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。
awk命令的condition部分还可以是两个特殊的condition-BEGIN和END,对于每个待处理文件,BEGIN后面的actions在处理整个文件之前执行一次,END后面的actions在整个文件处理完之后执行一次。
(3) awk内建变量awk命令可以像C语言一样使用变量(但不需要定义变量)。就像Shell的环境变量一样,有些awk变量是预定义的有特殊含义的:
awk还可以像C语言一样使用if/else、while、for控制结构。以前未“系统”掌握awk命令格式时做的笔记(例子):shell awk读取文件中的指定行的指定字段。
5 在C语言中使用的正则表达式POSIX规定了正则表达式的C语言库函数:regex(3)。man regex。 用正则表达式匹配字符串是否为IP地址的C代码: /*Filename: regex_in_c.c *Brife: use c function to use regex *Author: One fish *Date: 2014.8.12 Tuesday */ #include <sys/types.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> int main(void) { regex_t reg; char regex[] = "[0-9]{1,3}.[0-9]{1,3}"; char str[] = "172.168.13.1"; size_t nmatch = 1; regmatch_t pmatch[1]; char errbuf[100]; int i,re; //Compile regex to reg re = regcomp(®,regex,REG_EXTENDED | REG_NEWLINE); if ( 0 != re ) { regerror(re,®,errbuf,100); printf("%sn",errbuf); exit(1); } //Use reg which compiled from pattern to match substring in whole string str re = regexec(®,str,nmatch,pmatch,0); if (REG_NOMATCH == re) { printf("No matchn"); exit(1); } else if (0 == re) { printf("matched:n"); for (i = pmatch[0].rm_so; i < pmatch[0].rm_eo; ++i) { putchar(str[i]); } printf("n"); printf("%d,%dn",pmatch[0].rm_so,pmatch[0].rm_eo); } //Free ® used in recomp regfree(®); return 0; } 编译并执行程序:
当在regcomp函数中的cflags参数中指定REG_NOSUB时nmatch和pmatch参数将会被忽略,不能再将它们的值输出来。 [2014.8.11-21.02 ---- 2014.8.12-16.29] LCNote Over. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |