zoukankan      html  css  js  c++  java
  • 使用bash脚本删除文件最后几行

    1. 基本思路

    使用wc获取文件的行数,并数出开始删除的行号,然后使用sed进行删除。

    sed删除基本命令:

    sed -i "${n1},${n2}d" filename

    其中-i参数是表示直接修改读取的文件内容,而不是输出到终端。

    ${n1},${n2}部分对应sed的地址匹配,都是整数,是具体的行号,表示匹配n1到n2行。

    d表示删除命令。

    具体sed的教程可以参考:sed原理及使用


    2. 实现与验证

    新建脚本test.sh并增加执行权限:

    #!/bin/bash
    set -x
    line=$1
    
    # 新建测试文件
    cat > cc <<EOF
    1
    2
    3
    4
    5
    6
    7
    EOF
    
    echo "before deleting"
    cat cc
    
    # 计算需要删除的起始行:文件总行数-需要删除的行数+1
    count=$(wc -l cc | awk '{print $1}')
    # 验证行数是否正确
    if [ $line -gt $count ]
    then
        echo "too much lines"
        exit
    fi
    from=$(($count-$line+1))
    echo "all lines:$count, you want delete:$line, from:$from"
    
    sed -i "${from},$d" cc
    
    echo "after deleting:"
    cat cc


    验证:

    ./test.sh 3
    输出:
    + line=3
    + cat
    + echo 'before deleting'
    before deleting
    + cat cc
    1
    2
    3
    4
    5
    6
    7
    ++ wc -l cc
    ++ awk '{print $1}'
    + count=7
    + '[' 3 -gt 7 ']'
    + from=5
    + echo 'all lines:7, you want delete:3, from:5'
    all lines:7, you want delete:3, from:5
    + sed -i '5,$d' cc
    + echo 'after deleting:'
    after deleting:
    + cat cc
    1
    2
    3
    4

    开启了调试,可以看出具体的输出情况,最后正常删除了最后三行,如果删除的行数超过文件的行数则不删除:

    ./test.sh 30
    输出:
    + line=30
    + cat
    + echo 'before deleting'
    before deleting
    + cat cc
    1
    2
    3
    4
    5
    6
    7
    ++ wc -l cc
    ++ awk '{print $1}'
    + count=7
    + '[' 30 -gt 7 ']'
    + echo 'too much lines'
    too much lines
    + exit
  • 相关阅读:
    贴一段微博上的小知识
    关于编译Qt以及驱动的一点总结吧
    一些服务器客户端的c例子
    android中DatePicker和TimePicker的使用
    Python标准库string模块《未完待续》
    Qt: SQL Programming
    和一个坑爹的项目组的经历
    linux一些杂项整理
    Qt中的QTableWidget
    Linux c学习进程基础学习
  • 原文地址:https://www.cnblogs.com/harrymore/p/12766055.html
Copyright © 2011-2022 走看看