首页 > 代码库 > sed简析

sed简析

  1.   写一个shell命令,统计apache日志文件(access_log)中某一天中每个URL的访问次数,并按照次数由小到大的顺序排序输出:
    # cat /application/nginx/logs/20170202_access_www.log |awk ‘{print $7}‘|sort| uniq -c |sort -n

    awk  ‘{print $7}‘ 匹配到 url 记录即日志文件格式的($http_referer)字段
    sort  是排序 ,并且标准输出到屏幕
    uniq -c  统计重复的行的总数
    sort -n 是从小到达排序(如果是从大到小排序 加入-r  (倒序))
    2.  用netstat命令配合其他shell命令,按照来源IP统计下所有到80端口的ESTABLISHED状态链接的个数,输出结果类似(第一列为连接数,第二列为IP):
        12 202.165.123.2
        35 202.165.123.2
        69 202.165.123.2
    # netstat | grep -E "80&ESTABLISHED" | awk ‘{print $5}‘| cut -d":" -f1 |sort |uniq –c | sort –n
    同理这个也是一样的。
      grep  -E 是扩展的正则匹配 可以同时匹配  80  ESTABLISHED
      awk ‘{print $5}‘  匹配出IP地址和进程号( 格式    ip:pid) 这里需要继续拆分
      cut  -d":"  -f1   以:为分隔符 取出第一部分就是 ip
      uniq -c  统计重复的行数
      sort -n 排序
    3.写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行;(2) 一行中,如果包含"11111",则在"11111"前面插入"AAA",在"11111"后面插入"BBB",比如:将内容为0000111112222的一行改为:0000AAA11111BBB2222
        # echo -e "0000111112222\n\n">abc
        # sed ‘/^$/d‘ abc
        0000111112222
        1. 多个sed 命令集合
        # sed ‘s/0000/0000AAA/ ; s/2222/BBB222/‘ abc
        0000AAA11111BBB222
        2.精确匹配
            # sed ‘s/\(11111\)/AAA\1BBB/g‘ abc
        0000AAA11111BBB2222
        3.直接替换
            # sed ‘s/11111/AAA11111BBB/g‘ abc
        0000AAA11111BBB2222
    sed :流编辑器,过滤和替换文本。
        工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式空间。然后再将下一行读入模式空间进行处理输出,以此类推,直到最后一行。还有一个空间叫保持空间,又称暂存空间,可以暂时存放一些处理的数据,但不能直接输出,只能放到模式空间输出。
    这两个空间其实就是在内存中初始化的一个内存区域,存放正在处理的数据和临时存放的数据。

    选项  :

        -n 不打印模式空间

        -i  修改数据

        -r  正则表达式的扩展模式

        -e  多个sed 命令一起执行
sed 命令用法简析:
    # echo -e "booktestbook\nbook\n\ntest">abc  实验文件创建
1.替换命令s
      # sed -n ‘s/book/BOOK/p‘ abc
        BOOKtestbook
        BOOK
2.这里使用 -n  p  组合作用:常用于显示行的内容。p 的作用是打印 print
    如果需要你显示12-19行的内容可以:# sed -n ‘12,19p‘ file

这里需要注意的参数是 -i
    上面几个sed命令只是 查看。不是修改。如果想修改 需要加入 -i 参数
    # sed -i ‘s/book/BOOK/p‘ abc
    这里就是把源文件中的所有book 都替换成了BOOK
3.上个命令的 g 参数是作用是 全部替换
    比较一下加不加 g 的区别
    # sed -n ‘s/book/BOOK/p‘ abc
    BOOKtestbook
    BOOK
    没有替换所有的book字符
    # sed -n ‘s/book/BOOK/gp‘ abc
    BOOKtestBOOK
    BOOK
    替换了所有的book字符
如果需要从N处开始替换,可以使用Ng
    # echo abababab | sed ‘s/ab/AB/2g‘
    abABABAB
    # echo abababab | sed ‘s/ab/AB/3g‘
    ababABAB
