百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

[Linux探索之旅]第三部分第一课:数据处理,慢条斯理

sinye56 2025-02-09 14:02 5 浏览 0 评论

内容简介

1第三部分第一课:数据处理,慢条斯理

2、第三部分第二课预告:流、管道、重定向,三管齐下

数据处理,慢条斯理

哈哈,终于到了第三部分了。不知不觉两个部分已经学完了,可喜可贺,掌声给自己!

此时读者内心独白:“我想静静,也不要问我小编是谁。”

好了好了,小编重回淡定。咳咳,看到今天的标题应该会对这一课的内容很有兴趣吧,毕竟我们每天都在跟各种数据打交道。

Linux中的文件里也是各种数据,所以数据处理就显得尤为重要。

之前的课中已经介绍过:大部分Linux的命令是基于Unix操作系统的模式,当然源码是重写的。

因此,虽然Linux是1991年问世的。但是其很多设计理念和命令却沿用了20世纪60年代的模式。

这样的事实对我们学习Linux的人有个好处:不必每隔一段时间就学新东西,很多知识点可以沿用很久。现在近60岁的一个Unix的老工程师,操作Ubuntu等新近Linux发行版基本完全没有问题。

但也许你还是会问这个问题:为什么过了这么多年,好多Linux命令都没变呢?

那是因为没有必要变。因为大多数Linux命令都具有很基本的功能,而且它们在自己的岗位上敬忠职守,工作做得棒棒哒。这些都是Linux系统的《基石》。

这一课我们将学习好几个很基本的命令,这些命令用于提取、排序、筛选文件中的各种数据。

这些命令中,有些你以后几乎每天都会用到,例如grep命令。

grep命令:筛选数据

grep是Globally search a Regular Expression and Print的缩写,意思是《全局搜索一个正则表达式,并且打印》。

意思不太好理解吧?算了,也不需要太理解原意。《那小编你废话个啥...》

grep命令的功能是在文件中查找文本,并且显示文本所在的行。

grep命令极为强大,也是Linux中使用最多的命令之一。它的强大之处在于它不仅可以实现简单的查找,而且可以配合《正则表达式》来实现比较复杂的查找。

至于什么是正则表达式,大家有兴趣可以去百度,学习一下。是程序员需要掌握的知识点之一。

正则表达式提供了搜索文本的一种高级方式。我们不仅在Linux的命令行中用到正则表达式,而且在很多的文本编辑器里也用到,在许多编程语言例如Java,PHP中也会用到。

首先,我们学习grep的简单用法。之后我们再学习如何配合正则表达式来实现复杂的查找。

grep的简单用法

grep的使用方法有很多种。但我们一开始先学习最基本的用法:

grep text file

可以看到,上面就是grep命令的最基本用法。

text代表要搜索的文本,file代表供搜索的文件。

我们用实际的例子来学习。比如我要在用户的家目录的 .bashrc 文件中搜索alias这个文本,而且显示所有包含alias的行。

grep alias .bashrc

怎么样,grep命令很强大吧。如上图所见,grep命令列出了.bashrc文件中所有包含alias的行,并且在小编的终端中,以红色标出了每一个alias。其实grep更像是一个过滤器,它可以筛选出我们要找的对象。

如果我们要用grep命令在一个文件中查找用空格隔开的文本,那么就要加上双引号,例如:

grep "Hello World" file2

-i参数:忽略大小写

默认的情况下,grep命令是区分大小写的,也就是说搜索的文本将严格按照大小写来搜索。比如我搜索的文本是text,那么就不会搜出例如Text,tExt,TEXT等等文本。

但是我们可以给grep加上-i参数,使得grep可以忽略大小写。i是英语ignore的缩写,表示《忽略》。

例如:

grep -i alias .bashrc

可以看到,加了-i参数后,grep的搜索结果就多了 #Alias definitions. 那一行,因为-i参数使得grep搜索不区分大小写。

-n参数:显示行号

-n参数作用很简单,就是显示搜索到的文本所在的行号。n是英语number的缩写,表示《数字,编号》。

grep -n alias .bashrc

-v参数:显示不包含文本的行

-v参数很有意思,v是invert的缩写,表示《颠倒,倒置》。-v参数的作用与正常grep的作用正好颠倒,就是只显示不包含搜索的文本的那些行。

grep -v alias .bashrc

可以看到,这次grep过滤出了.bashrc中所有不包含alias的行。

-r参数:在所有子目录和子文件中查找

如果你不知道你要找的文本在哪个文件里,你可以用强大的-r参数。

r是英语recursive的缩写,表示《递归》。如果用了-r参数,那么grep命令的最后一个参数(grep text file这个模式中的file)需要换成directory,也就是必须是一个目录。因为-r参数是让grep命令能够在指定目录的所有子目录和子文件中查找文本。

