码迷,mamicode.com
首页 > 其他好文 > 详细

Linxu 文本处理三剑客

时间:2015-09-10 02:02:21      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:grep egrep sed awk

回忆以前的内容:

表示:任意长度的任意字符

?表示:任意单个字符

[]表示:指定范围内的

[^]表示:指定范围外的


正则表达式:Regular EXPression,REGEXP

元字符:

   . 表示:匹配任意单个字符

   [] 表示:匹配指定范围任意单个字符

   [^] 表示:匹配指定范围任意单个字符

 

匹配次数(贪婪模式:尽可能长的匹配)

   * 表示:匹配其前面的字符任意次

      例子:a,b,ab,aab,acb,adb,amnb 问a*b能匹配到哪些字符串?

            答:b,ab,aab

   .* 表示:任意长度的任意字符

      a.*b 表示匹配以a开头,以b结尾的任何字符串。

   \? 表示:匹配其前面的字符1次或0次

   \{m,n\} 表示:匹配其前面的字符至少m次,至多n次

   \{m\}表示:匹配其前字符m次


文本查找

grep,egrep, fgrep

grep:根据模式,搜索文本,将符合模式的文本行显示出来。

Patten:文本字符和正则表达式的元字符组合而成的匹配条件


剑客一:grep

grep [OPTIONS] PATTERN [FILE...]

 

Option:-i  忽略大小写

        --colour 匹配出的字符,用颜色高亮显示

        -v 反向匹配,显示没有被匹配的行

        -o  只显示被模式匹配到的字符串

        -E 使用扩展正则表达式

        -A #

        -B #

        -C #

例子:

技术分享

技术分享


例子:

技术分享


位置锚定:

   ^ 表示:锚定行首,此字符后面的任意内容必须出现在行首

   $ 表示:锚定行尾,此字符后面的任意内容必须出现在行尾

例子:找出/etc/passwd下以w结尾的行

        grep ‘w$’/etc/passwd

      找出/etc/passwd 下以b开头以h结尾 切出现在行胃尾的行

        grep ‘b..h$’/etc/passwd

   ^$ 表示:空白行

     例子:统计/etc/inittab 下有多少空白行

           grep ‘^$’ /etc/inittab | wc -l

           找出/etc/inittab下以数字结尾的行

            grep ‘[[:digit:]]$’/etc/inittab

 

   \<或\b 表示:锚定词首,其后面的任意字符必须作为单词首部出现

   \>或\b 表示:锚定词尾,其后面的任意字符必须作为单词尾部出现

   \<root\> 表示:精确匹配某个单词

 

分组:

\(\)

    \(ab\)*  表示ab作为一个整体出现0次到无限次

例子:

技术分享


正则表达式:

   分为:Basic REGEXP  基本

         Extended REGEXP  扩展

  

 扩展正则表达式:

   字符匹配:

     .  指:匹配任意单个字符

     [] 指:匹配某范围内的任意单个字符

     [^]指:匹配某范围外的任意单个字符

 

   次数匹配:

     * 表示:匹配其前面的字符任意次

     ?表示:匹配其前面的字符1次或0次

     + 指:匹配其前面的字符至少一次,相当于\{1,\}

     {m,n} 表示:匹配其前面的字符至少m次,至多n次

 

   位置锚定,分组同正则表达式

 

   或者:

     |  表示:或者,or

        a | b a或b有一个就行

        C | cat 表示: C 或 cat

 

找出组字符串 ()

   例子  找出含有glad和good的行,使用或|

    egrep -n ‘g(la|oo)d‘ regular_express.txt

 

多个重复组的判断()+

   将 AxyzxyzxyzxyzC 用echo显示

     echo "AxyzxyzxyzxyzC" | egrep‘A(xyz)+C‘   这行命令的意思就是找出开头是A结尾是C,中间有1个或多个xyz的字符串

 

命令:grep - E = egrep

 

扩展正则表达式直接就用不要转义符

基本的 \? \+ \(\)

扩展的+ ()


剑客二:sed

     sed命令是一种在线编辑器,一次处理一行内容。原理:把当前处理的行存储在临时缓冲区(模式空间pattern  space)中,sed命令处理缓存区中的内容,处理完成之后,把缓冲区的内容发送的屏幕;然后处理下一行,直到文件的末尾。文件内容没有改变,除非使用重定向输出。sed主要用于自动编辑一个或多个文件;简化文件的反复操作。


sed命令格式

sed [-nefr] [动作]

       -n 使用安静模式,只有被sed匹配到的行才被显示出来。即,取消默认的输出

       -e 直接在命令行模式进行sed动作编辑

       -f sed动作写入一个文件内。-f filename 可以运行filename内的sed动作

       -r 支持延伸型正规表示法

       -i 直接修改读取的文件内容

 

       命令

d

           p显示模式空间中的内容。-n配合使用,打印匹配的行

           a \text:在行后面追加文本,支持使用\n实现多行追加

           i \text:在行前面追加文本,支持使用\n实现多行追加

           c \text:替换行为单行或多行文本

           w /path/to/somefile 保存模式空间匹配到的行到指定文件中

           r /path/from/somefile 读取指定文件的文本流到模式空间中的行后

           = 为模式空间中的行打印行号

           !取反条件

           s/// 查找替换,支持使用其他分隔符,s@@@S###

                 替换标记:

                        g 全局替换

                        p 显示替换成功的行

                        w /PATH/TO/SOMEFILE 将替换成功的结果保存到文件

 

例子:

d命令:

1.删除文件/etc/passwd的第二行

技术分享

2.删除第510

       [root@bogon~]# nl /etc/passwd | sed ‘5,10d

技术分享

3.删除最后一行

       [root@bogon~]#nl /etc/passwd | sed ‘$d‘

 

4.删除所有含有root的行

       [root@bogon~]# nl /etc/passwd | sed ‘/root/d‘

 

s命令

1.&表示被sed找到的部分,然后在后面加入要替换的内容

技术分享


2.test替换为mytest

技术分享


3. [root@bogon~]# sed -n ‘s@\(love\)able@\1er@p‘ test.txt 

       love被标记为1,所有的loveable都被替换为loveer,被替换的行会被打印出来。

技术分享


4.把模板testTest之间的行,每行的末尾加上zhou

技术分享


e命令,多点编辑

1.-e命令允许在同一行里执行多条命令。下面这条命令,先删除test.txt文件的第15行,把test替换为check

       sed -e ‘1,5d‘ -e ‘s/test/check/‘test.txt

 

2.- -expression可以给sed表达式直接赋值

 sed --expression=‘s/test/check/‘ --expression=‘/love/d‘

 

 

写入命令:w

下图是,向test1.txt文件中写入含有test的行。注意:不是追加,是覆盖写入

技术分享


从文件读入,r

下图是:从test1.txt中读入含有test的行

技术分享


追加命令,a在匹配行的下一行追加

技术分享


插入命令,i 在匹配行的上一行追加

技术分享

本文出自 “李娜渴死” 博客,请务必保留此出处http://zhoushuyu.blog.51cto.com/7125424/1693293

Linxu 文本处理三剑客

标签:grep egrep sed awk

原文地址:http://zhoushuyu.blog.51cto.com/7125424/1693293

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!