三个支持正则表达式的行处理的工具: 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!
");
    for(i=0; i<10; i++)
.        a = a + i;
    return 0;
}

匹配括号里的内容:

yinheyi@ubuntu:~/play$ grep -nE "(.+)" hello.c
7:    printf("hello,world!
");
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 '1ashabi‘ 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/

image

另外: $0,表示整个条记录; $1表示当前行的第一个域,$2表示当前行的第二个域

预备知识2: 模式各类;(下面内容参考自:http://www.zsythink.net/archives/tag/awk/

  • 空模式:就是空的,没有 ,任何行都满足这个模式;
  • 关系模式:就是指的符合关系运算符的模式;如下所示:

image  

  • 正则表达式模式: 说明两点,1. 用 // 把正则表达式括起来;2. 它使用的为扩展的正则表达式,当使用{x,y}这种次数匹配时,需要加上参数 –posix或 –re-interval;
  • 行范围模式 :举个例子说明:
    // 用正则表达式来指定行的范围,(注意:都以第一次匹配的行为准)
    awk '/正则1/,/正则2/{动作}'  hello.c
    
    //当单纯地使用行号时,应该使用 NR变量;
    awk -F ':' 'NR>=3&&NR<=6{printf("%s@%s
    "), $1,$2}' passwd
  •     BEGIN和END模式;  不多说,上面已经说明;

说明:可以多个模式并列的;pattern省略与为1,等价于/.*/;action省略,等价于 print; 很有用的;

awk的打印命令:

print函数:print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。 说明一点:当两个打印的变量想用内容连接时,使用“内容”。

// 例子:

yinheyi@ubuntu:~/play$ echo "hello" | awk 'BEGIN{a="xiaoming";b="xiaohong"} {print a ,b}'
xiaoming xiaohong
yinheyi@ubuntu:~/play$ echo "hello" | awk 'BEGIN{a="xiaoming";b="xiaohong"} {print a"@"b}'
xiaoming@xiaohong

printf函数:其用法和C语言的差不多,可以格式化输出;不多说;

 

awk的动作命令:(下面内容参考自:http://www.zsythink.net/archives/tag/awk/

1. 它的动作命令用{}括起来; 多个命令之间用;分开,如{print $1; print $2}

2. {}里面可以放入一起C语言的控制语句,如判断、循环等;

3. 使用awk 之外的变量时,用‘’ 引起来,比如:

echo “12 34 12” | awk ‘{$1=‘$num’;print}’

awk的使用:

参数:-F ,指定输分隔符,分隔符用’’引起来;如: awk –F ‘:’ ;    

好,先到这里吧;

原文地址:https://www.cnblogs.com/yinheyi/p/7291003.html