Linux文本处理工具和正则表达式

概述:

    Linux核心哲学思想中很重硬件要的一条内容就是一切皆文件,在Linux系统上,无论硬件、软件、配置文件等等一切,都以文件形式呈现出来。一般文件类型有:普通文件、目录文件、链接文件、管道文件、套接字文件、字符设备文件、块设备文件等。而普通文件里面又有一些文本文件、二进制文件等细分化的文件类型,而我们日常系统管理工作,主要就是对一些文本类型的文件,进行新增、删除、修改、查询等相关操作,来完成系统的维护,那么对文本处理就变成了我们必不可少的基础既能。

    本章就先简单介绍一些文本的查看,分析,统计工具,以及正则表达式和grep的相关内容,主要的内容包含以下几个部分:

        1、文本查看工具介绍(cat、tac、rev、head、tail、more、less、cut、paste)

        2、文本统计工具介绍(wc、sort、uniq)

        3、文本比较工具介绍(diff、patch)

        4、基本正则表达式和扩展正则表达式介绍

        5、文本处理三剑客之grep介绍

    涉及到的命令主要有:cat、tac、rev、head、tail、more、less、cut、paste、wc、sort、uniq、diff、patch、grep、egrep、fgrep

第一章    文本查看工具介绍

    1、cat文本查看工具

        语法:cat [OPTIONS] FILE

        常用选项:

            -n  显示行号,空白行也加

            -b  显示行号,空白行不加

            -ns  显示行号,然后出去重复的行显示为一行(相邻且相同)

            -T  显示TAB键

            -v  显示^M ,也就是\r 的内容,相当于显示Windows的换行键

            -A  显示所有的内容,所有的隐藏字符,TAB、换行之类的

        示例:

        blob.png

    2、tac:文本查看工具,与cat一样,只是把cat的内容按行倒序显示

        示例:

        blob.png

    3、rev:反向显示文件中每一行的内容

        例如:如文件中是abcdefg,如果用rev显示,则显示为gfedcba

        blob.png

    4、head:显示文件的前几行,默认是前10行

        语法:head [OPTIONS] FILE…

        常见选项:

            -n 数字:表示显示文件的前几行

            -数字:与-n 数字  功能一样,显示文件的前几行

            -c 数字:表示显示文件的前多少个字节,而不是多少行

        示例:

        blob.png

    5、tail:显示文件的后几行,默认是10行

        语法:tail [OPTIONS] FILE…

        常见选项:

            -n 数字 :显示文件后几行

            -数字:与-n 数字 功能一样,显示文件的后几行信息

            -n +数字: 从第几行开始显示文件信息

            -c 数字:显示文件的后多少个字节,而不是后几行

        blob.png

    6、more:分页显示文件内容,只能向下翻页,不能向上翻页

        选项:    

            -d  能显示提示信息

        在more界面中,可以运行:

            !执行外部命令

            /string  搜索关键字          

            !COMMAND  在more界面下,执行bash命令结果显示在more界面中,不用退出more

            q 退出more界面

    7、less:分页显示文件内容,既能向上翻页,又能向下翻页  

        在less界面时:

            /string  向下搜索关键字

            ?string  向上搜索关键字

                n  按照搜索方向,顺向显示下一个匹配到的内容

                N  按照搜索方向,逆序显示下一个匹配到的内容

            !COMMAND  在less界面下,执行某命令,不用退出less

            q 退出less界面

    8、cut:字段截取工具,按照指定的分隔符进行分割后显示,默认分隔符为TAB键  

        语法:cut[OPTION]…[FILE]…

            -d   指定分隔符,默认为tab

            -f FILEDS 

                # 第#个字段

                #,#,…   离散的多个字段,如-f1,3,6

                #-#    连续的多个字段,如-f1-3

            -c  按字符切割,取第几个字符到第几个字符数显示的内容

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

        示例:

        blob.png

        

    9、paste:合并两个文件同行号的列到一行

        选项:

            -d 分隔符  合并时指定分隔符,默认为tab

            -s   将一个文件所有行合并成一行显示

        示例:

        blob.png

第二章    文本统计工具介绍

    1、wc  统计工具

        语法:wc [OPTION]… FILE

            -l  显示多少行

            -c  显示多少个字节,3个字节标识一个汉字,但是1个汉字只算一个字符

            -w  显示单词数量

            -m  显示字符数

        示例:

        blob.png

    2、sort  排序命令

        语法:sort [OPTIONS]… FILE 排序时默认是按字符a-z排序

        常用选项

            -r 逆序显示

            -n 按数字大小排序

            -f 忽略字符大小写

            -u 删除结果中的重复行(不管相不相邻,都去重)

            -t STRING 选项使用指定字符做为字段界定符

            -k X 选项按照使用上面-t字符分隔的X列来整理能够使用多次

        示例:

        blob.png

        

    3、uniq:去重显示,(相邻且相同才认为是重复)

        语法:uniq [OPTION]… [FILE]…

            -c: 显示每行重复出现的次数;

            -d: 仅显示重复过的行;

            -u: 仅显示不曾重复的行;

                连续且完全相同方为重复

            常和sort 命令一起配合使用:

                sort userlist.txt | uniq -c

        示例:

        blob.png

第三章    文本比较工具介绍

    1、diff  比较两个文件之间的不同之处

        语法:diff [OPTIONS] FILE1  FILE2

        常用选项:

            -u  表示利用重定向,将不同之处生成补丁文件,以供利用patch还原用

        示例:

        blob.png

    2、patch补丁工具,复制改变的数据到文件中

        语法:patch [OPTIONS] FILE  PATCHFILE

        选项:

            -b  表示自动备份改变了的文件

        示例:

        blob.png

        blob.png