4.删除命令 d
    # sed ‘/^$/d‘ abc    (删除空行)
    booktestbook
    book
    test
    (类似命令  grep -v
    # grep -v "^$" abc
    booktestbook
    book
    test)
    [root@swallow ~]# sed ‘1d‘ abc (删除第一行)
    book

    test
    [root@swallow ~]# sed ‘1,$d‘ abc  ($代表最后一行,删除所有行)
    [root@swallow ~]# sed ‘1,2d‘ abc  (删除第一和第二行)

    test
    [root@swallow ~]# sed ‘$d‘ abc    (删除最后一行)
    booktestbook
    book

    [root@swallow ~]# sed ‘/^b/d‘ abc (删除以b 开头的行)

    test
    [root@swallow ~]#
6.已匹配字符串标记 &  (\w\+ 匹配每个单词)
    # echo hello  world | sed ‘s/\w\+/[&]/‘
    [hello] world
    # echo hello  world | sed ‘s/\w\+/[&]/g‘ (更加加深了对g 使用的了解)
    [hello] [world]
    所有以192.168.1.120开头的都替换成自己加:localhost
    这里以nginx的访问日中为例:
    # sed ‘s/^192.168.1.120/&:localhost/g‘ /application/nginx/logs/20170202_access_www.log  | awk ‘{print $1}‘|grep 120
    192.168.1.120:localhost

    awk ‘{print $1}‘ 是提取出第一列  grep 120  找到 192.168.1.120
7.子串匹配标记 \1
    # echo BBB bbb | sed ‘s/\([A-Z]\+\) \([a-z]\+\)/\2 \1/‘
    bbb BBB
    # echo loveable | sed ‘s/\(love\)able/\1evol/‘
    loveevol
8.选定行的范围"," 在行上插入 i\  在行下追加 a\ 替换本行 c\
    # sed ‘/^book/,/^test/i\abc‘ abc (在以book和test开头的行上面写入abc)
    abc
    booktestbook
    abc
    book
    abc

    abc
    test
    # sed ‘/^book/,/^test/a\abc‘ abc (在以book和test开头的行下面写入abc)
    booktestbook
    abc
    book
    abc

    abc
    test
    abc
    # sed -e ‘/^$/d‘ abc -e ‘/test/ c \give‘    
    give
    book
    give
9.多点编辑 命令 e
    # sed -e ‘/^$/d‘ -e ‘s/book/BOOK/g‘ abc
    BOOKtestBOOK
    BOOK
    test
10.下一个 n 命令: (如果book被匹配,则移动到匹配行的下一个将book替换成bookabc
    # sed ‘/book/{n; s/\([a-z]\+\)/\1abc/;}‘ abc        
    booktestbook
    bookabc

    test
11.写入文件 w 命令  和 读取文件  r 命令
    将abc中的包含book的行写入到 book
    # sed ‘/book/w book‘ abc
    booktestbook
    book

    test
    查看文件book 和abc
    # cat book
    booktestbook
    book
    # cat abc
    booktestbook
    book

    test
    逐行读取文件book中含有book的字符的行。如果abc中也含有book并且行号一样,则显示在后面
    # sed ‘/book/r book‘ abc
    booktestbook
    booktestbook
    book
    book
    booktestbook
    book

    test
12.退出 q
    # sed ‘2q‘ abc
    打印出第二行后退出。

简单应用:

打印奇数行和偶数行
    # echo -e "1\n2\n3\n4">pn
    # sed -n ‘p;n‘ pn
    1
    3
    # sed -n ‘1~2p‘ pn
    1
    3
    # seq 6 | sed ‘n;d‘
    1
    3
    5
    # seq 6 | sed -n ‘N;P‘
    1
    3
    5
    # sed -n ‘n;p‘ pn
    2
    4
    # sed -n ‘2~2p‘ pn
    2
    4
    # seq 6 | sed -n ‘n;p‘
    2
    4
    6
打印总行号( = 代表行号)
    # cat abc | sed -n ‘$=‘
    4
只打印最后一行:
    # seq 6 | sed -n ‘$p‘
    6
位置调换:
# echo ‘123#abc!def*456‘ | sed -r ‘s/([^#]+)(!.*\*)([^\*]+$)/\3\2\1/‘
123#456!def*abc
分行添加标记技巧
    # seq 6 | sed ‘:a;N;s/\n/#/;b a‘
    1#2#3#4#5#6
    # sed ‘:a;N;s/\n/@/; b a‘ abc
    booktestbook@book@@test


本文出自 “赵雁生的linux之旅” 博客,请务必保留此出处http://12042068.blog.51cto.com/12032068/1895140

sed简析