天天看点

sed简析

  写一个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

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字符

如果需要从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

    test)

    [root@swallow ~]# sed '1d' abc (删除第一行)

    [root@swallow ~]# sed '1,$d' abc  ($代表最后一行,删除所有行)

    [root@swallow ~]# sed '1,2d' abc  (删除第一和第二行)

    [root@swallow ~]# sed '$d' abc    (删除最后一行)

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

    [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

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

    # sed -e '/^$/d' abc -e '/test/ c \give'    

    give

9.多点编辑 命令 e

    # sed -e '/^$/d' -e 's/book/BOOK/g' abc

10.下一个 n 命令: (如果book被匹配,则移动到匹配行的下一个将book替换成bookabc

    # sed '/book/{n; s/\([a-z]\+\)/\1abc/;}' abc        

    bookabc

11.写入文件 w 命令  和 读取文件  r 命令

    将abc中的包含book的行写入到 book

    # sed '/book/w book' abc 

    查看文件book 和abc

    # cat book

    book 

    # cat abc

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

    # sed '/book/r book' abc

12.退出 q

    # sed '2q' abc

    打印出第二行后退出。

简单应用:

打印奇数行和偶数行

    # echo -e "1\n2\n3\n4">pn

    # sed -n 'p;n' pn

    1

    3

    # sed -n '1~2p' pn

    # seq 6 | sed 'n;d'

    5

    # seq 6 | sed -n 'N;P'

    # sed -n 'n;p' pn

    2

    4

    # sed -n '2~2p' pn

    # seq 6 | sed -n 'n;p'

    6

打印总行号( = 代表行号)

    # cat abc | sed -n '$='

只打印最后一行:

    # seq 6 | sed -n '$p'

位置调换:

# 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

本文转自 swallow_zys  51CTO博客,原文链接:http://blog.51cto.com/12042068/1895140,如需转载请自行联系原作者

继续阅读