正则表达式与文件格式化处理

一、基础正则表达式

  1、语系对正则表达式的影响

    由于语系的编码数据并不相同,所以就会造成数据选取结果的区别。举例来说, 在英文大小写的编码顺序中,zh_CN.big5及C这两种语系的输出结果分别如下:

      LANG=C时,0 1 2 ...A B C ... Z a b c...z

      LANG=zh_CN时, 0 1 2...a A b B c C ... z Z

    特殊符号表:

 

特殊符号 代表意义
[:alnum:] 代表英文大小写字符及数字, 即0-9,A-Z, a-z
[:alpha:] 代表任何英文大小写字符,即A-Z,a-z
[:blank:] 代表空格键与【tab】
[:cntrl:] 代表键盘上面的控制按键,即包括CR,LF,Tab,Del等
[:digit:] 代表数字而已,即0-9
[:graph:] 除了空格符(空格键与【Tab】按键)外的其他所有按键
[:lower:] 代表小写字符, 即a-z
[:print:] 代表任何可以被打印出来的字符
[:punct:] 代表标点符号(punctuation symbol), 即" ' ?!; : #$
[:upper:] 代表大写字符,即A-Z
[:space:] 任何会产生空白的字符,包括空格键【Tab】CR等
[:xdigit:] 代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符

   2、grep的一些高级参数

     grep [-A] [-B] [--color==auto] ‘搜寻字符串’ filename

    -A: 后面可加数字,为after的意思,出了列出该行外, 后续的n行也列出来

    -B: 后面可加数字,为befer的意思,出了列出该行外,前面的n行也列出来

   

  注: ^在[]内代表“反向选择”, 在[]之外代表定位在行首的意义。

  .(小数点): 代表一定有一个任意字符的意思

  *(星号)‘:代表重复前一个0到无穷多次的意思, 为组合形态

  “.*”: 代表零个或多个任意字符的意思。

  限定连续RE字符范围{}:

      因为{与}的符号在shell是有特殊意义的,因此我们必须用转义字符

      如: grep -n 'o\{2\}' regular_express.txt    找到两个o的字符串

 

    3、基础正则表达式字符(characters)

RE字符 意义
^word 待查找的字符串(word)在行首
word$ 将查找的字符串(word)在行尾
. 代表一定有一个任意字符的字符
\ 转义字符,将特殊符号得特殊意义去除
* 重复零个到无穷多个的前一个字符
[list] 从字符集合的RE字符里面找出想要选取的字符
[n1-n2] 从字符集合的RE字符里面找出想要选取的字符范围
[^list] 从字符集合的RE字符里面找出不要的字符串或范围
\{n,m\} 连续n到m个的前一个RE字符, 若为\{n\}则是连续n个的前一个RE字符, 若为\{n,\}则是连续n个以上的前一个RE字符

 

二、sed工具

      sed本身也是一个管道命令,可以分析standard input的, 而且sed还可以将数据进行替换、删除、新增、选取特定行等的功能

      sed [-nefr] [动作]

      参数: 

        -n: 使用安静(silent)模式。在一般sed的用法中, 所有来自STDIN的数据一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者操作)才会被列出来

        -e:直接在命令行模式上进行sed的动作编辑

        -f: 直接将sed的动作写在一个文件内, -f filename则可以执行filename内的sed动作

        -r: sed的动作支持的是扩展型正则表达式的语法

        -i: 直接修改读取的文件内容,而不是由屏幕输出。

      动作说明:[n1] [,n2] function

      n1,n2 : 不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则“10,20[动作行为]”

      function有下面这些参数:

        a: 新增,a的后面可以接字符串, 而这些字符串会在新的一行出现(目前的下一行)

        c: 替换,c的后面可以接字符串, 这些字符串可以替换n1,n2之间的行

        d: 删除,后面通常不接任何参数

          i: 插入, i 的后面可以接字符串, 而这些字符串会在新的一行出现(目前的上一行)

        p: 打印, 也就是将某个选择的数据打印出来。通常p会与参数sed -n一起运行

        s: 替换,可以直接进行替换的工作。通常这个s的动作可以搭配正则表达式!

 

   sed的几个功能:

    a、以行为单位的新增/删除功能

    b、以行为单位的替换与显示功能

    c、部分数据的查找并替换的功能

        除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换的功能。基本行sed的查找与替换的与vi相当类似,它有点像这样:

        sed 's//要被替换的字符串/新的字符串g'

     d、直接修改文件内容(危险操作)

      sed甚至可以直接修改文件的内容,而不必使用管道命令或数据流重定向。

        例: sed -i 's/\.$/\!/g' regular_express.txt

      sed的“-i”参数可以直接修改文件内容

 

