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、iOS、C、Java等编程技术的技巧经验分享