Chinaunix首页 | 论坛 | 博客
  • 博客访问: 550328
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-23 13:53
个人简介

linux

文章分类

全部博文(66)

文章存档

2016年(1)

2015年(14)

2014年(32)

2013年(19)

分类: LINUX

2014-11-27 16:31:06

只是简单的学习下:
grep、sed、awk

1.grep 命令;打印文件中匹配某个样式的行
    执行方式:grep 【options】pattern 【files】
    控制样式的选项:
    -E:扩展的grep, egrep
    -f regex-file:从文件中获取正则表达式, fgrep
    -i不区分大小写
    -v:只取不匹配的结果
    控制输出的选项:
    -c:只输出文件中匹配的行数
    -l:只输出内容匹配的文件名
    -L:与-l相反, 输出内容没有匹配的文件名
    -m num:找到num个匹配行就停止继续查找

    输出行行首格式选项:
    -n:显示输出行在文件中的行数
    -h:不输出文件名
    -H:输出文件名

    示例:
    $ cat test_file 
    just one line here.
    Tiger cheng
    $ grep -i '^tiger' test_file 
    Tiger cheng
    $ grep -nH '^Tiger' test_file
    test_file:2:Tiger cheng

/***************************************************************************************************/

sed: 一个用于过滤和转换文字的流编辑器
    常用执行方式:sed 【options】 'command' [filename]
    示例:
    单次替换:'s/src/target'
       $ echo "tiger's home is home01" | sed 's/home/Home/'
        tiger's Home is home01

    全局替换:'s/src/target/g'
    echo "tiger's home is home01" | sed 's/home/Home/g'
    tiger's Home is Home01

    多次操作:-e选项
    $ echo "tiger's home" | sed -e 's/tiger/Tiger/' -e 's/home/Home/'
    Tiger's Home

    在匹配的样式行进行替换:'/pattern/' s/src/target
    原文内容;
        $ cat sample_one 
        one 1
        two 1
        three 1
        one 1
        two 1
        two 1
        three 1
    #将含有two字符串的行中的1改为2
        $ sed '/two/ s/1/2/' sample_one 
        one 1
        two 2
        three 1
        one 1
        two 2
        two 2
        three 1
    #将含有two字符串的行中的1改为2
    #将含有three字符串的行中的1改为3
        $ sed '
        /two/ s/1/2/
        /three/ s/1/3/' sample_one
        one 1
        two 2
        three 3
        one 1
        two 2
        two 2
        three 3

        从文件中读取替换规则
        $ cat sed.list 
        /two/ s/1/2/
        /three/ s/1/3/
        $ sed -f sed.list sample_one  #注意 -f选项
        one 1
        two 2
        three 3
        one 1
        two 2
        two 2
        three 3

    指定范围
    'n,m s/src/target' (n,m为行号)
    '/pattern/, /pattern/ s/src/target'

    #该第5-6行中的1为2
        $ sed '5,6 s/1/2/' sample_one 
        one 1
        two 1
        three 1
        one 1
        two 2
        two 2
        three 1

    #该第1个含有two的行到第6行
        $ sed '/two/,6 s/1/2/' sample_one
        one 1
        two 2
        three 2
        one 2
        two 2
        two 2
        three 1

    删除行:d表示删除, !d表示不删除
    #删除行中含有two的行
        $ sed '/two/ d' sample_one 
        one 1
        three 1
        one 1
        three 1
    #不删除包含two的行
        $ sed '/two/ !d' sample_one 
        two 1
        two 1
        two 1

    添加或插入文本
    #在第3行后追加一些文本:
        $ sed '3a\
        > hello world' sample_one
        one 1
        two 1
        three 1
        hello world
        one 1
        two 1
        two 1
        three 1
    #在第三行前插入一些文本
    $ sed '3i\
    > hello world123' sample_one
        one 1
        two 1
        hello world123
        three 1
        one 1
        two 1
        two 1
        three 1

    读写文件
    #将处理后的文件结果保存到sample_one
        $ sed '
        > /two/ s/1/2/
        > /three/ s/1/3/
        > 1,3 w sample_three' sample_one
        one 1
        two 2
        three 3
        one 1
        two 2
        two 2
        three 3


    提前退出:
        $ sed '
        > /two/ s/1/2/
        > /three/ s/1/3/
        > 5q' sample_one
        one 1
        two 2
        three 3
        one 1
        two 2

/*****************************************************************************************************/

