Shell脚本的编写,sed的使用以及一些正则表达式

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
posted @ 2015-03-30 22:49  Mark_Woo  阅读(1398)  评论(0编辑  收藏  举报