本文主要是介绍bash脚本大展神威,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、需求
有时有这样的需求:在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 ]doecho "lineItem:${lineItem}"# lineItem为空时跳出循环,到达结尾,不再处理if [ -z "$lineItem" ]thenbreakfi# lineItem小于等于0时说明到达结尾,不再处理if [ "$lineItem" -le 0 ]thenbreakfi# 要删除的起始行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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!
这篇关于bash脚本大展神威的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!