正则表达式, shell脚本

正则表达式, shell脚本

1.正则表达式
1、什么是正则表达式?
简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法。通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤、替换或者输出需要的字符串。linux正则表达式一般以行为单位处理的。
2、为什么要学正则表达式
在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要从大量的字符串内容中查找符合工作需要的特定字符串,这就要靠正则表达式,因此,可以说正则表达式就是为过滤这样字符串的需求而生的!
常用命令 grep(egrep) sed awk 或者正则表达式函数()
. 代表且只能代表任意一个字符(不包括空行)

  • 重复前面任意0个或多个字符
    .* 匹配所有字符。(包括空行)
    把前面正则匹配的括号内的结果,在后面用\1取出来操作。
    ^ 表示以什么开头,^bqh 以bqh开头
    $ 是以什么结尾
    ^$ 表示空行。
    \ 例. 就只代表点本身,转义符号,让有着特殊身份移动的字符,脱掉马甲,还原原型$
    ^.* 以任意多个字符开头。
    .$ 以任意多个字符结尾。
    (.
    ) 从第一字符匹配,到空格停止,
    [abc] 匹配字符集合内的任意一个字符【a-zA-Z】
    [^abc] 匹配不包括后的任意字符的内容;中括号里的为取反,注意和以…开头区别。
    a{n,m} 重复n到m次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线。
    {n,} 重复至少n次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线。
    {n} 重复n次,前一个重复的字符。如果有用egrep/sed -r 可以去掉斜线。
    ①^word 搜索以word开头的;vi ^ 一行的开够
    ②word$ 搜索以word结尾的;vi $ 一行的开头
    ③^$ 表示空行。
  • 重复一个或一个以上前面的字符
    ? 复0个或一个0前面的字符
    | 用或的方式查找多个符合的字符串
    () 找出“用户组”字符串
    ^ 匹配一行的开头,但依赖于上下文环境,可能在正则表达式中表示否定一个字符 集的意思
    […] 匹配集合中任意字符 如"[xyz]" 匹配字符 x, y, 或z
    [^…] 匹配不属集合 中 任意字符
    ^, $ 匹配 行首、行尾
    <, > 用于表示单词的边界。< 匹配词首,>词尾,如"<the>" 匹配单词"the"
    … 正则表达式分组。进行子字符串提取(substring extraction)一起使用很有用
    \n 第 n 个分组内容
    \ 转义(escapes) 一个特殊的字符,使这个字符表示原来字面上的意思。"$“表示 了原来的字面意思”$",而不是在正则表达式中表达的匹配行尾的意思."\“也被 解释成了字面上的意思”"
    { } 指示前面正则表达式匹配的次数.
    要转义是因为不转义的话大括号只是表示他们字面上的意思.这个用法只是技巧上 的而不是基本正则表达式的内容."[0-9]{5}" 精确匹配5个数字(从0到9的数字).
    | “或”,正则操作符用于匹配一组可选的字符
    {n} n是一个非负整数。匹配确定的n次。例如,’‘o{2}’’ 不能匹配 “Bob"中的’‘o’’,但是能匹配"food” 中的两个o。
    {n,} n是一个非负整数。至少匹配n次。例如,’‘o{2,}’’ 不能匹配"Bob"中的’o’’,但能匹配 "foooood"中的所有o。’‘o{1,}’‘等价于’‘o+’’。’‘o{0,}’‘则等价于’‘o*’’。
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,"o{1,3}"将匹配 “fooooood"中的前三个o。’‘o{0,1}’‘等价于’‘o?’’。请注意在逗号和两个数之间不能有空格。
    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如,’‘er\b’’ 可以匹配"never” 中的’‘er’’,但不能匹配 "verb"中的 ‘‘er’’。
    \B 匹配非单词边界。’‘er\B’‘能匹配"verb"中的’‘er’’,但不能匹配"never"中的 ‘‘er’’
    \w 匹配包括下划线的任何单词字符。等价于’’[A-Za-z0-9_]’’。
    \W 匹配任何非单词字符。等价于’’[^A-Za-z0-9_]’’。
    \d 匹配一个数字字符。等价于[0-9]。
    \D 匹配一个非数字字符。等价于[^0-9]。
    \f 匹配一个换页符。等价于\x0c和\cL。
    \n 匹配一个换行符。等价于\x0a和\cJ。
    \r 匹配一个回车符。等价于\x0d和\cM。
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
    \S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。
    \t 匹配一个制表符。等价于\x09 和 \cI。
    \v 匹配一个垂直制表符。等价于\x0b和\cK。
    一些常用的元字符就先介绍到这。
    awk
    在这里插入图片描述
    sed
    在这里插入图片描述
    Regex 正则函数
    标准的linux c与c++不支持正则表达式;
    以POSIX函数库中的Regex系列函数来说明在Linux c下如何使用正则表达式:
    1、编译正则表达式:
    Regcomp函数,生成regex_t数据结构;
    int Regcomp(regex_t *preg, const char *regex, int cflags);
    参数说明:
    preg:用来保存编译的结果;
    regex:字符串,表示被编译的正则表达式;
    cflags:编译开关控制细节;
    REG_EXTEND代表使用扩展正则表达式模式;
    REG_ICASE表示对规则中字符串不区分大小写;
    REG_NOSUB只检查是否有符合规则的子串

