bash脚本大展神威

158 阅读2分钟

一、需求

有时有这样的需求:在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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!