三、扩展正则表达式

    grep默认仅支持基础正则表达式,如果要使用扩展型正则表达式,可以使用grep -E 不过建议直接使用egrep

 RE字符 意义与范例 
 +

意义:重复一个或一个以上的前一个RE字符

范例:查找(god)(good)(goood)等的字符串。那个o+代表一个以上的o,:

  egrep -n 'go+d' regular_express.txt

 ?

意义:零个或一个的前一个RE字符

范例: 查找gd或god这两个字符串:

  egrep -n 'go?d' regular_express.txt

 |

意义: 用或(or)的方式找出数个字符串

范例:查找gd或good这两个字符串

egrep -n 'gd|good' regular_express.txt 

 ()

意义:找出“组”字符串

范例: 查找(glad)或(good)这两个字符串

  egrep -n 'g(la|oo)d' regular_express.txt 

 ()+

意义:多个重复组的判别

范例: echo 'AxyzxyzxyzC' | egrep 'A(xyz)+C' 

 四、文件的格式化与相关处理

   1、格式化打印:printf

     printf '打印格式' 实际内容

    参数: 

      关于格式方面的几个特殊样式:

        \a   警告声音输出

        \b   退格键(backspace)

         \f   清除屏幕(form feed)

         \n   输出新的一行

         \r    亦即Enter按键

        \t    水平的[tab]按键

        \v    垂直的[tab]按键

        \xNN  NN为两位数的数字,可以转换数字成为字符

      关于C程序语言内, 常见的变量格式:

        %ns  那个n是数字,s代表string, 即多少个字符

        %ni  那个n是数字, i代表integer,即多少整数字数

        %N.nf 那个n与N都是数字,f代表floating(浮点)N代表数位,n代表有几个小数位

 

    2、awk:好用的数据处理工具

      awk:比较倾向于将一行分成数个‘字段’来处理,适合处理小型的数据数据处理

      awk  '条件类型1{动作1} 条件类型2{动作2}...'  filename

      如: last -n 5 | awk '{print $1 "\t" $3}'

      整个awk的处理流程:

        a. 读入第一行, 并将第一行的数据填入$0, $1,$2等变量中, $0代表一整行数据的意思

        b. 依据条件类型的限制, 判断是否需要进行后面的动作

        c. 做完所有的动作与条件类型

        d.  若还有后续的“行”的数据, 则重复上面1~3的步骤,直到所有的数据都读完为止

       awk是以行为一次处理的单位, 而以字段为最小的处理单位

      awk的内置变量:

变量名称 代表意义
NF

第一行($0)拥有的字段总数

NR 目前awk所处理的是“第几行”数据
FS 目前的分隔字符,默认是空格键

       

     

 

  awk的条件类型: 逻辑运算符

运算符 代表意义
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于

 

       与bash shell 的变量不同,在awk中, 变量可以直接使用,不需要加上$符号

       awk的动作内{}也是支持if(条件)的

    3、文件比较工具

      a、diff: 就是用在比较两个文件之间的区别的,并且是以行为单位来比较的,通常是用在同一的文件(或软件)的新旧版本区别上。

         diff [-bBi] from-file to-file

          参数: from-file: 一个文件名, 作为欲比较文件的文件名

              to-file: 一个文件名, 作为目的比较文件的文件名

              注意, from-file或to-file可以用-替换,代表standard input

              -b: 忽略一行当中仅有多个空白的区别

              -B: 忽略空白行的区别

              -i: 忽略大小写的不同

         diff 也可以比较整个目录下的区别

      b、cmp: 主要也是比较两个文件,它主要利用“字节”单位去比较,也可以比较二进制文件

        cmp [-s] file1 file2

       参数:

        -s: 将所有的不同点的字节处都列出来,因为cmp默认仅会输出第一个发现的不同点。

      

      c、 patch: diff可以用来分辨两个版本之间的区别,而patch就可以将旧的文件升级为新的文件:

          先将比较新旧版本的区别,并将区别文件制作成为补丁文件,再由补丁文件更新旧文件即可。

        patch -pN < patch_file   <==更新

        patch -R -pN < patch_file   <==还原

        -p: 后面的N表示取消几层目录的意思

        -R: 代表还原, 将新的文件还原成原来旧的版本

       例:制作补丁文件:

          diff -Naur passwd.old passwd.new > passwd.patch

         将patch file用来更新旧的数据

            patch -p0 < passwd.patch

          恢复旧文件的内容

            patch -R -p0 < passwd.patch

 

    4、文件打印准备:pr

        

 

 

 

 

   

posted on 2016-12-27 14:58  曾经的猪  阅读(1203)  评论(0编辑  收藏  举报