2、匹配正则表达式:
利用regcomp生成的数据结构regex_t *preg 调用regexec()函数完成模式匹配:
int regexec(
const regex_t *preg,
const char *string,
size_t match,
regmatch_t pmatch[],
int eflags
);
  typedef struct {
  regoff_t rm_so;
  regoff_t rm_eo;
  } regmatch_t;
参数说明:
preg:用来编译后的模式匹配数据结构regex_t 常量;
string:字符串,表示被匹配的字符串;
nmatch:被匹配的个数;() 括号数+1个 子匹配串+父匹配串
pmatch:匹配的结果数组;
rm_so 表示满足规则的子串在string中的起始偏移量
rm_eo 表示满足规则的子串在string中的后续偏移量
eflags:匹配的特性
REG_NOTBOL 是否是第一行
REG_NOTEOL 是否是最后一行
3、报告错误信息
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
参数说明:
errcode:来自regcomp及regexec函数的错误代码;
preg:regcomp编译结果;
errbuf:缓冲区的错误信息字符串;
errbuf_size:缓存区的错误信息字符串长度;
4、释放正则表达式:
void regfree(regex_t *preg);
无返回结果,释放regcomp编译的regex_t指针;

5、正则表达式框架:
int mymatch(char *buf)
{
const char regex = “href=”[^ >]"";
regex_t preg;
const size_t nmatch = 10;
regmatch_t pm[nmatch];
if ( regcomp(&preg, regex, 0) != 0) { /*编译正则表达式失败 */
perror(“regcomp”);
exit(1);
}
int z, i;
z = regexec(&preg, buf, nmatch, pm, 0);
if (z == REG_NOMATCH)/*无匹配项 */
{
return 0;
}
else/*有匹配的超链接 */
{
for (i = 0; i < nmatch && pm[i].rm_so != -1; ++i)/把超链接都提取出/
{
/对匹配链接的操作/
}

}
regfree(&preg);/*释放正则表达式*/

}
Shell
是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。
Shell 是如何连接用户和内核的?
Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?!
其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。
接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。
比如,我们都知道在 Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。
Shell 还能连接其它程序
在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。
Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。
大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。
可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。
Shell 也支持编程
Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,
也支持了基本的编程元素,例如:
if…else 选择结构,case…in 开关语句,for、while、until 循环;
变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。
站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。
Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。
Shell 是一种脚本语言
任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。
有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。
这个过程叫做编译(Compile)这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。
这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。
Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。
在这里插入图片描述
具体的内容在 http://c.biancheng.net/view/706.html 有详细介绍。(不过有一些是付费)

猜你喜欢

转载自blog.csdn.net/m0_46717588/article/details/113922443