• shell实例浅谈之六文件特定行打印的多种方法


    一、问题

          Sed和AWK在处理文件方面有很强的优势,还有head和tail等文件处理工具的使用,grep也可实现文本的搜索。上述命令都可以在后面直接加文件名,不需要在前面使用cat添加管道,cat会影响命令执行的效率,本文中cat -n /etc/services实在测试时可很方便的查看到具体的行号。

    二、详解

    1、查看文件的第20行到30行的内容

    以系统的/etc/services为例,cat -n /etc/services可以查看文件的行号。

    (1)方法一:head和tail

    head -30 /etc/services | tail -11(通过cat -n /etc/services | head -30 | tail -11查看具体行号)。

    (2)方法二:sed

    sed -n '20,30p' /etc/services(通过cat -n /etc/services | sed -n '20,30p'查看具体行号)。

    (3)方法三:awk

    awk '{if(NR>19 && NR <31) printf $1" "}' /etc/services(通过cat -n /etc/services | awk '{if(NR>19 && NR <31) printf $0" "}'查看具体行号)。

    2、查看文件的特定行,设置步长

    以系统的/etc/services为例,cat -n /etc/services可以查看文件的行号。

    每隔十行打印一行数据(比如打印第1行、第11行、第21行):先生成序列号然后查找特定行。

    (1)方法一:

    sed -n '1~10p' /etc/services查找特定行(通过cat -n /etc/services | sed -n '1~10p' 查看文件的行号)。

    (2)方法二:限定从1到51行内,sed方法

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #!/bin/bash  
    2. for n in `seq 1 10 51`  
    3. do  
    4.     sed -n "${n}p" /etc/services  
    5.     #cat -n  /etc/services | sed -n "${n}p"  
    6. done   

    (3)方法三:限定从1到51行内,生成序列方式不同

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #!/bin/bash  
    2. for((i=1; i<52; i=i+10))  
    3. do  
    4.     sed -n "${i}p" /etc/services  
    5.     #cat -n /etc/services | sed -n "${i}p"  
    6. done  

    (4)方法四:限定从1到51行内,awk方法

    awk '{if(NR%10==1 && NR >0 && NR < 51) printf $0" "}' /etc/services,

    通过cat -n /etc/services | awk '{if(NR%10==1 && NR >0 && NR < 51) printf $0" "}'查看文件的行号。


    三、总结

    (1)Shell脚本的三剑客(awk、sed和grep)的功能很强大,可以相互支持并相互转换。

    (2)多从实践中总结不同的方法,多了解他人的思路,有时他人的会更加简洁易懂并拓展了自己的视野。

    (3)多从网上找面试题,自己解答,然后对比答案,从痛苦中获取知识。

  • 相关阅读:
    一个奇怪的网页bug 竟然是局域网DNS搞的鬼
    繁体系统下如何快速将简体安装文件乱码恢复正常?
    Ubuntu16.04LTS国内快速源
    bitnami redmine版本由2.3.1升级至3.2.2过程
    Ubuntu1404安装gogs过程
    AJAX
    jQuery 事件解释
    安装phpMyadmi报错
    总结二
    总结
  • 原文地址:https://www.cnblogs.com/nb-blog/p/5780284.html
Copyright © 2020-2023  润新知