• sed打印包含一个字符串的行到包含另一个字符串的行解答


    sed -n '/字符串1/,/字符串2/p' filename  这个命令为什么有时候打印不出来想要的东西,例如:
    sed -n '/root/,/adm/p'  /etc/passwd      我想/etc/passwd中包含root的行到包含adm的行,结果却是:
    # sed -n '/root/,/adm/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    abrt:x:173:173::/etc/abrt:/sbin/nologin
    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    xc:x:500:500::/home/xc:/bin/bash

    所有行都出来了,为什么啊?

    解答:

    我来告诉你为什么。其实你如果将-n 去掉 然后看完整的数据流显示 你就能理解为什么显示了“看似全部的内容”
    首先要明确一个重要的概念:
    sed处理数据是以“数据流”的形式来进行的。sed将文件的每一行都读取到缓存空间中进行处理,并将处理后的数据返回。

    那么我们来看你这条语句是什么意思
    sed -n '/root/,/adm/p'  /etc/passwd 
    sed筛选每一行的数据 如果数据符合 /root/,/adm/ 这个表示式的匹配就打印出这一行的数据 由于使用了-n 那么说只有符合这个条件的行才会被打印出来。
    那么我们来分析sed整个数据的处理过程。步骤如下
    1.读取每一行的数据,通过表达式进行匹配,那么输出了root行到adm行之间的所有行。所以第一步输出了如下内容
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    2.关键在这里,sed虽然完成了“你想让它完成的工作”,但sed却不会再这里停止,它仍然要将下一行的数据继续读入 通过这个表示式来处理。那么sed会将后面读取的每一行取匹配表示式/root/,/adm/ 
    显示sed在
    operator:x:11:0:operator:/root:/sbin/nologin
    这一行找到了root ,然后下面读取的行 只要不包含adm 都是符合表示式的要求的 而后面显然没有adm的行 所以从operator一直到最后都会被打印出来。就成了你看到的样子,这里巧的是 adm后面紧跟的就是一个包含root的行 所以很碰巧的显示了文件的全部内容。

    sed是按行处理的,不会将整个文件加载到内存中,可以放心使用
    要切出从2012-02-09到2012-09-10的所有数据行,(假设你的日志文件以yyyy-MM-dd的日期格式开头)只需要:

    sed -n '/^2012-02-09/,/^2012-09-10/p' whole.log > part.log

  • 相关阅读:
    【BZOJ 2115】Xor
    COCI 2017-2018#7
    【SCOI 2005】骑士精神
    [cocos2d-x]我发现的内存管理机制的一些问题
    [深度探索C++对象模型]trival constructor和non-trival constructor
    [C++标准模板库:自修教程与参考手册]关于deque
    [C++标准模板库:自修教程与参考手册]关于vector
    [C++标准模板库:自修教程与参考手册]关于auto_ptr
    [cocos2d-x]关于声音和音效
    [cocos2d-x]关于坐标系
  • 原文地址:https://www.cnblogs.com/lgj8/p/12491084.html
Copyright © 2020-2023  润新知