Linux是基于文件的系统,可以认为Linux的所有命令都是对文件的操作(有些操作的是变量),熟练掌握Linux的文本处理工具是所有学习linux所必需要掌握的,尤其是准备跨入Linux行业的同学更是如此,在工作中我们将会遇到非常多而且内容庞大的文本,批量处理和精确定位将成为工作的日常操作。有时即使我们已经掌握了所有的文本处理工具,面对繁杂的文本也会感到无从着手,这是很正常的,Linux文本处理技巧是需要时间和练习去不断积累的,所以不要感到疲倦,下面来梳理一下日常中常见到的命令吧。
一、Linux的基本文本处理命令:
1、 cat,连接文件并打印到标准输出
cat [OPTION]... [FILE]...
-A 等同于:-vET
-b 非空的行显示行号,被-n覆盖
-e 等同于-vE
-E 在每行加上$
-n 显示行号
-s 压缩连续的空行为一个空行(空行为回车,如果回车前有空格不压缩)
-t 等同于-vT
-T 显示tab为^I
-v 使用^和M-符号,除了LFD和TAB
同cat相似的命令
tac:文本倒行显示
rev:文本的每行倒序显示
查看文本:less和more:less is better then more
head和tail命令:
head:默认显示文本的前十行
-c 只显示前几个字节
-n 显示前几行
tail:显示后十行
-c和-n 选项和head一样
-f :动态监视最后几行
怎样监视/var/log/secure 并且只有发生变化时打印变化?
[[email protected] ~]# tailf -n 0 /var/log/secure & cut
-d:指定分隔符,默认为tab
-c:按字符数来切割某字段
-f:选取字段
paste:将两个文件同行号合并在一起
-d:指定分隔符,默认为tab
-s:一个文件的所有行显示为一行
wc:统计文件的数据
-l:统计行数
-w:统计单词数
-c:统计字节数
-m:统计字符数
sort:给文件的行排序
-b:忽略行首的空格,将第一个非空字符与其他行比较
-f:将小写字母转为大字字母来比较,即忽略大小写,全部按大写字母比较
-g:按照常规的数字排序,数字数值大的排在后面
-n:按照字符串数值比较,和-g的区别
-r:逆序排列
-u:删除输出中的重复行
-t:指定分隔符
-k:选取比较的字段
uniq:报告或省略重复的行(连续相同才是重复)、
-c:显示重复行的数量
-d:将显示重复的行
-u:显示不重复的行
通常,用sort排序将重复的行放在一起然后用uniq去重统计
diff:一行一行比较文件的内容,vimdiff更直观
-u:以统一的格式输出比较的结果,以便于patch命令去恢复文件
patch:通过diff的差异文件来恢复原始文件,并将生成的文件命名为基础文件名(注意一定要加-b选项)
-b自动备份基础文件为file.orig
1、找出ifconfig命令结果中本机的所有IPv4地址:
[[email protected] ~]# ifconfig |grep "netmask"|cut -d ‘n‘ -f2|grep "\b[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}\b" -o 10.1.70.102 127.0.0.1 192.168.122.1
2、查出分区空间使用率的最大百分比值
[[email protected] ~]# df |tr -s ‘ ‘|cut -d ‘ ‘ -f5|egrep -o "[0-9]{1,2}"|sort -nr|head -1 38
3、查出用户UID最大值的用户名、UID及shell类型
[[email protected] ~]# sort -nr -t: -k3 /etc/passwd|head -1|cut -d: -f1,3,7 nfsnobody:65534:/sbin/nologin
4、查出/tmp的权限,以数字方式显示
[[email protected] ~]# stat /tmp/|grep "Access"|head -1|cut -c11-13 777
5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
[[email protected] ~]# netstat -nt|tr -s ‘ ‘|cut -d ‘ ‘ -f5|egrep "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" -o|sort|uniq -c 2 10.1.250.91
二、linux三剑客之grep
grep:(Global search REgularexpression and Print out the line)文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行。
模式:由正则表达式字符及文本字符所编写的过滤条件
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep有诸多选项,详细的选项可以查看
http://www.lampweb.org/linux/3/27.html
下面列出较常用的选项
--color=auto: 对匹配到的文本着色显示
-v: 显示不能够被pattern匹配到的行
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息,常用作脚本判断
-e:实现多个选项间的逻辑or关系
-w:整行匹配整个单词,单词可包括字母、数字和下划线
-A:显示匹配行及其前几行
-B:显示匹配行及其前几行
-C:显示匹配行及其上下几行
-l:打印符合匹配模式的文件名
-H:在显示匹配行前加文件名
三、正则表达式
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
正则表达式常用来匹配文本内容,shell通配符常用来匹配文件路径
可以通过man 7 regex来查看帮助
正则表达式元字符分类:字符匹配、匹配次数、位置锚定、分组
正则表达式可以分为两类:
1、基本正则表达式BRE
字符匹配:
. :匹配任意单个字符
[]:匹配方括号中的任意单个字符
[^]:匹配非方括号中指定的字符
[[:digit:]]匹配单个数字,同[0-9],使用时双方括号
[[:alpha:]]匹配任意单个大小写字母
[[:lower:]]匹配单个小写字母
[[:upper:]]匹配任意单个大写字母
[[:alnum:]]匹配单个大小写或数字
[[:punct:]]匹配任意单个标点符号
[[:space:]]匹配单个空格
匹配次数:
* :匹配前面的字符任意次(贪婪模式,在其后面加问号取消贪婪模式)
.* :任意字符任意长度
\?:匹配前面的字符0次或一次
\+:匹配前面的字符一次或多次
\{m,n\}匹配前面的字符m到n次、
若m为零,则最大匹配n次
若n为零,则最小匹配m次
位置锚定:
^ :匹配以某字符开头
$ :匹配以某字符结尾
^$:匹配没有空格的行,即只有回车行
^[[:space:]]*$:匹配包括空格的行
\<或\b:词首锚定
\>或\b:词尾锚定
分组:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)
2、扩展正则表达式ERE
grep -E 或egrep支持正则表达式
次数匹配:
*:匹配前面字符任意次
?:0次或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置锚定:
^ :行首
$ :行尾
\<, \b :词首
\>, \b :词尾
分组:
()或\(\)都支持
“or”匹配:
a|b :匹配a或者b
C|cat: C或cat
(C|c)at:Cat或cat
具体使用细节请看下篇博客: