美文网首页
文本处理grep和sed

文本处理grep和sed

作者: SecondBJ | 来源:发表于2018-08-21 20:03 被阅读0次

    一:grep

    语法: grep [-cinvABC] ‘word’ filename
    -c :打印符合要求的行数
    -i :忽略大小写
    -n :在输出符合要求的行的同时连同行号一起输出
    -v :打印不符合要求的行
    -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
    -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
    -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
    
    1、 image.png
    image.png
    2、 过滤出带有某个关键词的行并输出行号
    image.png
    3、过滤不带有某个关键词的行,并输出行号
    image.png
    4、 过滤出所有包含数字的行
    image.png
    image.png
    在前面也提到过这个”[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符
    5、过滤出文档中以某个字符开头或者以某个字符结尾的行
    image.png
    image.png
    在正则表达式中,”^”表示行的开始,"$"表示行的结尾,那么空行则表示"^$",如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果
    如何打印出不以英文字母开头的行呢?
    image.png
    6、 过滤任意一个字符与重复字符
    image.png

    “.”表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来。
    "*"表示零个或多个前面的字符。
    ‘.*’表示零个或多个任意字符,空行也包含在内。

    7、指定要过滤字符出现的次数
    image.png
    这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即’oo’的行。注意,{ }左右都需要加上脱意字符’\’。另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。

    egrep

    1、 筛选一个或一个以上前面的字符
    image.png
    image.png
    和grep的 {2}不同的是,egrep这里是使用’+’的。
    2、 筛选零个或一个前面的字符
    image.png
    3、 筛选字符串1或者字符串2
    image.png
    4、egrep中’( )’的应用
    image.png

    二、sed

    grep 工具的功能其实还不够强大,其实说白了,grep实现的只是查找功能,而它却不能实现把查找的内容替换掉。以前用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。
    1、打印某行 sed -n ‘n’p filename 单引号内的n是一个数字,表示第几行
    image.png
    2、打印多行 打印整个文档用 -n ‘1,$’p
    image.png
    3、 打印包含某个字符串的行
    image.png
    上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用。
    image.png
    image.png
    image.png
    4、 -e 可以实现多个行为
    image.png
    5、-d 删除某行或者多行
    image.png
    6、 替换字符或字符串
    image.png

    如何删除文档中的所有数字或者字母?


    image.png
    7、调换两个字符串的位置
    image.png
    8、直接修改文件的内容

    sed -i ‘s/:/#/g’ test.txt ,这样就可以直接更改test.txt文件中的内容了。

    1. 删除test.txt 的15行以及以后所有行;
     sed '15,$'d test.txt
    2.删除test.txt中5到10行中所有的数字;
     sed '5,10s/[0-9]//g' test.txt
    3. 删除test.txt 中所有特殊字符(除了数字以及大小写字母);
     sed 's/[^0-9a-zA-Z]//g' test.txt
    4. 把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
     /bin/cp /etc/passwd /root/test.txt ; sed -n '1,$'p test.txt
    

    相关文章

      网友评论

          本文标题:文本处理grep和sed

          本文链接:https://www.haomeiwen.com/subject/ycsjiftx.html