文本处理工具和正则表达式
如果用一句话形容Linux系统,我想就是“一切皆文件”在适合不过了。系统的服务、软件、日志、命令的输出结果都是基于文本的,所以我们很有必要知道Linux的常用的文本处理工具有哪些?而且,我们用的这些处理文本工具都离不开一个技术:“正则表达式”,它不止适用于Linux,对于一些语言,如Java、Python都能用,甚至Windows系统里也能用正则表达式。那么,如何灵活的运用正则表达式就是这篇博客的意义。
一.文本处理工具
1.抽取文本的工具
- 文件内容: less 和 cat
- 文件截取: held 和 tail
- 按列抽取:cut
- 按关键字抽取:grep
2.文件查看
(1)cat
cat可直接查看文件,是很常用的命令。
格式:cat [OPTION]... [FILE]...
[OPTION]有:
"-n": 对文本显示的每一行进行编号
"-s": 对文本,压缩连续的空行为一行
"-b": 对文本,除了空行进行编号
"-A": 显示所有控制符。因为一些看不见的特殊符号(如空格、Tab键等),可能对脚本有影响,这些特殊符号直接用cat命令查看不到,需要加“-A”参数,可以查看换行显示为“^M”,Tab键显示为“^I”;还可以用查看二进制的方式查看文本的特殊符号,命令为"hexdump -C 文件"。所以如果你的脚本如果怎么也运行不了,可以从这方面考虑下,是不是有看不见的特殊符号导致的。
"-E": 显示行结束符$
同类型命令
tac
格式:tac 文件
tac命令与cat命令的书写是相反的,而且tac的显示结果和cat显示结果也是相反的,即与cat显示结果,“竖行”的反向显示。
rev
格式:rev 文件
rev的显示结果和cat的显示结果,是“横行”的反向显示。
(2)分页查看文件内容
1) more:分页查看文件
格式:more [OPTIONS...] FILE...
[OPTIONS]:
-d: 显示翻页及退出提示
回车往下翻一行
空格往下翻一页
翻到底直接退出;提前退出按“q”键
2) less
格式:less 文件
支持向上翻页,支持向下翻页
翻到底不会退出,退出按“q”键
less命令是man命令使用的分页器
支持搜索,输入“/”符号,后面跟你搜索的内容。n/N跳转到下一个/上一个搜索结果
(3)显示文本前行或后行内容
1) head
格式:head [OPTION]... [FILE]...
[OPTION]:
-c # 指定获取前#字节
-n # 指定获取前#行
-# 指定行数
head不加选项,默认显示前10行内容
示例:
cat -n /etc/passwd | head -n 3 (查看/etc/passwd文件前3行内容)
2) tail
- tail命令经常用于观察“持续发生的日志”,因为它有“-f”选项。一般用tail查看完文件就退出了,但加上“-f”,能够持续查看文件,观察文件的变化。
- 如果我们把跟踪的文件删除,那么在创建同名文件,添加内容,“tail -f 文件”查看跟踪文件,不会看到变化,也不会报错,因为“-f”选项跟踪的是“系统给文件分配的数字,文件是根据数字对应的”。
- 如果加“-F”选项,tail跟踪的是文件名。如果把文件删除,“tail -F 文件”跟踪查看文件时会报错。如果在把文件重新创建(同名),文件就又能跟踪查看了。
格式:tail [OPTION]... [FILE]...
[OPTION]:
-c # 指定获取前#字节
-n # 指定获取前#行
-# 指定行数
-f 跟踪显示文件fd新追加的内容,常用日志监控。相当于--follow=descriptor
-F 跟踪文件名,相当于--follow=name --retry
tailf 类似tail –f,当文件不增长时并不访问文件
示例:查看IP地址的行
ifconfig | head -2 | tail -1
(4)按列抽取文本cut和合并文件paste
1)cut
cut [OPTION]... [FILE]...
[OPTION]:
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
示例1:抽取/etc/passwd文件以“:”号为分隔符,显示第1列和第3列的内容
cut -d: -f1,3 /etc/passwd
示例2:抽取/etc/passwd文件以“空格”为分隔符,显示第1列和第3列的内容
cut -d: -f1,3 --output-delimiter=“ ” /etc/passwd
示例3:抽取/etc/passwd文件以“:”号为分隔符,显示第1-3列的内容
cut -d: -f1-3 /etc/passwd
示例4:抽取/etc/passwd文件以“:”号为分隔符,显示第1-3列和第6列的内容
cut -d: -f1-3,6 /etc/passwd
示例5:抽取df显示硬盘的利用率
df | cut -c35-36
示例6:抽取IP地址
ifconfig | head -2 | tail -1 | cut -c6-20
ifconfig | head -2 | tail -1 | tr -s " " | cut -d" " -f3
2)paste:合并两个文件同行号的列到一行
paste [OPTION]... [FILE]...
[OPTION]:
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
横向合并
paste 文件1 文件2
纵向合并
cat 文件1 文件2
示例1:指定分隔符,把Tab键指定为“-”
paste -d "-" 文件1 文件2
示例2:把两个文件的内容指定到一行显示
paste -s 文件1 文件2
3.分析文本工具
- 文本数据统计: wc
- 整理文本:sort
- 比较文件:diff和patch
(1)收集文本统计数据wc
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行,下面是wc查看文件的格式:
wc 文件
39 237 1907 文件名
行数 单词数(以空格分割,就认为是一个单词) 文件大小(多少字节) 文件名
常用选项
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m只计数字符总数
-L 显示文件中最长行的长度
(2)文本排序:sort
常用选项
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理 -f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k X 选项按照使用c字符分隔的X列来整理能够使用多次
示例1:
sort -t: -k3 -nr /etc/passwd
翻译:排序,“-t”是指定字符是“:”号,“-k”是按照字符顺序排序,例如1001排排在107前面,因为107的第三位比1001的第三位大,所以1001排在107前面。但是我们想按数字的大小来排序,而不是按字符的顺序,所以加“-n”选项,按照数字排序。“-r”是反向排序。
示例2:取出磁盘分区利用率最大的值
df | cut -c35-36 | sort -n
df | tr -s " " ":" | cut -d: -f5 | sort -nr | head -1
(3)合并输出结果中相邻一样的行:uniq
从输入中删除前后相接的重复的行
uniq [OPTION]... [FILE]...
[OPTION]:
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行(注:连续且完全相同方为重复)
示例1:(uniq常和sort 命令一起配合使用)
sort userlist.txt | uniq -c
示例2:显示两个文件相同的行
cat f1(文件f1内容)
a
b
c
cat f2(文件f2内容)
1
a
b
2
cat f1 f2 | sort | uniq -d(显示两个文件相同的行)
(4)比较两个文件
1)diff:比较两个文件的不同之处
格式:diff 文件1 文件2
一般加“-u”选项:diff -u 文件1 文件2
示例1:比较foo.conf和foo2.conf的区别
示例2:比较f1和f2的区别
cat f1(文件f1内容)
a
b
c
cat f2(文件f2内容)
1
a
b
2
diff -u f1 f2 > fiff.txt(比较f1文件和f2文件的区别存放到diff.txt文件)
当我们f2文件丢失,可以通过f1文件和diff.txt文件恢复,恢复的命令是patch。恢复的方法看patch。
2)patch
根据上面的f1、f2、diff.txt文件,如果删除f2文件,想要恢复f2文件,使用“patch -b f1 diff.txt”。注意,执行命令后的f1文件其实是被删之前的f2文件,那f1文件去哪了呢。其实“-b”选项的作用是备份,它将f1先备份一份,后缀是“.orig”,然后在恢复文件,恢复后把f1改回f2,把f1.orig改回f1就复原了。
练习题
- 找出ifconfig “网卡名” 命令结果中本机的IPv4地址
- 查出分区空间使用率的最大百分比值
- 查出用户UID最大值的用户名、UID及shell类型
- 查出/tmp的权限,以数字方式显示
- 统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序