awk:样式扫描和文本处理语言
    执行方式: awk '{pattern + action}' filenames
    示例:
    示例文件emp_names内容;
    $ cat emp_names 
    46012         DULANEY     EVAN          MOBILE     AL
    46013         DURHAM      JEFF          MOBILE     AL
    46015         STEEN          BILL          MOBILE     AL
    46017         FELDMAN     EVAN          MOBILE     AL
    46018         SWIM          STEVE         UNKNOWN     AL
    46019         BOGUE        ROBERT       PHOENIX     AZ
    46021         JUNE           MICAH        PHOENIX     AZ
    46022         KANE           SHERYL      UNKNOWN     AR
    46024         WOOD         WILLIAM      MUNCIE     IN
    46026        FERGUS        SARAH          MUNCIE     IN
    46027        BUCK            SARAH         MUNCIE     IN
    46029        TUTTLE        BOB              MUNCIE     IN 

打印一个或多个字段
    $ awk '{print $1, $2, $3, $5}' emp_names
        46017 FELDMAN EVAN AL
        46018 SWIM STEVE AL
        46019 BOGUE ROBERT AZ
        ......
样式匹配
    $ awk '/AL/ {print $3, $2}' emp_names 
    EVAN DULANEY
    JEFF DURHAM
    BILL STEEN
    EVAN FELDMAN
    STEVE SWIM

    #不指定字段就打印所有字段
    $ awk '/AL/' emp_names 
    46012 DULANEY EVAN MOBILE AL
    46013   DURHAM JEFF MOBILE AL
    46015 STEEN BILL MOBILE AL
    46017 FELDMAN EVAN MOBILE AL
    46018 SWIM STEVE UNKNOWN AL

    $awk '/AL|IN/' emp_names 
    46012 DULANEY EVAN MOBILE AL
    46013   DURHAM JEFF MOBILE AL
    ....
    46018 SWIM STEVE UNKNOWN AL
    46024 WOOD WILLIAM MUNCIE IN
    ....

更精确的匹配
    #注意结果,在一行中的任意字段匹配到AR
    $ awk '/AR/' emp_names 
    46022 KANE SHERYL UNKNOWN AR
    46026 FERGUS SARAH MUNCIE IN
    46027 BUCK SARAH MUNCIE IN

    #注意格式,现在指定匹配的字段为第5个字段
    $ awk '$5~/AR/' emp_names 
    46022 KANE SHERYL UNKNOWN AR

    #与上面的命令相反
    awk '$5!~/AR/' emp_names 
    46012 DULANEY EVAN MOBILE AL
    46013   DURHAM JEFF MOBILE AL
    ....
    
修饰一下输出内容:
    #字段间用tab隔开
    awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5}' emp_names 
    46012 DULANEY EVAN MOBILE AL
    46013 DURHAM JEFF MOBILE AL
    ......

    示例:
    花括号:命令组,花括号内为一个命令组, 一条awk命令可以有多个命令组组成,如:
    $ awk '{print $1, $2} {print $4, $5}' emp_names 
    46012 DULANEY
    MOBILE AL
    46013 DURHAM
    MOBILE AL
    46015 STEEN
    MOBILE AL
    。。。。

    字段分隔符:
    输入字段分隔符:-F设置, 如/etc/passwd文件字段用':'分隔。我们可以使用-F":"指定, 指定多个-F"[:# ]"
    awk -F":" '{print $1, $2}' /etc/passwd
    输出字段分隔符:OFS设置
    awk '{OFS="-"}{print $1, $2, $3, $4, $5}' emp_names 
    46012-DULANEY-EVAN-MOBILE-AL
    46013-DURHAM-JEFF-MOBILE-AL
    46015-STEEN-BILL-MOBILE-AL

    往输出添加内容:
    $ awk '$5~/IN/ {print "NAME: "$2", "$3"\nCITY_STATE:"$4", "$5"\n"}' emp_names 
    NAME: WOOD, WILLIAM
    CITY_STATE:MUNCIE, IN

输出到文件
    示例:
    $ awk '{print NR, $1>"/tmp/filez"}' emp_names 
    $ cat /tmp/filez 
    1 46012
    2 46013
    3 46015
    4 46017

管道
    注意:命令必须用双引号括起来
    示例:
    注意:错误的示例
    $ awk '{print $2 | sort}' emp_names 
    awk: (FILENAME=emp_names FNR=1) fatal: expression for `|' redirection has null string value

            正确的示例:
    $ awk '{print $2 | "sort"}' emp_names 
    BOGUE
    BUCK
    DULANEY
    DURHAM
    FELDMAN
    FERGUS
    JUNE

调用命令文件    
    $ cat >awklist
    {print $3, $2}
    {print $4, $5, "\n"} 
    ^C
    $ awk -f awklist emp_names 
    EVAN DULANEY
    MOBILE AL 
    .......




阅读(1646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~