第四章    基本正则表达式和扩展正则表达式介绍

    1、基本正则表达式

        字符匹配:

            . : 匹配任意单个字符;

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

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

            [0-9]:匹配0-9之间的数字

            [1-9]:匹配1-9之间的数字,注意向匹配10-19之间的数字不能写成[10-29],要每一位分别写[1-2][0-9]

            [:digit:]:匹配数字

            [:lower:]:匹配小写字母

            [:upper:]:匹配大写字母

            [:alpha:]:匹配所有大写和小写字母

            [:alnum:]:匹配数字和大小写字母

            [:punct:]:匹配标点

            [:space:]:匹配空白字符

        

        匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

            *:匹配前面的字符任意次,包括0次

            贪婪模式:尽可能长的匹配

            .*:任意长度的任意字符

            \?:匹配其前面的字符0或1次

            \+:匹配其前面的字符至少1次

            \{m\}:匹配前面的字符m次

            \{m,n\}:匹配前面的字符至少m次,至多n次

            \{,n\}:匹配前面的字符至多n次

            \{m,\}:匹配前面的字符至少m次

        

        位置锚定:定位出现的位置

            ^:行首锚定,用于模式的最左侧

            $:行尾锚定,用于模式的最右侧

            ^PATTERN$: 用于模式匹配整行

            ^$: 空行

            ^[[:space:]]*$ :空白行

            \< 或 \b:词首锚定,用于单词模式的左侧

            \> 或 \b:词尾锚定;用于单词模式的右侧

            \<PATTERN\>:匹配整个单词

        

        分组: \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理

        后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)利用: \1, \2, \3, …来引用前面第一个括号、第二个括号…匹配到的内容        

            如: \(niwenchao\+\(nwc\)*\)

                \1: niwenchao\+\(nwc\)*

                \2: nwc

        

        示例:

         # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

        blob.png

    2、扩展正则表达式

        个人总结为:相比基本正则表达式,一些需要转义的位置,除了词首词尾锚定\<\>都不需要加转义符,另外增加了或关系的表达式(|)  

        字符匹配:

            . 任意单个字符

            [] 指定范围的字符

            [^] 不在指定范围的字符

            [0-9]:匹配0-9之间的数字

            [1-9]:匹配1-9之间的数字,注意向匹配10-19之间的数字不能写成[10-29],要每一位分别写[1-2][0-9]

            [:digit:]:匹配数字

            [:lower:]:匹配小写字母

            [:upper:]:匹配大写字母

            [:alpha:]:匹配所有大写和小写字母

            [:alnum:]:匹配数字和大小写字母

            [:punct:]:匹配标点

            [:space:]:匹配空白字符

        次数匹配:

            *:匹配前面字符任意次

            ?: 0或1次

            +: 1次或多次

            {m}:匹配m次

            {m,n}:至少m,至多n次

        

        位置锚定:

            ^ :行首

            $ :行尾

            \<, \b :词首

            \>, \b :词尾

        

        分组:

            ()

        后向引用: \1, \2, …

        或者:

            a|b

            C|cat: C或cat

            (C|c)at:Cat或cat

第五章    文本处理三剑客之grep介绍  

    grep:过滤出特定的行

        grep 支持标准正则表达式

        egrep  支持扩展正则表达式,相当于grep -E

        fgrep  不支持正则表达式

    语法:grep [OPTIONS] PATTERN [FILE…]

    选项:

        –color=auto: 对匹配到的文本着色显示;

        -v: 显示不能够被pattern匹配到的行;

        -i: 忽略字符大小写

        -n: 显示匹配的行号,匹配到的是第几行

        -c: 统计匹配的行数,匹配到了多少行

        -o: 仅显示匹配到的字符串;

        -q: 静默模式,不输出任何信息

        -A #: after, 后#行,除了显示匹配到的行外,还显示匹配到的行的后几行

        -B #: before, 前#行,除了显示匹配到的行外,还显示匹配到的行的前几行

        -C #: context, 前后各#行,除了显示匹配到的行外,还显示匹配到的行的前后各几行

        -e:实现多个选项间的逻辑or关系

            grep –e ‘cat ’ -e ‘dog’ file

            多个-e 之间是或关系

        -w:整行匹配整个单词,只能匹配整个单词,不能是一个单词的一部分,前后可以是符号,但是不能是字母

        -E:使用ERE,相当于egrep

        -F:相当于fgrep,不支持正则

        

        nmap -sP -v 10.1.252.210/24  表示扫描该网段的主机

        查看网段内有哪些主机处于连接状态:

        nmap -sP -v 10.1.252.210/24 |grep -B1 “up”|grep -v “up”

    blob.png

    blob.png

    正则表达式表示身份证号

        1:     [1-9]

        2-6:   [0-9]{5}

        78:    (19|20|21)

        9-10   [0-9]{2}

        11-12  ((0[1-9])|11|12)

        13-14  ((0[1-9])|([12][0-9])|(3[0-1]))

        15-17  [0-9]{3}

        18     [0-9X]

   # egrep "\<[1-9][0-9]{5}(19|20|21)[0-9]{2}((0[1-9])|(10|11|12))((0[1-9])|([12][0-9])|(3[0-1]))[0-9]{3}[0-9Xx]\>" 

    blob.png

    找出ifconfig命令结果中本机的所有IPv4地址

    # ifconfig|grep -E -o "(([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])"

    1.png

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/29961