Linux篇 | 文本处理工具和正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux篇 | 文本处理工具和正则表达式 相关的知识,希望对你有一定的参考价值。

文本处理工具和正则表达式

如果用一句话形容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就复原了。

练习题

  1. 找出ifconfig “网卡名” 命令结果中本机的IPv4地址
  2. 查出分区空间使用率的最大百分比值
  3. 查出用户UID最大值的用户名、UID及shell类型
  4. 查出/tmp的权限,以数字方式显示
  5. 统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序

以上是关于Linux篇 | 文本处理工具和正则表达式 的主要内容,如果未能解决你的问题,请参考以下文章

Linux正则表达式——基础篇

Linux文本处理工具和正则表达式

shell学习之正则表达式基础篇

文本处理工具和正则表达式

Linux学习笔记 第八章 文本处理工具与正则表达式

Linux相识相知文本处理工具之grepegrepfgrep及正则表达式