shell脚本及正则表达式

shell脚本的编写及正则表达式:

一、shell脚本的基本:

1.首先shell脚本到底是什么?

1)纯文本文档--文件中所存储的数据都是以字符为单位进行存储的;

2)根据用户的需求来解决用户问题的大量命令的组合体

3)“执行幂等性”——任何命令多次执行的结果是一致的

注意:很多命令都不具备“执行幂等性”,在shell脚本中就需要大量的程序逻辑来判断某个命令是否满足其运行条件,以避免在运行过程中出现严重错误。

2.脚本的基本代码内容:

1)首先我们可以利用文本编辑工具来编写shell脚本:

例如:Nano 、vi、Vim、emacs、pico

在这里我们推荐使用Vim,因为它具有语法着色,自动缩进等特性

脚本的命令方式:可以使用.sh的文件名为后缀;在低版本的Vim编辑器,只能根据.sh的后缀命令来识别是否为shell脚本,高版本的Vim编辑器,则无需过多的文件后缀名的问题;

2)shebang:首行必须是shebang,解释器路径,必须占据就对行首:在执行时,启动相应的解释器以解释脚本内诸多的命令

因为我们使用的shell为bash

#! /bin/bash

3) 在shell脚本中,除了shebang之外,所有以#开头的行都为注释行,解释器都会忽略这样的行的内容

例如:

# author:秦耀东

# type:基础练习

...

4)空白行:解释器会忽略脚本中所有的空白行;

5)大量的关键字和命令:if、else、then、do、while、for、...

6) bash中所有的特殊想字符

/// 注意:shell脚本一旦运行,是在当前的shell中根据shebang的指示,开启一个解释器(子shell)解释执行代码内容,shell脚本的内容是在一个子shell进程中实现的;

3.脚本的运行方法:

1)为脚本文件赋予执行权限,直接运行此文件:

~ ]#  chmod  +x /PATH/TO/SCRIPT_FILE

注意:如果在执行脚本时,只写脚本的名不写路径的话,必须确保PATH变量中保存的路径下,能够找到该文件;

2)直接使用解释器运行脚本,讲脚本作为解释器命令的参数;

bash /PATH/TO/SCRIPT_FILE

bash -x /PATH/TO/SCRIPT_FILE(将脚本的运行过程展示出来,一般用于脚本排错)

bash -n /PATH/TO/SCRIPT_FILE(对脚本进行语法排错,如果存在语法错误,则 bash会给予提示,针对于这类错误提示,,需要我们自行判断错误的发生位置)

二、正则表达式:

在学习正则表达式之前我们先来学习文本处理工具:

文本处理三剑客:

grep系:grep、egrep、fgrep,文本搜索工具,基于"PATTERN"对于给定的文本进行模糊搜索,grep系默认工作于贪婪模式下;

sed:Stream EDitor,流编辑器,行编辑器,文本编辑工具;

awk:gawk——GNU awk,文本格式化工具,文本报告生成器,文本处理的编程语言;

1.grep系:grep  egrep  fgrep

1:grep:默认仅支持基本正则表达式

全称为Global search Regular Expression and Print out the line.利用正则表达式进行全局搜索并将匹配的行显示出来;

1)grep [OPTIONS] PATTERN [FILE...]

////这里我们要介绍一下PATTERN,PATTERN是一种过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成;

正则表达式的元字符会被正则表达式引擎解释为特殊含义;

正则表达式的文本字符是指只具备字符表面含义的字符;

常用选项为:

-i, --ignore-case:忽略文本字符的大小写;

-v, --invert-match:反向匹配;最终显示的结果是PATTERN不能成功匹配的行;

-c, --count:计数,统计匹配PATTERN的所有的行数;

-o, --only-matching:关闭贪婪模式,仅显示PATTERN能够匹配的内容;

-q, --quiet, --silent:安静模式,不输出任何匹配结果;

--color[=WHEN], --colour[=WHEN]:将匹配PATTERN的内容以特殊颜色高亮显示;

--color=auto

