在linux文件系统中经常会使用到文本处理工具,这里简单介绍几种文本处理工具:
抽取文本的工具
文件内容:less和cat
文件截取:head和tail
按列抽取:cut
按关键字抽取:grep , egrep
文件查看命令:cat, tac,rev,more,less
cat命令是用户经常使用的用来查看文本文件的命令,cat命令是需要接收到标准输入然后再标准输出设备上。并且和cat命令相对应的还有tac,tev两个命令。
语法:cat [OPTION]... [FILE]...
常用选项:
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行
cat查看文件是顺序查看,标准输入什么格式就输出什么格式。而tac命令,从字面上就可以看出它是cat倒过来写的,使用tac查看文件就会倒叙显示输出,即第一行最后显示,最后一行首先显示。而rev命令输出的格式和它们两个又不一样,rev命令是将文件中的每行内容以字符为单位反序输出,即一行之中,第一个字符最后输出,最后一个字符首先输出。
使用cat命令查看文件是一下全部显示,小文件还好,遇到大文件就麻烦了。而more命令显示一页后会自动停下,并在地步出现提示信息,显示当前位置所示全文的百分比。
more: 分页查看文件
语法:more [OPTIONS...] FILE...
常用选项: -d: 显示翻页及退出提示
more命令是一个文件过滤器,它以全屏幕的方式按页显示文本文件的内容,支持关键字查找。内置若干快捷键,常用快捷键H (获取帮助信息),Enter (向下翻一行),空格键(向下翻一屏)B(向上翻一屏)Q(退出)
more命令查看大文件很方便,但是也有一个缺点就是不能向上翻页,只能向前走,没有回头路。。。想要回头查看就需要用到less命令了。
less:一页一页地查看文件或STDIN输出
查看时有用的命令包括:
/文本搜索文本
n/N跳到下一个或上一个匹配
less命令是man命令的命令十分相似,不同的是less命令允许向上翻页。less命令显示文件时,用Pageup向上翻页,使用Pagedown向下翻页。
显示文本前或后行内容
有时查看文件这是想查看文件的前几行或后几行,并没有想查看全部。这时就需要用到head和tail命令 。
head命令:意如其名,用于显示文件的开头的内容,默认显示文件的钱10行,也可指定行数。
语法:
head [OPTION]... [FILE]...
常用选项:
-c #: 指定获取前#字节
-n #: 指定获取前#行
-#:指定行数
tail命令:显示文件的后几行内容,默认是显示文件的末尾10行。
语法:
tail [OPTION]... [FILE]...
常用选项:
-c #: 指定获取后#字节
-n #: 指定获取后#行
-#:指定行数
-f: 跟踪显示文件新追加的内容,常用日志监控
按列抽取文本cut和合并文件paste
cut命令:用来显示文件中指定行中的部分,经常用来切割显示文件信息。
语法:
cut [OPTION]... [FILE]...
常用选项:
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用:1-3,7
-c按字符切割
--output-delimiter=STRING指定输出分隔符
如:显示系统中所有用户的UID和shell类型
用户的UID和shell类型信息都在/etc/passwd文件中。文件是以“:”为分割符。UID和shell类型分别在第3和7列。
paste命令: 合并两个文件同行号的列到一行
语法:
paste [OPTION]... [FILE]...
常用选项:
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2
分析文本的工具
文本数据统计:wc
计数单词总数、行总数、字节总数和字符总数, 可以对文件或STDIN中的数据运行
例:wc story.txt
39 237 1901 story.txt
行数 字数 字符数
常用选项:
使用-l来只计数行数
使用-w来只计数单词总数
使用-c来只计数字节总数
使用-m来只计数字符总数
整理文本:sort
把整理过的文本显示在STDOUT,不改变原始文件
语法:sort [options] file(s)
常用选项:
-r执行反方向(由上至下)整理
-n执行按数字大小整理
-f选项忽略(fold)字符串中的字符大小写
-u选项(独特,unique)删除输出中的重复行
-t c选项使用c做为字段界定符
-k X选项按照使用c字符分隔的X列来整理能够使用多次
比较文件:diff和patch
比较两个文件之间的区别
例:
diff foo.conf-broken foo.conf-works
5c5
<use_widgets=no
---
>use_widgets=yes
注明第5行有区别(改变)
diff命令的输出被保存在一种叫做“补丁”的文件中
使用-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件。
patch命令复制在其它文件中进行的改变(要谨慎使用!)
适用-b选项来自动备份改变了的文件
$diff -u foo.conf-broken foo.conf-works > foo.patch
$patch -b foo.conf-broken foo.patch
文件排序sort:
sort命令:把整理过的文本显示在STDOUT,不改变原始文件
语法:sort [options] file(s)
常用选项:
-r执行反方向(由上至下)整理
-n执行按数字大小整理
-f选项忽略(fold)字符串中的字符大小写
-u选项(独特,unique)删除输出中的重复行
-t c选项使用c做为字段界定符
-k X选项按照使用c字符分隔的X列来整理能够使用多次
文件整理uniq
uniq命令:从输入中删除重复的前后相接的行,一般与sort命令结合使用。(连续且完全相同方为重复)
语法:uniq[OPTION]... [FILE]...
常用选项:
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
常和sort 命令一起配合使用:
sort userlist.txt | uniq-c
例:查出用户UID最大值的用户名、UID及shell类型
[root@localhost ~]# cut -d: -f1,3,7 /etc/passwd | sort -t: -k2 -n | tail -1
文本过滤工具
: grep,egrep,fgrep
grep:(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件
语法:grep [OPTIONS] PATTERN [FILE...]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep ‘$USER‘ /etc/passwd
grep `whoami` /etc/passwd
常用选项:
--color=auto: 对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:整行匹配整个单词
-E:使用ERE
正则表达式:
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。
程序支持:grep, vim, less,nginx等
正则表达式分为两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E, egrep
基本正则表达式元字符:
字符匹配:
. : 匹配任意单个字符
[] : 匹配指定范围内的任意单子字符
[^] :匹配指定范围外的任意单个字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
匹配次数: 用在要指定其出现的次数的字符的后面,用于限制其前面的字符出现的次数;模式使用贪婪模式;
* : 匹配其前面的字符任意次;0,1,多次
.* :匹配任意长度的任意字符
\? : 匹配其前面的字符0此或1次;即前面的字符是可有可无的
\+ : 匹配其前面的字符1次或多次;即前面的字符出现至少1次
\{m\}:匹配其前面的字符m次
\{m,n\} :匹配其前面的字符至少出现m次,至多n次
\{,n\} :匹配其前面的字符至多n次
\{m,\} :匹配其前面的字符至少m次
位置锚定:
^ : 行首锚定;用于模式的最左侧
$ : 行尾锚定;用于模式的最右侧
^$:空白行
^PATTERN$:用于PATTERN来匹配整行
单词:非特殊字符组成的连续字符都称为单词
\<或\b:词首锚定,用于单词左侧
\>或\b:词尾锚定。用于单词右侧
\<PATTERN\>:精确匹配完整单词
分组及引用
\(\) :将一个或多个字符捆绑在一起当作一个整体进行处理;\(xy\)*ab
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为
\1: 从模式左侧起,第一个()内所匹配到的字符
\2 :从模式左侧起,第二个()内所匹配到的字符
\3:
……
后向引用:引用前面的分组括号中的模式所匹配到的字符(而非模式本身)
例:
1、在/etc/passwd文件中找以root开头中间也有root的行
2、找出/etc/passwd中的两位或三位数
[root@localhost ~]# grep "\<[0-9]\{2,3\}" /etc/passwd
egrep及扩展的正则表达式
egrep与grep区别:
egrep为 grep 的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:
grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
grep 在处理 {n,m} 时, 需用 { 与 } 处理, 但 egrep 则不需.
egrep: 支持扩张的正则表达式实现类似于grep文本过滤功能:grep -E
语法: egrep [OPTIONS] PATTERN [FILE...]
选项和grep相同,-G支持基本正则表达式
扩展正则表达式的元字符
字符匹配:
. : 匹配任意单个字符
[] : 匹配指定范围内的任意单子字符
[^] :匹配指定范围外的任意单个字符
次数匹配: 用在要指定其出现的次数的字符的后面,用于限制其前面的字符出现的次数;模式使用贪婪模式;
* : 匹配其前面的字符任意次;0,1,多次
? : 匹配其前面的字符0此或1次;即前面的字符是可有可无的
+ : 匹配其前面的字符1次或多次;即前面的字符出现至少1次
{m}:匹配其前面的字符m次
{m,n} :匹配其前面的字符至少出现m次,至多n次
{0,n} :至多n次
{m,} :至少m次
位置锚定
^ : 行首锚定;用于模式的最左侧
$ : 行尾锚定;用于模式的最右侧
\<或\b:词首锚定,用于单词左侧
\>或\b:词尾锚定。用于单词右侧
分组及引用
() :将一个或多个字符捆绑在一起当作一个整体进行处理;\(xy\)*ab
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为
\1: 从模式左侧起,第一个()内所匹配到的字符
\2 :从模式左侧起,第二个()内所匹配到的字符
\3:
……
后向引用:引用前面的分组括号中的模式所匹配到的字符
或:
a | b : a或者b
C | cat : C或者cat
(C|c)cat: Cat或者cat
fgrep:不支持正则表达式元字符
fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。
当无需要用到元字符编写模式时,使用fgrep性能更好
例:
1、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost ~]# echo "/etc/rc.d/init.d/functions" | egrep -o "[^/]+/?$"
2、显示ifconfig命令结果中所有IPv4地址
[root@centos7 ~]# ifconfig | egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
本文出自 “I'm Groot” 博客,请务必保留此出处http://groot.blog.51cto.com/11448219/1835095
原文地址:http://groot.blog.51cto.com/11448219/1835095