### Shell 删除指定行上一行 在Shell脚本中,我们经常需要对文本文件进行操作,例如删除、替换或提取特定的行。对于删除指定行及其上一行的需求,可以通过结合使用`sed`命令来实现。根据提供的文件内容,下面将详细解释如何通过Shell脚本来删除包含特定模式(如“ServerName abc.com”)的行及其上一行。 #### 知识点一:理解题目需求 题目要求使用Shell脚本删除指定文件中包含“ServerName abc.com”的行及其上一行。这里的“指定行上一行”是指紧跟在含有特定模式的行之上的那一行。 #### 知识点二:`sed`命令基础介绍 `sed`(stream editor)是一个功能强大的流编辑器,可以用来执行基本的文本转换工作。它可以在一次读取一行的情况下处理文件,而无需将整个文件加载到内存中。这使得`sed`非常适合用于处理大型文件。 #### 知识点三:使用`sed`删除指定行及其上一行 1. **删除指定行**: - 使用`sed`的模式匹配功能找到包含特定模式的行。 - 使用`sed`的`d`命令来删除匹配的行。 2. **删除指定行的上一行**: - 需要使用`sed`的一些高级特性,比如地址范围和标签,以便识别并删除匹配行的上一行。 #### 知识点四:示例脚本解析 根据题目给出的部分内容,我们可以分析以下两个关键的`sed`命令: 1. **删除包含特定模式的行及其上一行**: ```bash sed -i -e:a -e '$!N; s/.*\n\(.*ServerName abc.com\)/\1/; ta' -e 'P; D' $file ``` - `-i`:表示对文件进行原地修改。 - `-e:a`:定义一个名为`a`的标签。 - `$!N`:如果不是最后一行,则读取下一行并将两行合并为一行。 - `s/.*\n\(.*ServerName abc.com\)/\1/`:匹配包含`ServerName abc.com`的行及其上一行,并用匹配的行替换它们。 - `ta`:如果发生了替换,则跳转到标签`a`,继续处理下一对行。 - `P; D`:打印当前行并删除它;如果没有发生替换,则只打印当前行。 2. **删除包含特定模式的行及其后至特定结束标记之间的所有行**: ```bash sed -i '/ServerName abc.com/,/\/VirtualHost/d' $file ``` - `/ServerName abc.com/,/\/VirtualHost/d`:从包含`ServerName abc.com`的行开始,到包含`/VirtualHost`的行结束的所有行都将被删除。 #### 知识点五:脚本完整示例 下面提供一个完整的脚本示例,用于删除包含特定模式的行及其上一行: ```bash #!/bin/sh # deletedomainfrom*.conf Dir="/usr/local/apache2/conf" cd $Dir # 处理每个.conf文件 ls *.conf | while read file; do # 检查文件是否包含目标模式 if [ $(grep -c 'ServerName abc.com' "$file") -gt 0 ]; then echo "Delete domain in this file: $Dir/$file" # 删除包含模式的行及其上一行 sed -i -e:a -e '$!N; s/.*\n\(.*ServerName abc.com\)/\1/; ta' -e 'P; D' "$file" # 删除从包含模式的行到/VirtualHost之间的所有行 sed -i '/ServerName abc.com/,/\/VirtualHost/d' "$file" else echo "======== No change for file: $file" fi done ``` #### 知识点六:注意事项 1. **文件权限**:确保Shell脚本具有适当的执行权限,并且脚本中涉及的文件是可写的。 2. **错误处理**:在实际应用中,应增加错误处理机制,比如检查文件是否存在等。 3. **性能考虑**:对于非常大的文件,可能需要考虑其他更高效的处理方式。 通过以上知识点的讲解,我们可以清晰地了解如何使用Shell脚本和`sed`命令来完成删除指定行及其上一行的任务。
有这么一个需求,需要从若干个apache虚机配置文件中删除一段内容,类似下面这种
<VirtualHost *>
ServerName abc.com
DocumentRoot /home/apache/abc
CustomLog logs/abc.com-access_log combined
</VirtualHost>
思路:以ServerName为中心,删除上面的一行,再删除从ServerName到</VirtualHost>之间的内容即可。
脚本如下:
#! /bin/sh
# by logo32.iteye.com
# delete domain from *.conf
Dir="/usr/local/apache2/conf"
cd $Dir
ls *.conf | while read file
do
con=`grep 'ServerName abc.com' $file | wc -l`
if [ $con -gt 0 ];then
echo "delete domain in this file : $Dir/$file"
sed -i -e :a -e '$!N;s/.*\n\(.*ServerName abc.com\)/\1/;ta' -e 'P;D' $file
sed -i '/ServerName abc.com/,/\/VirtualHost/d' $file
else
echo "======== no change for file : "$file
fi
done
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 此存储库收集了所有有趣的 Python 单行代码 欢迎随意提交你的代码!.zip
- 高考志愿智能推荐-JAVA-基于springBoot高考志愿智能推荐系统设计与实现
- 标准 Python 记录器的 Json 格式化程序.zip
- kernel-5.15-rc7.zip
- 来自我在 Udemy 上的完整 Python 课程的代码库 .zip
- 来自微软的免费 Edx 课程.zip
- c++小游戏猜数字(基础)
- 金铲铲S13双城之战自动拿牌助手
- x64dbg-development-2022-09-07-14-52.zip
- 多彩吉安红色旅游网站-JAVA-基于springBoot多彩吉安红色旅游网站的设计与实现