-E, --extended-regexp:扩展的正则表达式,grep -E相当于egrep;

-F, --fixed-strings, --fixed-regexp:grep -F相当于fgrep

-G, --basic-regexp:基本的正则表达式,egrep -G相当于grep

-P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;

-A NUM, --after-context=NUM:在显示匹配PATTERN的行的同时显示其后面的NUM行;

-B NUM, --before-context=NUM:在显示匹配PATTERN的行的同时显示其前面的NUM行;

-C NUM, -NUM, --context=NUM:在显示匹配PATTERN的行的同时显示其前后各NUM行;

基本的正则表达式的元字符:

1) 字符匹配;

. :匹配任意单个字符;

[]:匹配指定范围内的任意单个字符;

[^]:匹配指定范围以外的任意单个字符;

下列所有的字符集都可以放置于[]之中用于匹配单个字符;

[:lower:]:所有小写的单个字符

[:upper:]:所有大写的字母

[:alpha:]:所有字母字符

[:digit:]:所有的十进制数字

[:space:]:所有的空白字符

[:alnum:]:表示所有的大小写字母以及十进制数字

[:punct:]:所有的标点符号

[:xdigit:]:所有的十六进制数字;

a-z:所有的小写字母

A-Z:所有的大写字母

0-9:标识所有的十进制数字

2)次数匹配

*:其前面的字符可以出现任意次(0次,1次或多次);

\?:其前面的字符可有可无(0次或1次);

\+:其前面的字符至少出现一次(1次或多次);

\{m\}:其前面的字符必须出现m次;

\{m,n\}:其前面的字符至少出现m次,至多出现n次;(m<n)

\{,n\}:其前面的字符至少出现0次,至多出现n次;

\{m,\}:其前面的字符至少出现m次,多多益善;

在正则表达式中,表示任意长度任意字符的方式:.*

位置锚定字符:

行锚定:

行首锚定:^

行尾锚定:$

字锚定:

字首锚定:\<或\b

字尾锚定:\>或\b

\b:旧版本中的锚定方法,建议不使用;

对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;

分组与引用字符:

\(PATTERN\):将此PATTERN所匹配到的所有字符当作一个不可分割的整体来处理

在正则表达式引擎之中,有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后向引用;这些变量依次是:\1, \2, \3, ...

pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

\1:pattern2

\2:pattern4

\3:pattern5

\1:第一组小括号中的pattern匹配到的字符;

\2:第二组小括号中的pattern匹配到的字符;

...

///// 例:请找出在/etc/passwd中用户的UID和GID相同的用户账户;

~]# grep ‘\(\<[[:digit:]]\+\>\).*\1‘ /etc/passwd

或:\|

注意:\|将其左右两边的字符串当作整体对待;

A\|american  :A或american

请找出ifconfig命令的执行结果中数值在100-255之间的整数;

第一位:1 2

第二位:0-90-4  5

第三位:0-90-9  0-5

ifconfig | grep ‘\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>‘

请找出ifconfig命令的执行结果中数值在0-255之间的整数;

2.grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

默认情况下,grep命令后面只允许有一个PATTERN;

如果想要在一次grep所搜过程中写多个PATTERN,则需要使用-e选项;每个-e选项只能使用一个PATTERN作为参数;

将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN;我们就可以使用-f FILE方式来实现多PATTERN匹配;

egrep:

egrep [OPTIONS] PATTERN [FILE...]

扩展的正则表达式元字符:

1) 字符匹配;

. :匹配任意单个字符;

[]:匹配指定范围内的任意单个字符;

[^]:匹配指定范围以外的任意单个字符;

下列所有的字符集都可以放置于[]之中用于匹配单个字符;

[:lower:]:所有小写的单个字符

[:upper:]:所有大写的字母

[:alpha:]:所有字母字符

[:digit:]:所有的十进制数字

[:space:]:所有的空白字符

[:alnum:]:表示所有的大小写字母以及十进制数字

[:punct:]:所有的标点符号

[:xdigit:]:所有的十六进制数字;

