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. Implicit Animations 默认动画 读书笔记

    Implicit Animations  默认动画 读书笔记 Do what I mean, not what I say. Edna Krabappel, The Simpsons   Part I ...

  2. java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()

    原因:hibernate-jpa-2.0-api-1.0.0.Final.jar.ejb3-persistence.jar中的javax.persistence与javaEE 5 Librares中的 ...

  3. transform、transition 和 animation区别

    CSS3中和动画有关的属性有三个 transform.transition 和 animation.下面来一一说明:        transform   从字面来看transform的释义为改变,使 ...

  4. COGS 2111. [NOIP2015普及]扫雷游戏

    ★   输入文件:2015mine.in   输出文件:2015mine.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 扫雷游戏是一款十分经典的单机小游戏.在 n 行 ...

  5. MFC技术积累——基于MFC对话框类的那些事儿5

    4. 菜单 4.1 弹出菜单 本节主要讲解如何在主对话框的指定区域内通过鼠标右击来弹出一个菜单选项.最终效果图如图4.1. 如图4.1鼠标只能在指定区域(图中深色区域)内右击时弹出菜单,在指定区域外点 ...

  6. css-test

    transition-content See the Pen NLOgVR by nakata139@gmail.com (@deepblue1982) on CodePen.

  7. Windows下使用python库 curses遇到错误消息的解决方案

    在Windows系统下执行python应用时,有时会遇到错误信息: ModuleNotFoundError: No module named '_curses'. 然而查看Windows系统里pyth ...

  8. [转] 学习,思维三部曲:WHAT、HOW、WHY(通过现象看本质)

    https://www.douban.com/note/284947308/?type=like 学习技术的三部曲:WHAT HOW WHY 我把学习归类为三个步骤:What.How.Why.经过我对 ...

  9. uva1611 Crane

    类似煎饼,先把1放到1,之后是子问题   (先放到前一半,再放到开头,两次操作)(任何位置,最多一次就可以放到前一半)) #include<iostream> #include<ve ...

  10. python调用aapt工具直接获取包名和tagertSdkversion

    背景: 每次海外游戏上架都需要符合google的上架规则,其中适配方面tagetSdkversion有硬性要求,比如需要适配安卓q就需要tagetSdkversion达到28,水平太渣的我每次调用aa ...