8.5文本处理工具及正则表达式

一、各种文本工具

    文件查看

    命令:cat,tac,rev

        cat optiong file

            -E:显示行结束符$

            -n:对显示出的每一行进行编号

            -A:显示所有控制符

            -b:非空行编号

            -s:压缩连续的空行成一行

            -v:查看windows下的^M

[root@localhost wang]# cat -n file1
     1	123456
     2	
     3	abcdwf
     4	
     5	
     6	

        tac:行倒过来显示

[root@localhost wang]# tac  file1



abcdwf

123456

        rev:每一行的字符反着显示

[root@localhost wang]# rev file1
654321

fwdcba

    分页查看文件内容

        more:分页查看文件

        more option file

            -d:显示翻页及退出提示

        less:一页一页的查看文件或stdin输出

            查看是有用的命令包括:

                n/N 跳到下一个或上一个匹配

        less 命令是man命令使用的分页器

    显示文本前或后行内容

        head:显示前面行

        head option file

            -c #:指定获取前#字节

            -n #:指定获取前#行

            – #:指定行数

        tail:显示后面行

        tail option file

            -c #:指定获取后#字节

            -n #:指定获取后#行

            – #:指定行数

            -f:跟踪显示文件新追加的内容,常用日志监控

[root@localhost wang]# cat file1
123456
789987
abcdwf
gebi
laowang
[root@localhost wang]# head -n1 file1
123456
[root@localhost wang]# tail -n1 file1
laowang

    按列抽取文本cut和合并文件paste

        cut option file

            -d delimiter:指明分隔符,默认tab

            -c:按字符切割

            -f fileds:

                #:第#个地段

                #,#:离散的多个字段, 例如-f 1,3,4

                #-#:连续多个字段,例如1-6

                混合使用1-3,8

            –output-delimiter+STRING指定输出分隔符显示文件或stdin数据的指定列

[root@localhost wang]# cut -d: -f1,3 --output-delimiter=+ /etc/passwd
root+0
bin+1
daemon+2
adm+3
lp+4
sync+5
shutdown+6
halt+7
mail+8
operator+11
games+12
ftp+14
nobody+99
systemd-bus-proxy+999
.....

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

            paste option file

                -d 分隔符:指定分隔符,默认用tab

                -s:所有行合成一行显示

[root@localhost wang]# paste -d / file1 file2
123456/12345
789987/qwdasd
abcdwf/12314
gebi/qwrqr
laowang/laowang

    收集文本统计数据wc

        计数单词总数、行总数、字节总数和字符总数

        可以对文件的stdin中的数据运行

            -l:只计数行数

            -w:只计数单词总数

            -c:只计数字节总数

            -m:只计数字符总数

[root@localhost wang]# wc file1
 5  5 34 file1
[root@localhost wang]# wc -l file1
5 file1
[root@localhost wang]# wc -w file1
5 file1
[root@localhost wang]# wc -c file1
34 file1
[root@localhost wang]# wc -m file1
34 file1

    文本排序sort

        把整理过的文本显示在stdout,不改变原始文件

            sort option file(s)

                -r:执行反方向(由上至下)整理

                -n:执行按数字大小整理

                -f:选项忽略(fold)字符串中的字符大小写

                -u:选项(独特,unique)删除输出总的重复行

                -t c:选项使用c作为字段界定符

                -k X:选项按照使用c字符分个的X列来整理能够使用多次

        uniq:从输入中删除重复的前后相接的行

            uniq option file

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

                -d:仅显示重复过的行

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

                连续且完全相同方为重复

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

                sort file | uniq -c

[root@localhost wang]# cat file2
2
2
33
33
12
12
23
23
[root@localhost wang]# sort -n file2 |uniq -c
      2 2
      2 12
      2 23
      2 33

    比较文件

        比较两个文件之间的区别

            diff file1 file2

[root@localhost wang]# diff file1 file2
2,4c2,4
< 789987
< abcdwf
< gebi
---
> qweq
> adaf
> afdqwr
注:2到4行不一样

    复制对文件改变patch

        diff 命令的输出被保存在一种叫做“补丁”的文件中

        使用-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

        patch命令复制在其他文件中进行的改变(要谨慎使用)

        使用-b选项来自动备份改变了的文件

[root@English6 wang]# diff -t file1 file2 > file3
[root@English6 wang]# rm -f file2
[root@English6 wang]# ll
total 8
-rw-r--r--. 1 root root 29 Aug  8 15:44 file1
-rw-r--r--. 1 root root 60 Aug  8 15:48 file3
[root@English6 wang]# patch -b file1 file3
patching file file1
[root@English6 wang]# ll
total 12
-rw-r--r--. 1 root root 31 Aug  8 15:48 file1
-rw-r--r--. 1 root root 29 Aug  8 15:44 file1.orig
-rw-r--r--. 1 root root 60 Aug  8 15:48 file3
注:当恢复file2文件是自动命名file1,而原file1文件自动命名后面加.orig的文件