a-z:所有的小写字母

A-Z:所有的大写字母

0-9:标识所有的十进制数字

2)次数匹配

*:其前面的字符可以出现任意次(0次,1次或多次);

\?:其前面的字符可有可无(0次或1次);

\+:其前面的字符至少出现一次(1次或多次);

\{m\}:其前面的字符必须出现m次;

\{m,n\}:其前面的字符至少出现m次,至多出现n次;(m<n)

\{,n\}:其前面的字符至少出现0次,至多出现n次;

\{m,\}:其前面的字符至少出现m次,多多益善;

在正则表达式中,表示任意长度任意字符的方式:.*

位置锚定字符:

行锚定:

行首锚定:^

行尾锚定:$

字锚定:

字首锚定:\<或\b

字尾锚定:\>或\b

分组与引用字符:

\(PATTERN\):将此PATTERN所匹配到的所有字符当作一个不可分割的整体来处理

在正则表达式引擎之中,有一系列的内置变量,这些变量会保存所有分组内的字符信息,         用于后向引用;这些变量依次是:\1, \2, \3, ...

pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

\1:pattern2

\2:pattern4

\3:pattern5

\1:第一组小括号中的pattern匹配到的字符;

\2:第二组小括号中的pattern匹配到的字符;

...

///// 例:请找出在/etc/passwd中用户的UID和GID相同的用户账户;

~]# grep ‘\(\<[[:digit:]]\+\>\).*\1‘ /etc/passwd

或:\|

注意:\|将其左右两边的字符串当作整体对待;

A\|american  :A或american

fgrep:PATTERN中所有的字符都被当作文本字符来处理;

其他的文本处理命令:

wc:

wc [OPTION]... [FILE]...

-l:只显示行数

-w:只显示字数

-c:只显示字符数

cut:remove sections from each line of files

能够被cut命令修剪的文件,一般都是具有一定结构或格式的文本文档;/etc/passwd

cut OPTION... [FILE]...

-d, --delimiter=DELIM:指定在实施修剪操作时所依赖的分隔符,默认是空白字符;

-f, --fields=LIST:根据定义的分隔符来指定字段的编号;

地址定界使用方法:

#:选择被指定的单个字段;

#,#:离散的多个被指定的单个字段;

#-#:连续的多个被指定的字段;

--output-delimiter=STRING:指定输出分隔符;

awk:

awk -F "DELIMITER" ‘[/PATTERN/]{print $1,$2,...$NF}‘ FILE...

-F "DELIMITER":指定字段分隔符,默认为空白字符;

$1,$2,...,$NF:根据字段分隔符切割出来的文本片段都存放在相应的内部变量中;

sort:sort lines of text files,将文本文件按行继续排序,默认排序规则是按照ASCII表中的字符顺序进行,这个排序标准可修改;

-r, --reverse:逆序排序

-R, --random-sort:随机排序,这种随机算法是非常简陋的,不适用于复杂环境;

-u, --unique:重复出现的行,只保留一行;(连续且完全相同的行叫重复),祛重;

-n, --numeric-sort:以数字的数值大小进行排序;

-t, --field-separator=SEP:指定字段分隔符;

-k, --key=KEYDEF:指明根据哪个关键字段进行排序,一般和-t同时使用;

uniq:report or omit repeated lines

-d, --repeated:只显示重复出现的行,而且每一组重复行只显示一行;

-u, --unique:只显示不重复的行;

-c, --count:在每行以前缀的方式显示重复行的重复次数;

diff:compare files line by line

同一文件的不同修改版本;打补丁;

patch:apply changes to files

时间: 2024-09-30 14:09:35

shell脚本及正则表达式的相关文章

shell脚本之正则表达式(二)---sed工具

sed工具 sed是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除.替换.添加.移动等),最后输出所有行或者仅输出处理的某些行.sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务. sed工作流程 1.读取:sed 从输入流(文件.管道.标准输入)中读取一行内容并存储到临时的缓冲区中.2.执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命

