美文网首页
awk/sed/grep

awk/sed/grep

作者: __XY__ | 来源:发表于2017-08-02 13:12 被阅读0次
    • sed -e /^noshow/d test.txt
    • sed -n /[^noshow]/ test.txt
    • awd /[^noshow]/ test.txt
      grep -v 'boshow' test.txt

    grep 常用参数速记

    • egrep 等同 grep -E
    -C:打印出匹配的行的上下文前后各 n行。   
    -i: 不区分大小写字符。
    -n:在输出的每行前面加上它所在的文件中它的行号,
    -v: 也就是说反向匹配
    -o : 显示匹配的行中与 PATTERN 相匹配的部分。
    -L:和上面的-l相对,显示不匹配的文件名,
    -R,-r: 递归地读每一目录下的所有文件。
    ^$:代表空行:
    -e:该选型可以匹配多个模式
    

    sed命令


    sed全称是stream editor ,他的特点是针对行来处理,一般配合正则表达式来处理。

    参数速记

    -n 使用安静(silent)模式(想不通为什么不是-s)。
    在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。
    但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来;
    
    -r 让sed命令支持扩展的正则表达式(默认是基础正则表达式);
    -i 直接修改读取的文件内容,而不是由屏幕输出。
    

    几个重要的操作参数

    a \: append即追加字符串, a \的后面跟上字符串s(多行字符串可以用\n分隔),
    则会在当前选择的行的后面都加上字符串s;
    
    c \: 取代/替换字符串,c \后面跟上字符串s(多行字符串可以用\n分隔),则会将当前选中的行替换成字符串s;
    
    d: delete即删除,该命令会将当前选中的行删除;
    
    i \: insert即插入字符串,i \后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选中的行的前面都插入字符串s;
    
    p: print即打印,该命令会打印当前选择的行到屏幕上;
    
    s: 替换,通常s命令的用法是这样的:1,2s/old/new/g,将old字符串替换成new字符串;其中的g 表示global全局替换,如果没有global的话,只会替换每一行中的第一个匹配的内容;
    
    =: 显示文件行号 
    

    下面通过几个例子快速复习下

    sed '1a \add one' my.txt
    sed '/sb/c \ 2d' my.txt
    
    sed -n '1,4p' my.txt    #显示第1-4行;
    sed 's/sb/2b/g' my.txt     #替换;
    sed '1,5d' my.txt            #删除;
    

    正则表达式来替换

    # 如果你这样搞的话,就会有问题
    $ sed 's/<.*>//g' html.txt
     Understand?
     
    # 要解决上面的那个问题,就得像下面这样。
    # 其中的'[^>]' 指定了除了>的字符重复0次或多次。
    $ sed 's/<[^>]*>//g' html.txt
    This is what I meant. Understand?
    

    指定行替换,只替换第三行

    $ sed "3s/my/your/g" pets.txt
    This is my cat
      my cat's name is betty
    This is your dog
      my dog's name is frank
    This is my fish
      my fish's name is george
    This is my goat
      my goat's name is adam
    

    替换自定范围,只替换第3到第6行的文本。

    $ sed "3,6s/my/your/g" pets.txt
    This is my cat
      my cat's name is betty
    This is your dog
      your dog's name is frank
    This is your fish
      your fish's name is george
    This is my goat
      my goat's name is adam
    

    只替换每一行的第一个s

    $ sed 's/s/S/1' my.txt
    ThiS is my cat, my cat's name is betty
    ThiS is my dog, my dog's name is frank
    ThiS is my fish, my fish's name is george
    ThiS is my goat, my goat's name is adam
    

    只替换每一行的第二个s

    $ sed 's/s/S/2' my.txt
    This iS my cat, my cat's name is betty
    This iS my dog, my dog's name is frank
    This iS my fish, my fish's name is george
    This iS my goat, my goat's name is adam
    

    只替换第一行的第3个以后的s

    $ sed 's/s/S/3g' my.txt
    This is my cat, my cat'S name iS betty
    This is my dog, my dog'S name iS frank
    This is my fiSh, my fiSh'S name iS george
    This is my goat, my goat'S name iS adam
    

    多个匹配


    如果我们需要一次替换多个模式,可参看下面的示例:(第一个模式把第一行到第三行的my替换成your,第二个则把第3行以后的This替换成了That)

    $ sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
    This is your cat, your cat's name is betty
    This is your dog, your dog's name is frank
    That is your fish, your fish's name is george
    That is my goat, my goat's name is adam
    

    上面的命令等价于:(注:下面使用的是sed的-e命令行参数)

    sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt
    

    我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西。如下所示:

    $ sed 's/my/[&]/g' my.txt
    This is [my] cat, [my] cat's name is betty
    This is [my] dog, [my] dog's name is frank
    This is [my] fish, [my] fish's name is george
    This is [my] goat, [my] goat's name is adam
    

    圆括号匹配


    使用圆括号匹配的示例:(圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…)

    $ sed 's/This is my \([^,&]*\),.*is \(.*\)/\1:\2/g' my.txt
    cat:betty
    dog:frank
    fish:george
    goat:adam
    

    上面这个例子中的正则表达式有点复杂,解开如下(去掉转义字符):

    正则为:This is my ([^,]),.is (.*)
    匹配为:This is my (cat),……….is (betty)

    然后:\1就是cat,\2就是betty

    参考

    http://10706198.blog.51cto.com/10696198/1792393
    http://www.cnblogs.com/yinheyi/p/6653592.html

    相关文章

      网友评论

          本文标题:awk/sed/grep

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