8.5_Linux文本处理工具和grep之正则表达式的使用

Linux文本处理工具使用


文件查看工具的使用


cat 命令的使用 

此命令一般用于查看文件内容比较多

NAME
       cat - concatenate files and print on the standard output
             # 链接文件并且以标准输出打印显示
             
SYNOPSIS
       cat [OPTION]... [FILE]...

        -n 显示加行号

        -b 加行号并忽略空行的计算

        -s 忽略相邻的重复的空行(压缩空行为一行)

        -v 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

        -T 能看到tab出来的空格,显示为^I

        -A 显示所有等于-vET

        -E 显示结束符号$

wKiom1ekkaDxy5cWAAASsLZqgEk765.png

tac 命令的使用

此命令使用方法跟cat一样,输出内容跟cat相反

NAME
       tac - concatenate and print files in reverse
             #链接文件并且以相反方向显示
SYNOPSIS
       tac [OPTION]... [FILE]...

wKioL1ekkYGyQw7EAAATI2A2wB0917.png

rev 命令的使用

此命令把所有字符相反排序显示

NAME
     rev - reverse lines of a file or files
           # 反向显示文件的行内容
SYNOPSIS
     rev [file ...]

wKioL1ekkTDT-CX-AAATAPQg0yY396.png

more 命令的使用

NAME
     more - file perusal filter for crt viewing
            # 分页查看文件内容
SYNOPSIS
     more [file ...]

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

wKiom1eklAvD834lAAALfa7va1M882.png

wKioL1eklAuTW00jAAA3n7PCB34336.png

less 命令的使用

一页一页地查看文件或STDIN输出

NAME
       less - opposite of more

当我们使用man命令查看文件帮助的时候,实际上就是调用less进程去查看帮助文件

查看时有用的命令包括:

/文本搜索文本(此时从文本当前位置向下搜索)

?文本搜索文本 (此时从文本当前位置向上搜索)

wKioL1eklZ6w5NQRAAB-Z_F97qc596.png

当使用搜索功能的时候,可使用小写n跳到下一个,大写N跳到上一个匹配

head 命令的使用

NAME
       head - output the first part of files
              # 输出显示文件的首部内容
SYNOPSIS
       head [OPTION]... [FILE]...

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

        -n #: 指定获取前#行

          -#:指定行数

wKiom1eklyqwuqJhAAAn9Ne79CI167.png当我们只需要查看某文件的前5行内容的时候,可以使用此命令只查看文件的前5行的内容

tail 命令的使用

NAME
       tail - output the last part of files
              # 从文件的尾部查看内容
SYNOPSIS
       tail [OPTION]... [FILE]...

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

        -n #: 指定获取后#行

          -#:指定获取后#行

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

wKiom1ekmPSgn6M9AAAh0osMV7s653.png

cut 命令的使用

根据指定的分隔符切片,并显示出需要显示的片

NAME
       cut - remove sections from each line of files
             # 从文件里面移除选择的内容
SYNOPSIS
       cut OPTION... [FILE]...

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

        -f数字:指定要显示的字段             

                #: 第#个字段

                #,#[,#]:离散的多个字段,例如1,3,6

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

                混合使用:1-3,7

        -c按字符切割

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

wKioL1ekm_PhhdY_AAAnUIHcv0A950.png

指定查看以:为分隔符查看文件的第1,3,7的选项

paste 命令的使用

NAME
       paste - merge lines of files
               # 合并多个文件同行号的列到一行
SYNOPSIS
       paste [OPTION]... [FILE]...

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

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

wKioL1emp1HBDn-vAAAx_1yvvWc399.png

分析文本的工具的使用

wc 命令的使用

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

NAME
       wc - print newline, word, and byte counts for each file
            # 统计文件显示的行数、单词数和字节数
SYNOPSIS
       wc [OPTION]... [FILE]...
       wc [OPTION]... --files0-from=F

            -l来 只计数行数

            -w来 只计数单词总数

            -c来 只计数字节总数

            -m来 只计数字符总数

wKioL1emqKXD4YFwAAAvr3xJtUg650.png

4 行(文件行数) 9 单词(文件单词数) 33 字节(文件大小) /etc/issue (文件名)

sort 命令的使用

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

NAME
       sort - sort lines of text files
              #对文本文件进行排序    
SYNOPSIS
       sort [OPTION]... [FILE]...

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

        -n 执行按数字大小整理

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

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

        -t 指定分隔符做为字段界定符

        -k数字 指定分隔后进行比较字段

wKioL1em8CPCWLs3AAAceo_2x1A442.png

-n 对一堆不规则的数字进行排序,-u 并且删除重复项

uniq 命令的使用

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

NAME
       uniq - report or omit repeated lines
              # 忽略重复的行
SYNOPSIS
       uniq [OPTION]... [INPUT [OUTPUT]]

        -c: 统计每一行出现的次数(靠着的行)

        -d: 仅显示重复过的行

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

            连续且完全相同方为重复

wKiom1em9eiD_Q8eAAAPL7ihH4w792.png

