学习笔记–文本处理工具

Linux下有很多文本处理工具,本文将介绍几款比较常用的文本处理工具,比如对文本查看的工具:cat和less,文本截取工具:head和tail,按列抽取文本工具:cut,按关键字查询文本工具:grep,下面将具体介绍各种工具的使用。

1、文本查看命令cat

用法: cat [OPTION]… [FILE]…

cat命令一次性显示所有文本内容,也可以跟多个文件连起来显示,但是不能分页显示。cat常与重定向符配合使用,实现简单的文本编辑功能。cat可以跟一些选项实现不同的功能,如跟-n可以显示文本的行数,-s可以压缩连续的空行,具体选项如下:

-n,–number:对输出的所有行编号

-b,–number-nonblank:对输出的非空行编号

-s, –squeeze-blank:对空行进行压缩,不输出多余的空行

-v,–show-nonprinting:可以显示文本中的特殊回车符,如win下的回车符(^M)

-E,–show-ends:显示每行结束处的$符

-T,–show-tabs:显示Tab制表符(^I)

-A,–show-all:显示所有,相当于-vET的集合

与cat命令相反的tac命令可以倒序显示文本内容,即文本的最后一行输出显示到第一行,文本的第一行输出显示到最后一行。rev命令可以将每行的文本内容倒序显示。

应用举例:

[root@liang7 /]# cat userlist 
user1:x:3000:3000::/home/user1:/bin/csh
user2:x:3001:3001::/home/user2:/bin/csh
user3:x:3002:3002::/home/user3:/bin/csh
[root@liang7 /]# tac userlist 
user3:x:3002:3002::/home/user3:/bin/csh
user2:x:3001:3001::/home/user2:/bin/csh
user1:x:3000:3000::/home/user1:/bin/csh
[root@liang7 /]# rev userlist 
hsc/nib/:1resu/emoh/::0003:0003:x:1resu
hsc/nib/:2resu/emoh/::1003:1003:x:2resu
hsc/nib/:3resu/emoh/::2003:2003:x:3resu

2、分页显示文本内容,more和less

more命令可以分页显示文本内容,并且最下面会显示已看文本的百分比,但只能向下翻页,不能往回翻页,跟上-d选项后可以在最下面显示帮助信息,less命令也是分页显示文本内容,但是less支持使用pgUp和pgDn键实现上翻页和下翻页,并且less的功能比more更多,支持更多的搜素方式,不仅可以向下搜,也可以向上搜。

more命令选项详解:

-d:在最下面显示友好的提示信息

-f:计算行数时,以实际上的行数计算,而非自动换行过后的行数,即长行不会被断到下一行

-s:将多个连续的空行压缩为一行显示

-u:不显示下划线

-p:不滚屏,清屏并显示文本

-NUM:指定每屏显示的行数为 NUM

+NUM:从文件第 NUM 行开始显示

 +/STRING:从匹配搜索字符串 STRING 的文件位置开始显示

more命令常用操作:

Enter键:先下n行,需要定义,默认为1行

Ctrl+f或空格键:向下滚动一屏

=:输出当前行的行号

:f:输出文件名和当前的行号

!命令:笤俑shell并执行命令

q:退出

less命令选项详解:

-b:设置缓冲区大小

-e:当文件显示结束后自动离开

-f:强制打开特殊文件

-g:只标注最后搜素的关键子

-i:忽略搜索时的大小写

-m:显示文本的百分比

-N:显示每行的行号

-s:将多个连续的空行压缩为一行显示

less命令常用操作:

h:调出帮助信息

pgup:向上翻一屏

pudn或者空格键:向下翻一屏

d:向下翻半屏

u:向上翻半屏

g:回到文件的开头

G:回到文件的尾部

j或回车键:向下翻一行

y或k:向上翻一行

less命令下搜索模式:

\pattern:向前搜索

?pattern:向后搜索

n:同搜索方向查找下一个匹配项

N:与搜索方向相反查找下一个匹配项

less命令下同时浏览多个文件:

打开方式1:传递多个参数给less以打开多个文件:less file1 file2…

打开方式2:正在浏览一个文件时,使用 :e 打开另一个文件,如下:

less file1

:e file2

当打开多个文件时,可以使用一下方式切换:

:p:浏览前一个文件

:n:浏览下一个文件

3、head命令

用法:head [OPTION]… [FILE]…

head命令显示显示一个文件的前几行,默认显示前10行,可以手动指定要显示的行数或字数。