例如:

grep -r "Hello World" folder/

表示在folder这个目录的所有子目录和子文件中查找Hello World这个文本。当然了,以上例子中,folder后面的斜杠(/)不是必须的,这里只是为了清楚表明folder是一个目录。只要folder是一个目录,Linux系统是不会搞错的。

Linux中还有一个rgrep的命令,它的作用相当于grep -r

grep的高级用法:配合正则表达式

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

grep配合正则表达式就可以实现比较高级的搜索了。

我们首先来看一眼以下的这个表格,表格中列出了最常用的一些正则表达式的字符以及其含义:

特殊字符含义
.匹配除 "\n" 之外的任何单个字符
^行首(匹配输入字符串的开始位置)
$行尾(匹配输入字符串的结束位置)
[]在中括号中的任意一个字符
?问号前面的元素出现零次或一次
*星号前面的元素可能出现零次,一次或多次
+加号前面的元素必须出现一次以上(包含一次)
|
()表达式的分组(表示范围和优先度)

当然了,上表没有列出所有的正则表达式的字符。大家可以百度,查找完整的表格。

看了上表你可能会说:“我啥也看不懂啊...”。

这是正常的,正则表达式不是那么容易入门的,但也不是太难。要把正则表达式讲清楚,大概需要两课的篇幅,我们这里就不多做介绍了。

首先,为了让grep命令知道我们要使用正则表达式,需要加上-E参数。例如:

grep -E Alias .bashrc

当然了,Linux也有一个命令egrep,其效果等同grep -E

不要怀疑,Alias也是一个正则表达式,只不过没有用到上面表格中的特殊符号而已。

到此为止,没什么新鲜的。我们用正则表达式只不过和之前的搜索类似。接下来,我们才真的要用到正则表达式的特殊字符了。

首先来看这个例子:

grep -E ^alias .bashrc

这个例子中,我们用到了^这个特殊符号,上面的表格里对于^已经做了说明:行首(匹配输入字符串的开始位置)。也就是说,^后面的字符须要出现在一行的开始。

因此,就搜出了如上图中的三行,这三行都是包含alias,并且以alias开头的。

再来举几个例子:

grep -E [Aa]lias .bashrc

上面的表格里解释了[]的作用,是将[]中的字符任取其一,因此[Aa]lias的意思就是既可以是Alias,又可以是alias。因此grep搜索结果把包含Alias和alias的行都列出来了。

再比如:

grep -E [0-4] .bashrc

用于搜索包含0至4的任一数字的行。

grep -E [a-zA-Z] .bashrc

用于搜索包含在a至z之间的任意字母或者A至Z之间的任意字母的行。

其他正则表达式还有很多例子。就不一一列举了。

注意:

其实在Ubuntu这样的Linux发行版中,grep如果要和正则表达式配合,不加-E参数也是可以的,正则表达式始终是激活的。不过有的Unix发行版的系统可能不加-E参数就不能搜索正则表达式,因此为了兼容,我们一般教学的时候会说加上-E参数比较好。

sort命令:为文件排序

sort是英语《排序》的意思。

sort命令用于对文件的行进行排序。

为了演示,我们首先用文本编辑器(可以用nano)来创建一个文件,名叫name.txt比如,然后在里面写入以下的行:

John

Paul

Luc

Matthew

Mark

jude

Daniel

Samuel

Job

随便写几个英语常用名字就可以了。name是英语《名字》的意思。

然后,我们用sort命令来举个例子:

sort name.txt

可以看到,sort命令将name.txt文件中的行按照首字母的英文字典顺序进行了排列。

可以看到,sort命令并不区分大小写。

-o参数:将排序后的内容写入新文件

刚才经过了sort命令的《洗礼》,如果你打开name.txt文件,你会发现,还是原来的那个顺序,单独使用sort命令是不会改变文件的内容排序的,只是把排序结果显示在终端上。

那我们要存储排序结果到新的文件怎么办呢?可以用-o参数。

sort -o name_sorted.txt name.txt

可以看到,name.txt经过sort命令排序之后的内容被储存在了新的文件name_sorted.txt中,而name.txt的内容是不变的。

-r参数:倒序排列

-r参数中的r是reverse的缩写,是《相反,反面》的意思。与普通的仅用sort命令正好相反。

sort -r name.txt

-R参数:随机排序

-R参数比较《无厘头》,因为它会让sort命令的排序变为随机,就是任意排序,每次都可能不一样。但在有些时候,还是很有用的。

sort -R name.txt

为了显示每次排序都是随机的,我们运行了两次以上命令:

-n参数:对数字排序

对数字的排序有点特殊。默认地,仅用sort命令的时候,是不区分首字符是否是数字的,因此还是按照1-9的顺序来排序。例如138会排在25前面,因为1排在2的前面。

