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

(0)
上一篇 2016-08-10 15:03
下一篇 2016-08-10 16:07

相关推荐

  • 马哥教育网络班21期+第9周课程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash # declare -i nologuser=0 declare -i loguser=0 while read&…

    Linux干货 2016-09-05
  • 文本编辑器vim概述与应用示例

    文本编辑器vim概述与应用示例 文本编辑器概述 vim编辑器是一种易用、功能强大的文本编辑器,可以基于三种不同的模式对文本进行编辑,包括编辑模式、输入模式和末行模式。 编辑模式 模式转换 i 表示在光标所在处插入 a 表示在光标后方插入 o 表示在光标所在处的下一行插入 O 表示在光标所在处的上一行插入 I 表示在光标所在行的行首插入 A 表示在光标所在行的…

    Linux干货 2017-08-06
  • linux树状结构

    linux 目录结构   /:根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中 /bin:/usr/bin:可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。 /boot:放置linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文…

    Linux干货 2016-08-05
  • bash的特性和目录管理命令

    bash的特性和目录管理命令 bash特性     1. 命令补全机制: 所谓的命令补全,就是当输入命令的前几个字符的时候,按下tab,此时,bash根据输入的字符串,到path路径下进行寻找,把找到的且能唯一根据这个字符串标识的命令,予以补全。 如果根据这个字符串能在一个目录下面找到多个相同的命令,则再按一下tab就能列出所有…

    Linux干货 2016-10-29
  • 特殊权限及facl

    Linux系统上的特殊权限          特殊权限:SUID,  SGID,  STICKY 安全上下文:         1、进程以某用户的身份运行,进程是发起此进程用户的代理,因此用户的身份和权限完成所有操作;     &…

    Linux干货 2016-11-07
  • 马哥教育网络班21期-第三周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who|cut -d" " -f1|uniq -c|awk '{print $2}' 2、取出最后登录到当前系统的用户的相关信息。 last |awk 'NR==1{print $0}' last |sed -n &…

    Linux干货 2016-07-29