常用选项有:

-c:指定要显示的字符数

-n:指定要显示的行数

-NUM:指定显示NUM行

4、tail命令

用法:tail [OPTION]… [FILE]…

tail命令显示一个文件的最后几行,默认显示最后10行,也可以手动指定要显示的行数或字数,常用于日志的跟踪。

常用选项有:

-c:指定要显示的字符数

-n:指定显示的行数

-NUM:指定显示最后NUM行

-f:查看文件尾部内容结束后不退出,跟随显示新增的行,常用于监视

例如:跟踪一个日志文件,只显示新增的内容,而不显示已有的内容

]# tail -n 0 -f log.file&       # “&”表示将此程序放到后台执行

5、cut命令

cut [选项]… [文件]…

-c:按指定的列数显示,如指定只显示第几列到第几列的内容

-d:使用指定分界符代替制表符作为区域分界

-f:指定要显示第几个字段列的内容

指定范围的方式有:

N    从第1 个开始数的第N 个字节、字符或域

N-    从第N 个开始到所在行结束的所有字符、字节或域

N-M    从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域

-M    从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域

应用练习:

(1)截取df命令下的磁盘使用率

[root@liang6 ~]# df | tr -s '[:space:]' | cut -d' ' -f5

(2)查出/tmp的权限,以数字方式显示

[root@liang6~]# stat /tmp/ | head -4 | tail -1 | cut -d'(' -f 2 | cut -d'/' -f1

6、多个文件内容合并显示

cat命令和paste命令都可以实现多个文件合并显示,不同之处在于使用cat命令是纵向合并,即将两个不同的文件首尾合并并显示,而paste命令是横向合并,即将两个不同的文件合并且第一列显示第一个文件,第二列显示第二个文件,并且可以使用-d选项指定不同文件间的分割符,paste命令跟上-s选项后可以将每个文件显示在一行输出。

应用举例:

[root@liang7 /]# paste  passwdlist userlist 
user1:user1    user1:x:3000:3000::/home/user1:/bin/csh
user2:user2    user2:x:3001:3001::/home/user2:/bin/csh
user3:user3    user3:x:3002:3002::/home/user3:/bin/csh
user4:user4    user4:x:3003:3003::/home/user4:/bin/csh
user5:user5    user5:x:3004:3004::/home/user5:/bin/csh
user6:user6    user6:x:3005:3005::/home/user6:/bin/csh
user7:user7    user7:x:3006:3006::/home/user7:/bin/csh
user8:user8    user8:x:3007:3007::/home/user8:/bin/csh
user9:user9    user9:x:3008:3008::/home/user9:/bin/csh
user10:user10    user10:x:3009:3009::/home/user10:/bin/csh
[root@liang7 /]# paste -d @  passwdlist userlist 
user1:user1@user1:x:3000:3000::/home/user1:/bin/csh
user2:user2@user2:x:3001:3001::/home/user2:/bin/csh
user3:user3@user3:x:3002:3002::/home/user3:/bin/csh
user4:user4@user4:x:3003:3003::/home/user4:/bin/csh
user5:user5@user5:x:3004:3004::/home/user5:/bin/csh
user6:user6@user6:x:3005:3005::/home/user6:/bin/csh
user7:user7@user7:x:3006:3006::/home/user7:/bin/csh
user8:user8@user8:x:3007:3007::/home/user8:/bin/csh
user9:user9@user9:x:3008:3008::/home/user9:/bin/csh
user10:user10@user10:x:3009:3009::/home/user10:/bin/csh
[root@liang7 /]# paste -s  passwdlist userlist 
user1:user1    user2:user2    user3:user3    user4:user4    user5:user5    user6:user6    user7:user7    user8:user8    user9:user9    user10:user10
user1:x:3000:3000::/home/user1:/bin/csh    user2:x:3001:3001::/home/user2:/bin/csh    user3:x:3002:3002::/home/user3:/bin/csh    user4:x:3003:3003::/home/user4:/bin/csh    user5:x:3004:3004::/home/user5:/bin/csh    user6:x:3005:3005::/home/user6:/bin/csh    user7:x:3006:3006::/home/user7:/bin/csh    user8:x:3007:3007::/home/user8:/bin/csh    user9:x:3008:3008::/home/user9:/bin/csh    user10:x:3009:3009::/home/user10:/bin/csh

7、文本数据统计命令wc

wc命令可以统计出一个文件中包含的行数、字数、字节数,也可以单独指定要统计的内容,常用选项如下:

