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
  • 相关阅读:
    scss的初级学习随笔小计
    trimpash实现jd选项卡首次输入
    透明度动画
    js原生动画一匀速动画
    filter滤镜的使用
    scss实现不同方向的三角
    模板方法模式-考题抄错,会做也白搭
    设计模式概述
    mysql数据库
    夜饮东坡醒复醉
  • 原文地址:https://www.cnblogs.com/harrymore/p/12766055.html
Copyright © 2011-2022 走看看