shell编程1

Posted anthea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程1相关的知识,希望对你有一定的参考价值。

 

一、正则表达式

  正则表达式和通配符的区别:

    正则表达式是用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名。

1、基础正则表达式

 *   前一个字符匹配0次或任意多次    例如:grep "aa*" test.txt  在test.txt文档中匹配包含a的行,grep "aaaa*" test.txt  至少包含3个a

 .   匹配除了换行符外的任意一个字符  例如:grep “s..d” test.txt  匹配文件中的said,sood等任意字符    说明:“.*”表示匹配所有内容

 ^   匹配行首。例如:^hello会匹配以hello开头的行

 $   匹配行尾。例如:hello$会匹配以hello结尾的行    说明:"^$" 匹配空白行,去除空白行 grep -v "^$"

 []   匹配括号中指定的任意一个字符,只匹配一个字符。如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字母和一位数字构成的两位字符。

 [^ ]   匹配除括号中的字符以外的任意一个字符,例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字母

     转义符

 {n}  表示其前面的字符恰好出现n次。例如:[0-9]{4}匹配4位数字,[1][3-8][0-9]{9}匹配手机号码

 {n,}  表示其前面的字符出现不小于n次。

 {n,m} 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]{6,8}匹配6到8位的小写字母 

2、扩展正则表达式(不常用) 

 +:前一个字符匹配1次或任意多次。例如:“go+gle”会匹配“gogle”、“google”等,当然如果“o”有更多个,也能匹配

 ?:前一个字符匹配0次或1次。例如:“colou?r”可以匹配“colour”或“color”

 |:匹配两个或多个分支选择。例如:”was|his“会匹配既包含”was“的行,也匹配包含”his“的行

 ():匹配其整体为一个字符,即模式单元。可以理解为由多个单个字符组成的大字符。如:“(dog)+”会匹配“dog”、“dogdog”、“dogdogdog”等,因为被()包含的字符会当成一个整体。但“hello (world|earth)”会匹配“hello world”及“hello earth”

3、正则实例:

  匹配邮箱(sc@163.com):

    [0-9a-zA-Z_]+@[0-9a-zA-Z_]+(.[0-9a-zA-Z_]+)(1,3) 

    解释:

      [0-9a-zA-Z_]  表示数字、小写字母、大写字母或者_中的任意字符

      +       前一个字符匹配1次或任意多次

      .          将.转成普通字符串

 

  IP地址匹配:

    “^(([0-9].)|([1-9][0-9].)|(1[0-9][0-9].)|(2[0-4][0-9].)|(25[0-5].)){3}(([0-9].)|([1-9][0-9].)|(1[0-9][0-9].)|(2[0-4][0-9].)|(25[0-5].))$”

4、字符串截取和替换命令

(1)cut列提取命令

    cut [选项] 文件名

  选项:

    -f 列号:提取第几列

    -d 分隔符:按照指定分隔符分割列

    -c 字符范围(了解):不依赖分隔符来区分列,而是通过字符范围(行首为0)来进行字段提取。

              “n-”表示从第n个字符到行尾,“n-m”从第n个字符到第m个字符,“-m”表示从第1个字符到第m个字符。

    注意:cut命令的默认分割符是制表符,及“tab”键,不支持空格。

 

  举例:提取第几列的内容

  技术图片

 

  若要提取多列,只要列号直接用”,“分开:

    cut -f 2,3 student.txt 

  指定分隔符:

    cut -d ":" -f 1,3 student.txt  

    以“:”作为分隔符,提取student.txt文件的第一列和第三列。

(2)printf格式化输出

    printf ‘输出类型输出格式‘ 输出内容

  输出类型:

    %ns:输出字符串。n是数字指代输出几个字符

    %ni:输出整数。n是数字指代输出几个数字

    %m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。

  输出格式:

     :换行

     :回车,也就是Enter键

     :水平输出退格键,也就是Tab键

    v:垂直输出退格键,也就是Tab键

    技术图片

    使用printf命令输出文件内容

   技术图片

    会发现很乱,不是我们想要的。

  printf命令,需要制定输出格式。若不指定输出格式,则会把所有输出内容连在一起输出。

  技术图片

    如果不想把成绩当成字符串输出,而是按照整型和浮点型输出,则如下这样:

  技术图片

    这里报错是因为第一行不支持整型输出,没关系,后面再介绍。

(3)awk基本使用

    awk ‘条件1{动作1} 条件2{动作2}...‘ 文件名

   条件:

      技术图片

     动作:

      格式化输出

      流程控制语句

   举例:

       技术图片

       技术图片

      技术图片

      如果第二字段中输入包含有“Sc”字符,则打印第六字段数据:

        技术图片

        注意:在awk中,使用"//"包含的字符串,awk命令才会查找。

      技术图片

  awk内置变量:

      技术图片

  举例:

    cat /etc/passwd |grep "/bin/bash" | awk ‘BEGIN{FS=":"} {printf $1 " " $3 " 行号: " NR " 字段数: " NF " "}‘

    {开始执行{分隔符是“:”} {输出第一字段和第三字段 输出行号(NR值)字段数(NF值)}             技术图片

 

以上是关于shell编程1的主要内容,如果未能解决你的问题,请参考以下文章

shell编程

Shell编程规范与变量

Shell编程入门

Shell脚本------编程规范与变量

shell的编程结构体

Linux编程 12 (默认shell环境变量, PATH变量重要讲解)