使用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
本文版权归作者(https://www.cnblogs.com/harrymore/)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可邮件(harrymore@126.com)咨询.