二、grep全面搜索正则表达式并把行打印出来

    grep:文本过滤(模式:pattern)工具

        grep,egrep,fgrep(不支持正则表达式搜索)

    sed:stream editor,文本编辑工具

    awk:linux上的实现gawk,文本报告生成器

    grep::Global search REgular expression and Print out the line

    作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,打印匹配到的行

    模式:有正则表达式字符及文本字符所编写的过滤条件

    grep option pattren file

[root@English6 wang]# grep --color=auto root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@English6 wang]# grep "$USER" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@English6 wang]# grep '$USER' /etc/passwd
[root@English6 wang]# grep `whoami` /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

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

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

        -i:忽略字符大小写

        -n:显示匹配的行号

        -c:统计匹配的行数

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

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

            echo $?:查看找没找到 0:表示匹配到了

        -A #:显示后#行

        -B #:显示前#行

        -C #:显示前后各#行

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

例如:grep -e 111 -e 222 file 找到file中有111或者222的行

        -w:正行匹配整个单词

        -E:使用ERE

[root@English6 wang]# cat file1
root
wang
laowang
gebilaowang
wang
23
4
56
7
gebidashu
LAOWANG
[root@English6 wang]# grep -v "wang" file1
root
23
4
56
7
gebidashu
LAOWANG
[root@English6 wang]# grep -i "laowang" file1
laowang
gebilaowang
LAOWANG
[root@English6 wang]# grep -n "wang" file1
2:wang
3:laowang
4:gebilaowang
5:wang
[root@English6 wang]# grep -c "wang" file1
4
[root@English6 wang]# grep -o "wang" file1
wang
wang
wang
wang
[root@English6 wang]# grep -q "wang" file1
[root@English6 wang]# echo $?
0
[root@English6 wang]# grep -A2 "4" file1
4
56
7
[root@English6 wang]# grep -B2 "4" file1
wang
23
4
[root@English6 wang]# grep -C2 "4" file1
wang
23
4
56
7
[root@English6 wang]# grep -e "gebi" -e "root" file1
root
gebilaowang
gebidashu
[root@English6 wang]# grep -w "wang" file1
wang
wang

三、正则表达式

    regexp:有一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

    程序支持:grep,vim,less,nginx等。

    分为两类:

        基本正则表达式:BRE

        扩展正则表达式:ERE

    正则表达式引擎:

        采用不同算法,检查处理正则表达式的软件模块

        PCRE(Perl Compatible Regular Expressions)

        元字符分类:字符匹配,匹配次数,位置锚定,分组

    字符匹配:

        .:匹配任意单个字符

        []:[]内的任意单个字符

        [^]:除[]内的任意单个字符

        [:digit:]:所有数字

        [:lower:]:所有小写字母

        [:upper:]:所有大写字母

        [:alpha:]:所有字母,包括大小写

        [:alnum:]:所有字母和数字

        [:punct:]:所有标点符号

        [:space:]:空格和tab

    匹配次数:

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

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

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

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

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

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

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

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

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

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

    位置锚定:

        定位出现的位置

        ^:行首

        $:行尾

        ^pattern$:用于模式匹配正行

        ^$:空行

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

        \<或\b:词首锚定

        \>或\b:词尾锚定

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

    分组:

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

            例如:\(root\)\+  匹配root在文件行中最少一次

        分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3……

        \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

        后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)

[root@English6 wang]# cat file1
root1wangrootwang
rootwang2rootwang
rootwangroot3wang
root1wangruutwaag
rootwang2ruutwaag
rootwangruut3waag
[root@English6 wang]# grep "\(r..t\).*\(w..g\)\1\2" file1
root1wangrootwang
[root@English6 wang]# grep "\(r..t\)\(w..g\).*\1\2" file1
rootwang2rootwang
[root@English6 wang]# grep "\(r..t\)\(w..g\)\1.*\2" file1
rootwangroot3wang

    扩展正则表达式

        egrep option pattern file

        字符匹配:

            .:匹配任意单个字符

            []:[]内的任意单个字符

            [^]:除[]内的任意单个字符

        次数匹配:

            *:匹配前面字符任意次

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

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

            {n}:匹配前面的字符n次

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

 

        位置锚定:

            ^:行首

            $:行尾

            \<或\b:词首锚定

            \>或\b:词尾锚定

        分组:

            ()

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

        或者:

            a|b:a或者b

            C|cat:C或cat

原创文章,作者:DYW,如若转载,请注明出处:http://www.178linux.com/30040