对已经排序的文件进行重复次数的统计,此命令通常跟sort一起用:

sort filelist.txt | uniq-c

diff 命令的使用

比较两个文件之间的区别

NAME
       diff - compare files line by line
              # 比较文件之间的区别
SYNOPSIS
       diff [OPTION]... FILES

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

wKiom1enA0aSZvQ9AAAObZCxobM024.png

diff的结果第六行和第七行多了一个0出来,看下图cat的结果,跟出来的结果是一样的。

wKiom1enA0ah2LsJAAAimTREU9M140.png

patch 命令的使用

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

NAME
       patch - apply a diff file to an original
               # 变化文件应用到原始文件
SYNOPSIS
       patch [options] [originalfile [patchfile]]

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

wKioL1enDyOTZICjAAAps_9LZPQ492.png

修改文件变化的部分(打补丁)

Linux文本处理三剑客之grep以及正则表达式的使用


grep、egrep、fgrep

NAME
       grep, egrep, fgrep - print lines matching a pattern
                            # 显示匹配到的信息
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

grep(Global search REgularexpression and Print out the line.)

作用:文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,并显示匹配的行

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

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

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

        -i: 忽略字符大小写

        -n:显示匹配的行号

        -c: 统计匹配的行数

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

        -q: 静默模式,不输出任何信息,相当于 &> /dev/null,因为不是任何命令都有静默模式

        -A #: after, 后#行

        -B #: before, 前#行

        -C #:context, 前后各#行

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

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

        -w:整行匹配整个单词

        -E:使用扩展正则表达式,grep -E = egrep

注意,CentOS 7默认的grep是个别名

wKioL1enF0nhpzRzAAALwYIXh3Q166.png

选项例子

匹配/etc/passwd里面含root字符信息的文字,忽略大小写,并且显示其前后3行的内容,显示行号 

wKiom1en2fuhl-4cAABcEPPvugs756.png

关于grep对各类引用的应用例子

grep root /etc/passwd (匹配文件中包含“root”字符的信息)

wKioL1enGIjyL6BdAAAeVpykBQE189.png

grep "$USER" /etc/passwd (匹配变量$USER信息里面含有的“root”字符信息,""号是弱引用)

wKioL1enGRHguAGUAAAZrc0FeiE641.pngwKiom1enGRGzQ4seAAAHe1ocl8A153.png

grep '$USER' /etc/passwd (匹配“$USER”字符的信息,因为''是强引用,变量不会在执行的时候发生改变,所以没有匹配到任何的信息)

wKiom1enGWSRMMCqAAAMuTznDrs922.png

grep `whoami` /etc/passwd (匹配命令whoami输出的字符信息,因为“是命令引用,所以匹配的是whoami输出的信息)

wKioL1enGXPh47epAAAZPO7iIzo588.png

wKioL1enGXSTM15DAAAHkRlYFsQ599.png

正则表达式

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

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

正则表达式分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep -E, egrep

正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块 PCRE(Perl Compatible Regular Expressions)

帮助手册查询 man 7 regex

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

基本正则表达式元字符

字符匹配:

. :匹配任意单个字符;

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

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

