Shell脚本的简单编写以及sed的使用

标签(空格分隔): 博客文章


前一阵子为了批量修改Web审计规则,故编写了一个Shell脚本,顺便使用了下sed,顺便把正则表达式也重新学习一遍,感觉还是需要总结下,不然对不起自己。


Shell

  1. 变量
  • shell的变量很弱,无需定义任何类型,
  • 变量在赋值时,等号=两边必须不留任何空格
  • 变量在使用时可以使用$开头使用
  1. if条件判断

    首先看代码
    if [ ! -e "$website_dir" -o ! -e "$weblogin_dir" ]
    then
    echo "$website_dir 不存在"
    echo "$weblogin_dir 不存在"
    else
    ...
    fi
  • 这里需要重点指出一些格式问题,初学者比较容易碰到的,if,then,else必须单独一行,如果想同一行请用;隔开,不然会报错,再者,if后面的条件框[],在两端必须留有空格,每次一个判断选项,和一个逻辑符号之间必须留一个空格,最后fi结尾
  • if条件中的各种选项可以从其他搜索引擎中找到
  1. 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方式替换CONTENTREFERER=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的使用以及一些正则表达式的更多相关文章

  1. 工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

    一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello ...

  2. Shell脚本的编写及测试

                                                      Shell脚本的编写及测试 1.1问题 本例要求两个简单的Shell脚本程序,任务目标如下: 编写一 ...

  3. Shell脚本学习之sed详解

    在编写shell脚本的过程中,我们经常需要使用sed流编辑器和awk对文本文件进行处理. 一.什么是sed? sed 是一种在线编辑器,它一次处理一行内容.sed是非交互式的编辑器.它不会修改文件,除 ...

  4. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  5. shell 脚本的编写

    创建一个shell文件 1. 创建一个.sh文件 2. 文件第一行声明shell编译器路径  #!/bin/bash 3. 修改文件权限 chmod 777 文件名    或  /bin/bash  ...

  6. Linux | Shell脚本的编写

    Shell 脚本的介绍 Shell脚本通过Shell终端解释器当作人与计算机硬件之间的翻译官,用户可以通过它执行各种命令,不仅有简单的,还有复杂的,比如:判断.循环.分支等这些高级编程中才有的特性.S ...

  7. shell脚本三剑客之sed

    shell脚本之sed命令 1.概述 2.工作流程 3.命令格式 4.具体操作 1.概述: 1.sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 2.sed编辑器 ...

  8. shell脚本基础编写

    shell脚本的格式 名称:Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将 .sh 后缀加上,以表示是一个脚本文件. shell 脚本中一般会出现三种不同的元素: 第一行的脚 ...

  9. shell脚本之使用sed和awk进行文本处理

    Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义.针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助.此篇文档作用就是在 ...

随机推荐

  1. Eigen3的安装

  2. 自欺欺人的使用 NSTimer 销毁

    自欺欺人的使用 NSTimer 销毁 Demo地址 1.NSTimer是要加到runloop中才会起作用. 常见的创建timer方式 // 第一种方式 @property (nonatomic , s ...

  3. 【HEVC帧间预测论文】P1.5 Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule

    Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule <HEVC标准介绍.HEVC帧间预测论文笔记&g ...

  4. FPGA编程技巧系列之按键边沿检测

    抖动的产生: 通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开.因而在闭合及断开的瞬间均伴随有一连串的 ...

  5. (转)使用CGLIB实现AOP功能与AOP概念解释

    http://blog.csdn.net/yerenyuan_pku/article/details/52864395 使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个 ...

  6. 清空表单方法 清空变量 iview modal

    方法一 通过json序列号和反序列号 清空一次数据 数据需要copy出来一份 orgFormClearAllInput () { this.$refs.n1.formValidate = JSON.p ...

  7. Keil Debug (printf) Viewer

    Debug (printf) Viewer Home » µVision Windows » Debug (printf) Viewer The Debug (printf) Viewer windo ...

  8. 暑假集训 || 树DP

    树上DP通常用到dfs https://www.cnblogs.com/mhpp/p/6628548.html POJ 2342 相邻两点不能同时被选 经典题 f[0][u]表示不选u的情况数,此时v ...

  9. Linux常用命令大全2

    Linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器.内存.驱动.键盘.鼠标,还是用户等都是文件,Linux命令是它正常运行的核心.接下来,就来看看xp系统下载编辑 ...

  10. Java编程:常见问题汇总

    每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般没有什么大问题,但是最好别这样做. AD: 每天在写Java程序,其实里面有一些细节大家可 ...