bash腳本大展神威

程序員小迷 2024-04-27 14:20:17

一、需求

有時有這樣的需求:在Linux中,一個文件中要刪除含有某字符串的一行及前後幾行,這時可以使用bash腳本進行解決。

二、代碼

#! /bin/bash

# 功能:刪除匹配某字符串的行,以及匹配行的前後幾行

# 參數1:要刪除的行中的字符串  參數2:也需要刪除的前幾行行數  參數3:也需要刪除的後幾行行數  參數4:文件名

deleteKeywordAndPreviousNextLines(){

# 要刪除的行中的字符串

keyword=$1

# 也需要刪除的前幾行行數

beforeLines=$2

# 也需要刪除的後幾行行數

afterLines=$3

# 文件名

filename=$4

# 獲取目標字符串行號

# grep命令提取匹配目標字符串所在行的行號與行的所有字符

# head命令取結果中的第一行

# awk命令提取第一列,即:行號

lineItem=$(grep -nE "$keyword" $filename | head -1 | awk -F ":" '{print$1}')

while [ -n $lineItem ]

do

echo "lineItem:${lineItem}"

# lineItem爲空時跳出循環,到達結尾,不再處理

if [ -z "$lineItem" ]

then

break

fi

# lineItem小于等于0時說明到達結尾,不再處理

if [ "$lineItem"  -le 0 ]

then

break

fi

# 要刪除的起始行

line_start=$(($lineItem-$beforeLines))

# 要刪除的結束行

line_end=$(($lineItem+$afterLines))

# 輸出要刪除的起止行號

echo "delete line:$line_start - $line_end"

# sed命令刪除文件filename中從line_start行到line_end行的數據

# -i代表直接操作文件

sed -i "$line_start,$line_end d" $filename

# 獲取目標字符串行號

# grep命令提取匹配目標字符串所在行的行號與行的所有字符

# head命令取結果中的第一行

# awk命令提取第一列,即:行號

lineItem=$(grep -nE "$keyword" $filename | head -1 | awk -F ":" '{print$1}')

done

}

# 調用函數

# 參數1:要刪除的行中的字符串  參數2:也需要刪除的前幾行行數  參數3:也需要刪除的後幾行行數  參數4:文件名

deleteKeywordAndPreviousNextLines "hello"  0 3 ./test.txt

# 引申

# 若需刪除匹配某字符串hello的行和匹配行的後2行,可以使用下面的腳本

sed -i '/hello/,+2d' ./test.txt

微風不燥,陽光正好,你就像風一樣經過這裏,願你停留的片刻溫暖舒心。

我是程序員小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們爲您提供幫助的最大動力。

歡迎關注。助您在編程路上越走越好!

0 阅读:8

程序員小迷

簡介:致力于Android、C等編程技術的技巧經驗分享