Linux的文本处理工具及grep正则表达式的使用

文本处理工具及grep正则表达式的使用

本章节学习的内容:

1、各种文本工具来查看、分析、统计文本文件

2、grep正则表达式

3、扩展正则表达式

一、抽取文本的工具:

1、按文件内容:less和cat

2、按文件截取:head和tail

3、按列抽取:cut

4、按关键字抽取:grep

二、文件查看命令:cat, tac,rev

1、命令cat:

(1)文件目录下直接查看:#cat file

(2)指明文件的路径查看:#cat /PATH/file

(3)cat的常用选项:

-E: 显示行结束符$

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

-A:显示所有控制符

-b:非空行编号

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

2、命令tac:

该命令使用的结果与cat相反,cat是从头部向尾部显示,而tac是从尾部向头部显示,如下图:

blob.png

3、rev命令:

将原来每一行的内容直接360度反转排序显示,如下图:

blob.png

三、分页查看文件内容、文本前或后行内容显示:

1、分页查看文件内容:more与less

(1)命令more: 分页查看文件

#more file 或 #more /PATH/file

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

该命令只能支持往下翻页查看。

(2)命令less:一页一页地查看文件或STDIN输出

查看时有用的命令包括:

/ :文本搜索文本

n/N :跳到下一个or 上一个匹配

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

该命令能够支持来回翻页查看。

2、文本前/后内容显示:

(1)命令head:

命令使用格式:head [OPTION]… [FILE]…

常用选项:

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

-n #: 指定获取前#行

-#:指定行数

(2)命令tail:

命令使用格式:tail [OPTION]… [FILE]…

常用选项:

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

-n #: 指定获取后#行

-#:

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

**eg:用于监控日志文件的最新内容,而不显示旧内容以及不影响终端的操作,可以使用如下命令:

#tail -n0 -f /PATH/file.log &

(当需要终止时,可以使用命令#jobs 查看;然后将执行上面命令所对应的进程编号,使用命令#fg number来结束监控更新)

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

1、命令cut:

(1)命令使用格式:cut [OPTION]… [FILE]…

(2)常用选项:

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

-f #: 抽取第#个字段

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

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

  混合使用:1-3,7(-f1-3,7)

-c按字符切割

–output-delimiter=STRING指定输出分隔符(cut -d: -f1,3 –output-delimiter=* /PATH/file  使用cut以:为分隔符抽取文本的第一列和第三列,抽取结果输出以*分隔开来。 )

(3)显示文件或STDIN数据的指定列

cut -d: -f1/etc/passwd  抽取文本passwd以:为分隔符的第一列内容

cat /etc/passwd|cut -d: -f7  将cat命令读取到passwd的文本内容传递给cut以:为分隔符抽取第七列内容

cut -c2-5/usr/share/dict/words 将words文本内容使用cut命令抽取第2-5个字符列的内容

2、命令paste:

(2)paste 合并两个文件同行号的列到一行

命令使用格式:paste [OPTION]… [FILE]…

常用选项:

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

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

paste f1 f2

blob.png

paste -s f1 f2

blob.png

五、分析文本的工具:

1、文本数据统计:wc

2、整理文本:sort

3、比较文件:diff和patch

→→收集文本统计数据wc:

(1)wc:计数单词总数、行总数、字节总数和字符总数

eg:#wc ip 

10 10 115 ip 单词总数、行总数、字节总数 文件名

blob.png

(2)常用选项:

-l :只计数行数

-w :只计数单词总数

-c :只计数字节总数

-m :只计数字符总数

→→文本排序sort:

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

(1)命令使用格式:#sort[options]file(s)

(2)常用选项:

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

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

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

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

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

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

→→uniq:

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

(1)命令使用格式:uniq[OPTION]… [FILE]…

(2)常用格式选项:

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

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

-u: 仅显示不曾重复的行(连续且完全相同方为重复,常和sort 命令配合使用:sort userlist.txt | uniq-c)

→→比较文件:常用来比较两个文本内容的差异。

比较下面的两个文件之间的区别:

$diff file1 file2

2c2

<use_widgets=no

>use_widgets=yes

** 注明第2行有区别(改变)

diff命令的输出被保存在一种叫做“补丁”的文件中,使用-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件。

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

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

$diff -u file1 file2 > file3

$patch file1 file3 (此恢复操作,将备份的file3通过对比file1,把file2的内容恢复并命名为file1,而file1被改名成file1.orig,后面通过命令将两个文件改名即可完成了文件的恢复)

***重点来啦***

前面认识和学习了简单的文本抽取工具,下面一起来认识功能更加强大的grep正则表达式,grep是一款文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行。

在Linux上有文本处理三剑客,它们分别是:grep,sed,awk。

1、下面先来简单认识它们的功能:

grep是一款文本过滤工具;

sed是一款文本编辑的工具;

awk是一款文本报告生成器。

2、认识grep的使用格式:

命令使用格式:grep [OPTIONS] PATTERN [FILE…]

eg:事例认识grep的使用

#grep root /etc/passwd   过滤文本passwd中带有root为string的内容进行匹配打印输出。

blob.png

#grep "$USER" /etc/passwd 对比 #grep '$USER' /etc/passwd :前一命令中的“$USER”是一个变量,grep以该变量为string进行匹配文本passwd进行打印输出;而第二个命令中的‘$USER’是一个字符串,grep以该字符串去匹配文本passwd打印输出。

blob.png

blob.png

#grep `whoami` /etc/passwd grep以变量`whoami`进行匹配文本passwd进行打印输出。

blob.png

2、下面认识grep命令的常用选项:

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

-i: 忽略字符大小写

-n:显示匹配的行号

-c: 统计匹配的行数

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

-q: 静默模式,不输出任何信息,此时如果想知道命令是否执行成功,可以使用命令#$?查看,数字为1时则失败,   为0时则成功。

-A #:after, 后#行

-B #: before, 前#行

-C #:context, 前后各#行

-e:实现多个选项间的逻辑or关系(grep –e ‘cat ’ -e ‘dog’ file)

-w:整行匹配整个单词

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

3、grep基本正则表达式及egrep扩展正则表达式的元字符:

. :匹配任意单个字符;

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

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

同时也支持字符表的使用,如:[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

4、grep的正则表达式-次数匹配与egrep扩展正则表达式的对比:

##grep的次数匹配:

*:匹配前面的字符任意次,包括0次(贪婪模式:尽可能长的匹配)

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

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

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

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

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

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

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

grep正则表达式的分组:详见下面的使用实例。

\(\)

##egrep的次数匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

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

egrep正则表达式的位置锚定:

^ :行首

$ :行尾

\<, \b :语首

\>, \b :语尾

egrep正则表达式的分组:

()

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

egrep正则表达式的或者:

a|b

C|cat: C或cat

(C|c)at:Cat或cat

5、grep正则表达式的分组:

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

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

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

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

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

\2: string2

至此,我们学习了文本的抽取处理工具以及grep正则表达式的使用,好好动手去捣鼓一番吧,go,go……!!

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

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-10 10:35

    学习态度端正,博客完成很不错,建议对一些命令的选项有一些缩进,不要顶格写,这样看起来不够直观。