三个支持正则表达式的行处理的工具: grep/sed/awk
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三个支持正则表达式的行处理的工具: grep/sed/awk相关的知识,希望对你有一定的参考价值。
grep:
全称Global Regular Expression Print, 是干什么的,不多说了;
用法:grep 【-options] [pattern】 【filename]
选项:
-c: 只输出匹配行的数目 -i: 不区分大小写 -n:显示匹配航以及行号 -l:查询多文件的时候只输出包含匹配字符的文件名 -L: 列出不匹配的文件名; -v:反向匹配,即显示不匹配的行 -h: 查询的时候不适用文件名 -s:不显示错误信息
-E 使用扩展正则表达式 //很有用啊,
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行 -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
pattern:
指的正则表达式;用双引号“”或单引号‘’引用起来;
例子:
int main() { printf int iostreamsd print include interfaces j int a = 0, i; int. main() { printf("hello,world!\\n"); for(i=0; i<10; i++) . a = a + i; return 0; }
匹配括号里的内容:
[email protected]:~/play$ grep -nE "\\(.+\\)" hello.c 7: printf("hello,world!\\n"); 8: for(i=0; i<10; i++)
sed 的用法:(来自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html)
sed 是一种在线编辑器,它一次处理一行内容;它也可以处理 正则表达式(其中用//来把正则表达式括起来);下面为它的用法:
sed 【参数】 【动作】 文件
参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。
动作:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
补充:(来自:http://blog.csdn.net/wh_19910525/article/details/7613090)
a\\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\\”续行 c\\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\\"续行 i\\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\\"续行 d 删除行 h 把模式空间里的内容复制到暂存缓冲区 H 把模式空间里的内容追加到暂存缓冲区 g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 l 列出非打印字符 p 打印行 n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 q 结束或退出sed r 从文件中读取输入行 ! 对所选行以外的所有行应用命令 s 用一个字符串替换另一个 g 在行内进行全局替换 w 将所选的行写入文件 x 交换暂存缓冲区与模式空间的内容 y 将字符替换为另一字符(不能对正则表达式使用y命令)
举例子:
sed ‘1a\\shabi‘ hello.c //在第一行后面增加一行; sed ‘1,4d‘ hello.c // 把第一行至第四行删除; sed -nr ‘/^int/p‘ hello.c // 把开头为int的行打印出来; sed -nr ‘/^[^int]/p‘ hello.c // 把开头不是int的行打印出来; sed ‘1,20s/int/sb/g‘ hello.c // 把第一行到第20行中的int换为sb;
//多个命令用{}括起来,并用 ; 分开;
如:
sed -n ‘/int/{s/int/char/g;p}‘ hello.c //把含有 int 的行 换为 char 并打印出来;
AWK更牛逼:
它可以把文件逐行读入,心空格或其它指定的分隔符将每一行切片,切开的部分再进行各种分析处理;
如何调用 awk?(来自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html)
三个方法:1, 命令行形式;也是下面要讲的形式;
2. shell 脚本方式, 与bash 一样的道理;
3. 将所有命令写入到一个单独的文件,然后调用 awk –f awk-script-file input-file, 我觉得这个方式与 shell 脚本形式差不多啊;
awk的工作原理:(来自:http://man.linuxde.net/awk)
awk ‘BEGIN{ commands } pattern{ commands } END{ commands }‘第一步:执行BEGIN{ commands }语句块中的语句; 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 第三步:当读至输入流末尾时,执行END{ commands }语句块。
说明:
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。(把Pattern当作一个条件比较好理解;)
预备知识1:内置变量 (下面内容参考自:http://www.zsythink.net/archives/tag/awk/)
另外: $0,表示整个条记录; $1表示当前行的第一个域,$2表示当前行的第二个域
预备知识2: 模式各类;(下面内容参考自:http://www.zsythink.net/archives/tag/awk/)
- 空模式:就是空的,没有 ,任何行都满足这个模式;
- 关系模式:就是指的符合关系运算符的模式;如下所示:
- 正则表达式模式: 说明两点,1. 用 // 把正则表达式括起来;2. 它使用的为扩展的正则表达式,当使用{x,y}这种次数匹配时,需要加上参数 –posix或 –re-interval;
- 行范围模式 :举个例子说明:
// 用正则表达式来指定行的范围,(注意:都以第一次匹配的行为准) awk ‘/正则1/,/正则2/{动作}‘ hello.c //当单纯地使用行号时,应该使用 NR变量; awk -F ‘:‘ ‘NR>=3&&NR<=6{printf("%[email protected]%s\\n"), $1,$2}‘ passwd- BEGIN和END模式; 不多说,上面已经说明;
说明:可以多个模式并列的;pattern省略与为1,等价于/.*/;action省略,等价于 print; 很有用的;
awk的打印命令:
print函数:print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。 说明一点:当两个打印的变量想用内容连接时,使用“内容”。
// 例子: [email protected]:~/play$ echo "hello" | awk ‘BEGIN{a="xiaoming";b="xiaohong"} {print a ,b}‘ xiaoming xiaohong [email protected]:~/play$ echo "hello" | awk ‘BEGIN{a="xiaoming";b="xiaohong"} {print a"@"b}‘ [email protected]printf函数:其用法和C语言的差不多,可以格式化输出;不多说;
awk的动作命令:(下面内容参考自:http://www.zsythink.net/archives/tag/awk/)
1. 它的动作命令用{}括起来; 多个命令之间用;分开,如{print $1; print $2}
2. {}里面可以放入一起C语言的控制语句,如判断、循环等;
awk的使用:
参数:-F ,指定输分隔符,分隔符用’’引起来;如: awk –F ‘:’ ;
好,先到这里吧;
以上是关于三个支持正则表达式的行处理的工具: grep/sed/awk的主要内容,如果未能解决你的问题,请参考以下文章