-c:统计字节总数

-l:统计行数

-w:统计字数

-m:统计字符总数

8、列的排序命令sort

sort命令可以对指定的列进行排序,默认排序方式是以字母排序,常用选项如下:

-f:忽略字母的大小写

-t:使用指定的分隔符

-k:指定那一列排序

-n:以数字顺序排序

-r:倒序排序

-u:合并连续重复的行

9、合并相邻的行命令uniq

uniq命令可以合并相邻并且连续重复的行,常和sort命令配合使用,常用选项如下:

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

-d:只显示合并之前重复的行

-u:只显示合并之前不重复的行

10、diff命令和patch命令

diff命令可以比较两个文件间文本的不同,并且可以将对比结果输出到一个文件中,如果两个文件中的一个文件丢失,可以利用对比结果输出的文件和其中一个文件使用patch命令恢复另一个文件。

[root@liang7 /]# diff -u passwdlist userlist > diff.txt
[root@liang7 /]# cat diff.txt 
--- passwdlist    2016-08-07 11:00:30.609998611 +0800
+++ userlist    2016-08-07 10:50:08.300009628 +0800
@@ -1,10 +1,10 @@
-user1:user1
-user2:user2
-user3:user3
-user4:user4
-user5:user5
-user6:user6
-user7:user7
-user8:user8
-user9:user9
-user10:user10
+user1:x:3000:3000::/home/user1:/bin/csh
+user2:x:3001:3001::/home/user2:/bin/csh
+user3:x:3002:3002::/home/user3:/bin/csh
+user4:x:3003:3003::/home/user4:/bin/csh
+user5:x:3004:3004::/home/user5:/bin/csh
+user6:x:3005:3005::/home/user6:/bin/csh
+user7:x:3006:3006::/home/user7:/bin/csh
+user8:x:3007:3007::/home/user8:/bin/csh
+user9:x:3008:3008::/home/user9:/bin/csh
+user10:x:3009:3009::/home/user10:/bin/csh
[root@liang7 /]# patch -b userlist diff.txt

11、grep命令

用法:grep [选项]… PATTERN [FILE]…

grep是一个文本搜素工具,可以支持正则表达式,后面跟上-E选项相当于egrep,支持扩展的正则表达式。

常用选项:

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

-i:忽略大小写

-n:显示匹配的行号

-c:统计匹配的行数,即显示查找到的内容有几行

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

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

-A NUM:显示匹配到的字符串所在行的后续NUM行

-B NUM:显示匹配到的字符串所在行的前NUM行

-C NUM:显示匹配到字符串所在行的前后NUM行

-w:匹配单词

-E:使用扩展正则表达式

12、正则表达式

正则表达式是由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,正则表达式分为基本正则表达式(BRE)和扩展正则表达式(ERE)。

基本正则表达式元字符:

(1)字符匹配:

.:匹配任意单个字符

[]:匹配指定范围内的任意单个字符,支持a-z的写法,表示所有小写字母

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

\:表示转义符

[:digit:]:匹配所有的数字

[:lower:]:匹配所有的小写字母

[:upper:]:匹配所有的大写字母

[:alpha:]:匹配所有的字母

[:alnum:]:匹配所有的数字或字母

[:space:]:匹配所有呈水平或垂直排列的空白字符

[:blank:]:匹配所有呈水平排列的空白字符

[:punct:]:匹配所有的标点符号

[:cntrl:]:匹配所有的控制字符

[:graph:]:匹配所有的可打印字符,不包括空格

[:print:]:匹配所有的可打印字符,包括空格

[:xdigit:]:匹配所有的十六进制数

(2)次数匹配

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

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

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

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

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

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

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

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

(3)、位置锚定,即定位出现的位置

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

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

^PATTERN$:用于匹配整行

^$:匹配空行

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

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

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

\<PATTERN\>或\bPATTERN\b;匹配整个单词

(4)、分组匹配

\(\):将一个或多个字符捆绑在一起,当作一个整体处理,分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令方式为:\1,\2 …   \1表示从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符。

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

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

\2表示:string2

扩展正则表达式:

扩展正则表达式与基本正则表达式的表达方式基本一致,只不过扩展正则表达式在特定环境下不需要使用“\”符,例如匹配次数时,{m,n}与基本正则表达式中的\{m,n\}意思一样。

另外,扩展正则表达式支持或判断。

例如:a|b:表示a或者b

con(C|c)at:表示conCat或者concat

原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/30480