[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

正则表达式字符匹配例子:

匹配任意两个字符,后面跟着abc其中一个字符,后面再跟着一个非数字的字符

wKioL1en3Hjz-IU8AAAYGHom3e4804.png

分析:haaa , ..(ha),[abc](a),[^[:digit:]](a),符合

      hab3 , ..(ha),[abc](b),[^[:digit:]](3)错,不符合

      12c3 , ..(12),[abc](c),[^[:digit:]](3)错,不符号

      12aa , ..(12),[abc](a),[^[:digit:]](a),符号

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

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

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

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

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

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

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

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

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

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

正则表达式匹配次数例子:

匹配开头h至少1次,匹配i零次或1次,匹配123至少1次,至多3次

wKiom1en37vhlfScAAAeD0nqQys815.png

分析:hhhi123 ,h\+ (hhh),i\? (i),123\{1,3\} (123)。符合

     hi123123123 , h\+ (h) , i\? (i),123\{1,3\}(123123123123)一共有4个,所以只取第一个?(这里有个疑问,这个应该是贪婪模式?) 前半部分符合要求

     h123 , h\+ (h),i\? (此处为空,符合), 123\{1,3\} (123) ,符合

     i123 , h\+ (此处为空,不符合),i\? (i) , 123\{1,3\} (123) 

     hii23 ,h\+ (h) , i\? (ii,多了一个i,不符合) ,123\{1,3\} (23,少了1,不符合) 

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

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

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

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

^$: 空行

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

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

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

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

正则表达式位置锚定的例子:

先举个反例子,假如要求我们要匹配root的账号,在没有锚定位置的情况下,由于operator账号里带有root的信息,所以一并匹配了出来。

wKioL1en5LfzhCAGAAAUs5HbGjc494.png

假如我们只想匹配root账号的信息,其他信息不显示出来:用^号锚定行首,\>字符锚定单词结尾,这个意思就是以root为行首,且以root为单词结尾,匹配出来这样的信息,就只有一个root账号了。

wKioL1en5T3AODt6AAAVMfpxVLw750.png

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

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

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

实例:\(string1\+\(string2\)*\)

\1: string1\+\(string2\)*

\2: string2

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

正则表达式位置锚定的例子:

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

\1: 匹配“abc123.”,后面的\{2\}即前面的信息“\1”重复2次,所以第一条信息,最后少了一个“.”,不符合要求,第二条信息“abc123.abc123.abc123.”刚好重复了两次,符号要求。  

wKioL1en7GnC8kt1AAAToR1W9R4661.png

例二:    \2 从左侧起,第二个左括号以及与之匹配右括号之间的模式所匹配到的字符,如下图,即

\2: 匹配“123”,后面的\{2\}即前面的信息“\2”重复2次,所以第一条信息,符合;第二条信息,123只重复了1次,不符合;第三条信息,123重复了3遍,所以只匹配前面符合要求的部分。

wKioL1en7PDS6EeIAAAdi-G6x3A075.png

元字符部分整理

wKiom1enIaKxDkzpAACsPBFGJA8181.png

egrep及扩展的正则表达式

egrep

NAME
       grep, egrep, fgrep - print lines matching a pattern
                            # 显示匹配到的信息
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

用法: egrep = grep -E 

选项内容和用用法跟grep是一样的,只是支持扩展的正则表达式的表示方式稍微有所不同,但是思想都是一样的。

wKiom1en8QyB9bukAAAV_siE9HM768.png

扩展正则表达式元字符

字符匹配:

. 任意单个字符

[] 指定范围的字符

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

扩展正则表达式字符匹配的例子:

这个跟基本正则表达式的方式完全没有改变,此例子跟上面的基本正则表达式一样,就不再详述意义。

wKioL1en9-jRGyIwAAAqez6NzX8075.png

次数匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

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

扩展正则表达式次数匹配的例子:

匹配开头h至少1次,匹配i零次或1次,匹配123至少1次,至多3次

wKioL1en-Y7AQPY6AAAa1_1gPCk843.png

分析:hhhi123 ,h+ (hhh),i? (i),123{1,3} (123)。符合

     hi123123123 , h+ (h) , i? (i),123{1,3}(123123123123)一共有4个,所以只取第一个?(这里有个疑问,这个应该是贪婪模式?) 前半部分符合要求

     h123 , h+ (h),i? (此处为空,符合), 123{1,3} (123) ,符合

     i123 , h+ (此处为空,不符合),i? (i) , 123{1,3} (123) 

     hii23 ,h+ (h) , i? (ii,多了一个i,不符合),123{1,3} (23,少了一个1,不符合)

可以看见,对于次数匹配的扩展正则表达式的跟基本正则表达式比起来,主要就是少了转义符号\。这样看上去的话更加简洁了。

位置锚定:

^ :行首

$ :行尾

\<, \b :语首

\>, \b :语尾

扩展正则表达式位置锚定的例子:

这个跟基本正则表达式的方式完全没有改变,这里也不再详述

wKioL1en8qSyjG79AAAV_siE9HM253.png

分组:

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

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

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

实例:(string1+(string2)*)

\1: string1+(string2)*

\2: string2

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

()

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

扩展正则表达式分组的例子:

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

\1: 匹配“abc123.”,后面的{2}即前面的信息“\1”重复2次,所以第一条信息,最后少了一个“.”,不符合要求,第二条信息“abc123.abc123.abc123.”刚好重复了两次,符号要求。

wKioL1en_MTBO9jPAAASZhGOFw0396.png

例二:    \2 从左侧起,第个左括号以及与之匹配右括号之间的模式所匹配到的字符,如下图,即

\2: 匹配“123”,后面的{2}即前面的信息“\2”重复2次,所以第一条信息,符合;第二条信息,123只重复了1次,不符合;第三条信息,123重复了3遍,所以只匹配前面符合要求的部分。

wKiom1en_MSRS8XeAAAZ2rmHPUc827.png

以上的例子跟基本正则式的要求是一样的,可以看见,对于分组的扩展正则表达式的跟基本正则表达式比起来,主要就是少了转义符号\。这样看上去的话更加简洁了。

或者:

a|b

C|cat: C或cat

(C|c)at:Cat或cat

这个是基本正则表达式也有的:

wKiom1en_nvz63hxAAAaZUeoYjQ446.png

扩展正则表达式或者的例子:

wKiom1en_uXiGCHaAAAYp8-tIrc456.png

可以看见,对于或者的扩展正则表达式的跟基本正则表达式比起来,主要就是少了转义符号\。这样看上去的话更加简洁了。

总结了一下,其实基本正则表达式功能跟扩展正则表达式功能上基本都一样,只是有时候需要表达的信息的方法稍微有一点不一样,正则表达式在实际使用中还是很复杂,例子里面都是一些比较简单的例子,要能做到快速看明白和熟练使用正则表达式,需要多多练习。

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