那如果我们要sort命令识别整个数字,比如按照大小顺序来说,25应该排在138前面,那该怎么办呢?

就可以请出我们的-n参数了。n是number的缩写。-n参数用于对数字进行排序,按由小到大排序。

为了演示,我们再用文本编辑器来创建一个文件,就叫number.txt好了。

里面随便填一些数字,每行一个:

12

9

216

28

174

35

68

然后用sort不加-n参数和加上-n参数分别测试:

可以看到,不加-n参数时,sort就会把这些数字按首字符来排序,按照1-9的顺序。

加上-n参数,就会把各行的数字看成一个整体,按照大小从小到大来排序了。

wc命令:文件的统计

wc是word count的缩写(不是《厕所》的意思,OK?),word是英语《单词》的意思,count是英语《计算,统计,数数》的意思。因此,wc命令貌似是用来统计单词数目的,但其实wc的功能不仅止于此。wc命令还可以用来统计行数,字符数,字节数等。

跟前面的命令一样,wc命令的用法也是后接文件名。wc命令很有用,应该会成为你经常用到的命令之一。

如果不加选项参数,那么wc命令的返回值有些特殊,有点晦涩难懂。

例如:

wc name.txt

可以看到返回值是9 9 50,最后一个name.txt只是表明文件名,不需考虑。

那么这三个数字:9,9,和50分别表示什么呢?这三个数字,按顺序,分别表示:

  1. 行数

  2. 单词数

  3. 字节数

因为我们之前创建name.txt时,每一行只有一个单词(英语名字),所以这里统计的行数和单词数都是9。

-l参数:统计行数

为了只统计行数,我们可以加上-l参数。l是英语line的缩写,表示《行》。

wc -l name.txt

-w参数:统计单词数

w是英语word的缩写,用于统计《单词》。

wc -w name.txt

-c参数:统计字节数

不知道为什么是c,因为byte或者octet(都可以表示《字节》)的首字母都不是c啊。不管了。

wc -c name.txt

-m参数:统计字符数

不知道为什么是m,因为character(《字符》)的首字母不是m啊。不管了。

wc -m name.txt

uniq命令:删除文件中的重复内容

有时候,文件中包含重复的行。我们也许想要将重复的内容删除。

这时,uniq命令就显得很有用了。

uniq是英语unique的缩写,表示《独一无二的》。

为了演示,我们创建一个文件repeat.txt,里面写入如下排序好的内容(因为uniq命令还是有点《呆》,它只能将连续的重复行变为一行):

Albert

China

France

France

France

John

Matthew

Matthew

patrick

Steve

Vincent

可以看到,有三个France连在一起,两个Matthew连在一起。

我们用uniq命令来处理看看:

uniq repeat.txt

可以看到,三个连续的France只剩下一个了,两个连续的Matthew也只剩一个了。

但是uniq命令并不会改变原文件的内容,只会把处理后的内容显示出来。如果想将处理后的内容储存到一个新文件中,可以使用如下的方法:

uniq repeat.txt unique.txt

可以看到,unique.txt就是包含去掉重复内容的新文件。

-c参数:统计重复的行数

-c参数用于显示重复的行数,如果是独一无二的行,那么数目就是1。

uniq -c repeat.txt

-d参数:只显示重复行的值

-d参数只显示重复的行的值。

uniq -d repeat.txt

cut命令:剪切文件的一部分内容

cut是英语《剪切》的意思。大家平时肯定有剪切文本内容的经历吧,一般剪切了还要把剪切的内容粘贴到某处。

cut命令用于对文件的每一行进行剪切处理。

-c参数:根据字符数来剪切

比如说,我们要name.txt的每一行只保留第2至第4个字符。可以这样做:

cut -c 2-4 name.txt

总结

  1. grep命令应该算是最常用的在文件中查找文本的工具了。

  2. grep命令可以通过正则表达式来查找。正则表达式一开始学习比较烦,但是很强大。我们也可以调用egrep命令。

  3. sort命令用于为文件中的行按字母顺序排序。使用-n参数可以按照数字顺序排序。

  4. wc命令可以统计文件中行数,单词数,字符数,字节数。

  5. uniq命令可以用于删除文件中重复的内容。

  6. cut命令剪切文件的一部分内容。

当然了,篇幅有限,我们不可能对每个命令的每个参数和每种用法都做详细介绍,大家可以用man命令来查询各个命令的手册,自己学习。

第三部分第二课预告

今天的课就到这里,一起加油吧!

下一课我们学习:流、管道、重定向,三管齐下

*新朋友请关注「程序员联盟」微信搜公众号 ProgrammerLeague

程序员联盟官网:

coderunity点com

小编微信号: frogoscar

小编邮箱: enmingx@gmail.com

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: