Shell脚本的编写,sed的使用以及一些正则表达式
Shell脚本的简单编写以及sed的使用
标签(空格分隔): 博客文章
前一阵子为了批量修改Web审计规则,故编写了一个Shell
脚本,顺便使用了下sed
,顺便把正则表达式
也重新学习一遍,感觉还是需要总结下,不然对不起自己。
Shell
- 变量
- shell的变量很弱,无需定义任何类型,
- 变量在赋值时,等号
=
两边必须不留任何空格
, - 变量在使用时可以使用
$
开头使用
- if条件判断
首先看代码if [ ! -e "$website_dir" -o ! -e "$weblogin_dir" ]
then
echo "$website_dir 不存在"
echo "$weblogin_dir 不存在"
else
...
fi
- 这里需要重点指出一些格式问题,初学者比较容易碰到的,
if
,then
,else
必须单独一行,如果想同一行请用;
隔开,不然会报错,再者,if
后面的条件框[]
,在两端必须留有空格,每次一个判断选项,和一个逻辑符号之间必须留一个空格,最后fi
结尾 if
条件中的各种选项可以从其他搜索引擎中找到
- case条件选择
case $1 in
replace)
...
exit 1;;
restore)
...
exit 1;;
*)
echo "replace: 备份现有规则文件并替换规则文件"
echo "restore: 恢复规则文件";;
esac
$1
指的是选择运行时的第一个输入参数,这里的输入参数指在terminal中输出的,这里固定$0:运行脚本本本身文件名
,$1:为其后的第一个参数
Sed
Sed简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。sed适合进行文本行的处理
结合实例使用
首先sed的使用格式网络上都有比我详细的教程,各位可以随意google,这里我只专门将下我实际中遇到的一些比较棘手的问题
sed -i "/^[^#SUB].*WEBFORUM_/{s/\(.*\)CONTENT/\1REFERER=H24@P(7::),CONTENT/g}" $website_dir
- 这条语句的功能是:在一个文本行中,找到包含WEBFORUM但是不以
#
,S
,U
,B
开头的文本行,r然后通过正则表达式中的backreferences方式替换CONTENT
为REFERER=H24@P(7::)
。这条语句中sed
后面的-i
选项表示在当前文本中替换,{s/.../g}
这里加括号的意思表示这里是一条单独的sed语句,实际上整条规则去掉{}
也是正确的,这里这样写是为了查看方便理解语义 {s/\(.*\)CONTENT/\1REFERER=H24@P(7::),CONTENT
在这条正则表达式中,\(.*\)
表示任意文本,\1
表示替换第一个匹配的文本(即CONTENT),具体backreferences的使用请参考_Classic Shell Scripting_的_Regular Expressions_章节
sed -i "/^[^#SUB].*WEBFORUM_/{s/$/;[COMPOSE]=URL=REFERER/g}" $website_dir
sed -i "s/^M//g" $website_dir
- 这条语句的功能是:在一个文本行中,找到包含WEBFORUM但是不以
#
,S
,U
,B
开头的文本行,在行末尾添加;[COMPOSE]=URL=REFERER
,$
在这里表示行尾,这里有一个值得注意的问题,当只执行第一句时,末尾结束时会多出一个^M
符号,这个是在windows
下的一个换行符,由于拷贝过程中经过了windows
,所以这个符号就存在了,但是这个符号会影响这个规则文件的解析,所以必须去掉
完整代码
- 由于涉及到一些比较敏感的东西,路径一律用
xxx
来表示
#########################################################################
# File Name: replace_web_site_rule.sh
# Author: MarkWoo
# mail: wcgwuxinwei@gmail.com
# Created Time: 2015年03月24日 星期二 09时59分58秒
#########################################################################
#!/bin/bash
website_dir='XXX/WebSite.rc'
backup_website_dir='XXX/WebSite.rc.bak'
weblogin_dir='XXX/weblogin_site.rc'
backup_weblogin_dir='XXX/weblogin_site.rc.bak'
if [ ! -e "$website_dir" -o ! -e "$weblogin_dir" ]
then
echo "$website_dir 不存在"
echo "$weblogin_dir 不存在"
else
case $1 in
replace)
echo "正在备份原规则文件"
touch $backup_website_dir
touch $backup_weblogin_dir
cat $website_dir > $backup_website_dir
cat $weblogin_dir > $backup_weblogin_dir
echo "正在进行规则替换"
sed -i "/^[^#SUB].*WEBFORUM_/{s/\(.*\)CONTENT/\1REFERER=H24@P(7::),CONTENT/g}" $website_dir
sed -i "/^[^#SUB].*WEBFORUM_/{s/$/;[COMPOSE]=URL=REFERER/g}" $website_dir
sed -i "s/^M//g" $website_dir
sed -i "/^[^#SUB].*WEBFORUM_/{s/\(.*\)CONTENT/\1REFERER=H24@P(7::),CONTENT/g}" $weblogin_dir
sed -i "/^[^#SUB].*WEBFORUM_/{s/$/;[COMPOSE]=URL=REFERER/g}" $weblogin_dir
sed -i "s/^M//g" $weblogin_dir
exit 1;;
restore)
if [ ! -e "$backup_website_dir" -o ! -e "$backup_weblogin_dir" ]
then
echo "找不到备份文件"
else
echo "正在恢复原始规则文件"
cat $backup_website_dir > $website_dir
cat $backup_weblogin_dir > $weblogin_dir
fi
exit 1;;
*)
echo "replace: 备份现有规则文件并替换规则文件"
echo "restore: 恢复规则文件";;
esac
fi
最后的总结
首先正则表达式
是一个很强大的工具,对于有规律的文本要进行处理,这个是个极好的辅助工具,sed对于一行一行的文本处理极为方便
参考资料
- Classic Shell Scripting, Aronld Robbins, Nelson H.F.Beebe O'REILLY Media,Inc
Shell脚本的编写,sed的使用以及一些正则表达式的更多相关文章
- 工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本
一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello ...
- Shell脚本的编写及测试
Shell脚本的编写及测试 1.1问题 本例要求两个简单的Shell脚本程序,任务目标如下: 编写一 ...
- Shell脚本学习之sed详解
在编写shell脚本的过程中,我们经常需要使用sed流编辑器和awk对文本文件进行处理. 一.什么是sed? sed 是一种在线编辑器,它一次处理一行内容.sed是非交互式的编辑器.它不会修改文件,除 ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- shell 脚本的编写
创建一个shell文件 1. 创建一个.sh文件 2. 文件第一行声明shell编译器路径 #!/bin/bash 3. 修改文件权限 chmod 777 文件名 或 /bin/bash ...
- Linux | Shell脚本的编写
Shell 脚本的介绍 Shell脚本通过Shell终端解释器当作人与计算机硬件之间的翻译官,用户可以通过它执行各种命令,不仅有简单的,还有复杂的,比如:判断.循环.分支等这些高级编程中才有的特性.S ...
- shell脚本三剑客之sed
shell脚本之sed命令 1.概述 2.工作流程 3.命令格式 4.具体操作 1.概述: 1.sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 2.sed编辑器 ...
- shell脚本基础编写
shell脚本的格式 名称:Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将 .sh 后缀加上,以表示是一个脚本文件. shell 脚本中一般会出现三种不同的元素: 第一行的脚 ...
- shell脚本之使用sed和awk进行文本处理
Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义.针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助.此篇文档作用就是在 ...
随机推荐
- jQuery中面向对象思想实现盒子内容切换
这里主要是模拟小米官网中的首页的内容模块实现的主要动态效果 布局:采用了bootstrap框架进行布局,及其其中的字体图标 html: <!-- 内容 --> <div class= ...
- 如何查看安装的java是32位的,还是64位的
命令 java -d32 -version 或者 java -d64 -version
- codevs 5438 zbd之难题(水题日常)
时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description zbd想要一个计算器,请你编一个计算器. 输入描述 Input Descrip ...
- COGS 1. 加法问题 (水体日常)
这是一个经典的入门问题,通过此问题,你可以学会如何使用该评测系统. [问题描述] 现在有两个实数,分别是A和B.请你从文件中读取A和B,计算它们的和A+B,并把它输出到文件中.(保留到整数) [输入格 ...
- [Github筆記] 清除所有 Commit 紀錄
# 把原來的 git 移除掉 sudo rm .git -r # 初始化 git init git remote add origin https://github.com/username/repo ...
- 升级或者重装Discuz! 版本后 QQ互联英文乱码显示的正确解决方法
升级Discuz! X3版本QQ互联英文乱码!connect_viewthread_share_to_qq! 目前Discuz!论坛上 最简单的解决方法: 第一步:后台----->站长---- ...
- postman的关联,即如何在请求中引用上次请求返回的值
做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...
- C-基础:C语言为什么不做数组下标越界检查
//这段代码运行有可能不报错.]; ;i<;i++) { a[i]=i; } 1.为了提高运行效率,不检查数组下表越界,程序就可以跑得快.因为C语言并不是一个快速开发语言,它要求开发人员保证所有 ...
- mosquitto linux部署
1:官网下载 https://mosquitto.org/files/source/ 本文使用的是mosquitto-1.5.tar.gz 2:解压mosquitto-1.5.tar.gz tar - ...
- No-2.常用 Linux 命令的基本使用
常用 Linux 命令的基本使用 01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作.文件存取.目录操作.进程管理.文件权限 设定等 在 ...