美文网首页
Linux基础篇-第十一章-正规表示法与文件格式化处理

Linux基础篇-第十一章-正规表示法与文件格式化处理

作者: Js_Gavin | 来源:发表于2021-07-16 11:19 被阅读0次

    常用指令

    grep [-A] [-B] [--color=auto] '搜寻字符串' filename :
          -A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
          -B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;
          --color=auto 可将正确的那个撷取数据列出颜色
    
    sed [-nefr] [动作] :sed 本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed 还可以将数据进行取代、删除、新增、撷取特定行等等的功能
          -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 :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
                i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
                p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
                s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
    
    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 (浮点),如果有小数字数,假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
    
    awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename :awk 主要是处理『每一行的字段内的数据』,而默认的『字段的分隔符为 "空格键" 或 "[tab]键" 』
    
    diff [-bBi] from-file to-file :diff 通常是用在同一的文件(或软件)的新旧版本差异,diff 主要是以『行』为单位比对
          from-file :一个档名,作为原始比对文件的档名;
          to-file :一个档名,作为目的比对文件的档名;
                    注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。
          -b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同
          -B :忽略空白行的差异。
          -i :忽略大小写的不同
    
    cmp [-l] file1 file2 :cmp 则是以『字节』为单位去比对
          -l :将所有的不同点的字节处都列出来。因为 cmp 预设仅会输出第一个发现的不同点
    
    pr :文件打印准备
    

    什么是正规表示法

    简单的说,正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为, 正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序!

    为了要避免这样编码所造成的英文与数字的撷取问题,因此有些特殊的符号我们得要了解一下的:

    image.png
    尤其上表中的 [:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 这几个一定要知道代表什么意思,因为他要比 a-z 或 A-Z 的用途要确定的很

    基础正规表示法

    搜寻特定字符

    image.png

    利用中括号 [] 来搜寻集合字符

    其实 [ ] 里面不论有几个字符,他都仅代表某『一个』字符

    image.png

    行首与行尾字符 ^ $

    行首是 the 开头:

    image.png

    那个 ^ 符号,在字符集合符号(括号[])之内与之外是不同的!在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义

    以行尾结束:

    image.png

    任意一个字符 . 与重复字符 *

    通配符 * 可以用来代表任意(0 或多个)字符, 但是正规表示法并不是通配符,两者之间是不相同的! 至于正规表示法当中的『 . 』则代表『绝对有一个任意字符』的意思!这两个符号在正规表示法的意义如下:
    1、 . (小数点):代表『一定有一个任意字符』的意思;
    2、* (星星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态;

    一定有一个任意字符:

    image.png

    当我们需要『至少两个 o 以上的字符串』时,就需要 ooo* ,亦即是:

    image.png
    因为 * 代表的是『重复 0 个或多个前面的 RE 字符』的意义, 因此,『o*』代表的是:『拥有空字符或一个 o 以上的字符』,特别注意,因为允许空字符(就是有没有字符都可以的意思),因此将会把所有的数据都打印出来屏幕上。

    限定连续 RE 字符范围 {}

    因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用跳脱字符 \ 来让他失去特殊意义才行。

    假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字符串:

    image.png

    基础正规表示法字符汇整

    image.png
    image.png

    sed 工具

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

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

    将 /etc/passwd 的内容列出并且打印行号,同时,将第 2~5 行删除:

    image.png

    如果只要删除第 2 行,可以使用『 nl /etc/passwd | sed '2d' 』来达成,至于若是要删除第 3 到最后一行,则是『 nl /etc/passwd | sed '3,$d' 』的啦,那个钱字号『 $ 』代表最后一行!

    在第二行后(亦即是加在第三行)加上『drink tea?』字样:

    image.png

    以行为单位的取代与显示功能

    将第 2-5 行的内容取代成为『No 2-5 number』:

    image.png

    仅列出 /etc/passwd 文件内的第 5-7 行:

    image.png

    上述的指令中有个重要的选项『 -n 』,按照说明文件,这个 -n 代表的是『安静模式』! 那么为什么要使用安静模式呢?你可以自行下达 sed '5,7p' 就知道了 (5-7 行会重复输出)! 有没有加上 -n的参数时,输出的数据可是差很多的喔!你可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号捉出来查阅!

    部分数据的搜寻并取代的功能

    sed 还可以用行为单位进行部分数据的搜寻并取代的功能喔! 基本上sed 的搜寻与取代的与 vi 相当的类似!他有点像这样:

    sed 's/要被取代的字符串/新的字符串/g'
    

    将 IP 前面的部分予以删除:

    image.png

    直接修改文件内容(危险动作)

    sed 甚至可以直接修改文件的内容!而不必使用管线命令或数据流重导向! 不过,由于这个动作会直接修改到原始的文件。

    利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

    image.png

    sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed !透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订

    延伸正规表示法

    延伸型正规表示法可以透过群组功能『 | 』来进行一次搜寻!那个在单引号内的管线意义为『或 or』! 是否变的更简单呢?此外,grep 预设仅支持基础正规表示法,如果要使用延伸型正规表示法,你可以使用 grep -E , 不过更建议直接使用 egrep !直接区分指令比较好记忆!其实egrep 与 grep-E 是类似命令别名的关系!

    延伸型的正规表示法:

    image.png
    image.png

    文件的格式化与相关处理

    格式化打印: printf

    在很多时候,我们可能需要将自己的数据给他格式化输出的! 举例来说,考试卷分数的输出,姓名与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧?

    分别以字符串、整数、小数点来显示:

    image.png

    awk:好用的数据处理工具

    awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理。因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的模式是这样的:


    image.png

    awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作。 awk 可以处理后续接的文件,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 主要是处理『每一行的字段内的数据』,而默认的『字段的分隔符为 "空格键" 或 "[tab]键" 』!

    取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开:

    image.png

    在 awk 的括号内,每一行的每个字段都是有变量名称的,那就是 $1, $2... 等变量名称。以上面的例子来说,dmtsai 是 $1 ,因为他是第一栏嘛!至于 192.168.1.100是第三栏, 所以他就是 $3 !后面以此类推!还有个变数!那就是 $0 ,$0 代表『一整列资料』的意思~以上面的例子来说,第一行的 $0 代表的就是『dmtsai .... 』那一行啊! 由此可知,刚刚上面五行当中,整个 awk 的处理流程是:

    1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
    2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
    3. 做完所有的动作与条件类型;
    4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

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

    awk 的内建变量:

    image.png

    文件比对工具

    通常是『同一个软件包的不同版本之间,比较配置文件与原始档的差异』。 很多时候所谓的文件比对,通常是用在 ASCII 纯文本档的比对上的!那么比对文件的指令有哪些?最常见的就是 diff ! 另外,除了 diff 比对之外,我们还可以藉由 cmp 来比对非纯文本档!同时,也能够藉由 diff 建立的分析檔, 以处理补丁 (patch) 功能的文件:

    diff

    diff 就是用在比对两个文件之间的差异的,并且是以行为单位来比对的!一般是用在 ASCII 纯文本档的比对上。 由于是以行为比对的单位,因此 diff 通常是用在同一的文件(或软件)的新旧版本差异

    cmp

    cmp 主要也是在比对两个文件,他主要利用『字节』单位去比对(diff 主要是以『行』为单位比对, cmp 则是以『字节』为单位去比对,这并不相同

    总结

    1、正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为;

    2、正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序;

    3、只要工具程序支持正规表示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用;

    4、正规表示法与通配符是完全不一样的东西!通配符 (wildcard) 代表的是 bash 操作接口的一个功能, 但正规表示法则是一种字符串处理的表示方式!

    5、使用 grep 或其他工具进行正规表示法的字符串比对时,因为编码的问题会有不同的状态,因此, 你最好将 LANG 等变量设定为 C 或者是 en 等英文语系!

    6、grep 与 egrep 在正规表示法里面是很常见的两支程序,其中, egrep 支持更严谨的正规表示法的语法;

    7、由于编码系统的不同,不同的语系 (LANG) 会造成正规表示法撷取资料的差异。因此可利用特殊符号如[:upper:] 来替代编码范围较佳;

    8、由于严谨度的不同,正规表示法之上还有更严谨的延伸正规表示法;

    9、基础正规表示法的特殊字符有: *, ., [], [-], [^], ^, $ 等!

    10、常见的支持正规表示法的工具软件有: grep , sed, vim 等等

    11、printf 可以透过一些特殊符号来将数据进行格式化输出;

    12、awk 可以使用『字段』为依据,进行数据的重新整理与输出;

    13、文件的比对中,可利用 diff 及 cmp 进行比对,其中 diff 主要用在纯文本文件方面的新旧版本比对

    14、patch 指令可以将旧版数据更新到新版 (主要亦由 diff 建立 patch 的补丁来源文件)

    相关文章

      网友评论

          本文标题:Linux基础篇-第十一章-正规表示法与文件格式化处理

          本文链接:https://www.haomeiwen.com/subject/bibfpltx.html