使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM