使用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
posted @ 2020-04-24 11:05  大师兄啊哈  阅读(2772)  评论(0编辑  收藏  举报