linux学习笔记-第十二课-Shell脚本之正则表达式(一)

一.grep,egrep,fgrep 1)grep 格式:grep [选项] [模式] [文件名] 常用选项:-n:显示行号和匹配的行 -v:反向匹配 -c:不显示匹配的行,只显示匹配的行数 -i:忽略大小写 -r:递归搜索 -E:支持扩展正则表达式 -P:支持Perl正则表达式 -F:不支持正则表达式,将模式按字面意义匹配 示例: grep示例 说明 grep '\<Tom>\' file 显示包含单词Tom的行 grep 'Tom Jerry' file 显示包含'Tom Jerry'的行

shell脚本学习—正则表达式

正则表达式概念.特点 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤辑. 给定一个正则表达式和另一个字符串,我们可以达到如下的目的: 1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”): 2. 可以通过正则表达式,从字符串中获取我们想要的特定部分. 正则表达式的特点是: 1. 灵活性.逻辑性和功能性非常的强: 2. 可以迅速地用极简单的方式达到字符串的复杂控制. 3.

shell脚本之正则表达式(一)

正则表达式的定义 正则表达式又称正规表达式.常规表达式.正则表达式是由普通字符与元字符组成的文字模式.模式用于描述在搜索文本时要匹配的一个或多个字符串.正则表达式一般用于脚本编程与文本编辑器中.很多文本处理器与程序设计语言均支持正则表达式,在Linux 系统中常见的文本处理器如grep.egrep.sed.awk.正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本. 正则表达式用途 正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重

shell脚本之正则表达式

一.基础正则表达式实例:元字符总结:在Linux系统中常见的文件处理工具中grep和sed支持基础正则表达式. grep命令选项: -i:查找时不区分大小写: -v:查找时反向输出,如查找不包含某些字符的内容: -n:表示查找出结果后显示行号: 这三个选项可以结合使用,如"-in",查找时不区分大小写并显示行号.示例①: [[email protected] ~]# grep -n 'the' test.txt #查找test文件中包含字符"the"的行 #可以将选

shell脚本之正则表达式(四)---sort与uniq工具

sort 工具 sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序. sort 语法 sort [选项] 参数 sort常用选项 -f:忽略大小写 -b:忽略每行前面的空格 -M:按照月份进行排序 -n:按照数字进行排序 -r:反向排序 -u:表示相同的数据仅显示一行(去除不连续的重复) -t:指定分隔符,默认使用[Tab]键分隔 -o <输出文件>:将排序后的结果转存至指定文件 -k:指定排序区域 范例演示 将/etc/passwd 文件中第三列进行排序,并将

shell脚本正则表达式三剑客之一(grep,egrep)

Shell脚本之正则表达式 一.正则表达式三剑客之一:grep 1.学习正则表达式前我们拿一个无用的配置文件作为测试练习 [[email protected] ~]# vim chen.txt #version=DEVEL System authorization information auth --enableshadow --passalgo=sha512# Use CDROM installation media cdrom thethethe THE THEASDHAS Use gra

#7 shell脚本编程之正则表达式

多命令执行方法: 脚本组成: 1.shengbang 2.# 3.空白行--没有任何内容的行.只包含空白字符或制表符(TAB) 4.逻辑判断 shell脚本编程: 1.加执行权限,通过路径来调用脚本: 2.利用解释器直接执行: 本文处理工具: vim.vi.nano 文本处理三剑客: grep系: grep.egrep.fgrep,文本搜索工具,基础"pattern"对于给定的文本进行模糊搜索,grep系默认工作于贪婪模式下: sed:stream editor,流数据器,行编辑器,文

正则表达式和Shell脚本。

正则表达式分两类:基本正则表达式:BRE扩展正则表达式:EREgrep -E, egrep正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块PCRE元字符分类:字符匹配.匹配次数.位置锚定.分组 基本正则表达式元字符字符匹配:. 匹配任意单个字符[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z][^] 匹配指定范围外的任意单个字符[:alnum:] 字母和数字[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z[:lower:]