189 8069 5689

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\}:其前面的字符至少出现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\}:其前面的字符至少出现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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:shell脚本及正则表达式-创新互联
标题网址:http://cdxtjz.cn/article/ghhii.html

其他资讯