我的编程空间,编程开发者的网络收藏夹
学习永远不晚

编程技巧之 Linux 文本处理命令

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

编程技巧之 Linux 文本处理命令

本文转载自微信公众号「程序员历小冰」,作者历小冰 。转载本文请联系程序员历小冰公众号。

合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

本篇文章是《Linux 文本处理命令》 续篇,在前文的基础上再介绍几款有用的 Linux 命令行工具和使用场景。

再啰嗦几句,工具能提供效率,但是有一定的学习曲线和学习成本。很多同学临时想用时,可能会陷入了不会用的尴尬境地,再去网上搜索学习,最终要花费更长时间,还不如使用笨方法处理,这是很多同学不使用这些工具的原因之一。

而且更难的是,思维上改变原有的做事习惯,一个文件中有20多行数据要生成 SQL,好像用手工处理也就是1,2分钟;快捷键记不住,我鼠标移动一下点点也挺快。但是当行数量变大或者复杂性提高时,这些手段的弊端就会显现,逼迫我们去使用正确的手段。

所以,为什么不一开始就使用更快,而且可以处理更加复杂场景的手段呢?

本文主要以两个场景为引子,介绍 join、sort、uniq 命令和 sed 编辑器。

合并两个文件中的关联行

简单说一下场景,有两个文件,里边都是固定格式的行,代表着数据库的一行数据,一个文件是用户相关的数据,有 user_id、username 和 gender 三列,另外一个文件是订单相关的数据,有order_id、price、user_id,time四行,现在要按照 user_id 将两个文件按行合并,也就是user_id相同的行组合成一个新行,如下图所示。

上述两个文件的内容如下所示:

  1. // order.txt user_id是第三列 
  2. o1 1 u1 2011-9 
  3. o2 2 u2 2011-10 
  4. o3 3 u3 2011-10 
  5. o4 4 u1 2011-12 
  6. // user.txt user_id是第一列 
  7. u1 tom 男 
  8. u2 jack 男 
  9. u3 nacy 女 

我们准备使用 join,发现具体命令格式已经忘记了。这时,既可以去网上搜寻,也可以去询问 man

通过 man 你可以了解到 join 的功能描述和参数介绍,一般来说看 DESCRIPTION 一栏下的即可。

从上边的 man 文档可以很清楚的了解到 join 命令使用 equality join 操作对特定的文件进行合并,并输出到标准输出流上。join filed 就是用于合并文件时进行比较的列,默认是两个文件的第一列。可以使用 -1 和 -2 分别制定第一个文件和第二个文件要对比的列。

  1. join -1 3 -2 1 order.txt user.txt  
  2. # 指定以order.txt的第三列和user.txt的第一列来进行对比join 
  3. u1 o1 1 2011-9 tom 男 
  4. u2 o2 2 2011-10 jack 男 
  5. u3 o3 3 2011-10 nacy 女 

会发现,输出中少了一行,order.txt 明明是四行,这是为什么呢?我们再来细看 man 文档,发现了端倪。

两个合并文件的行必须先按照对比列进行排序,否则可能会导致缺失部分行。user.txt 已经按照其第一列排序了,所以,我们只需要使用 sort 命令对 order.txt 按照其第三列进行排序。

sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排序,并将结果输出到标准输出。-k 参数可以指定其根据第几列进行排序。

  1. $ sort -k 3 order.txt  
  2. # 按照数字排序则使用 -n 如果反序则用 -r 
  3. o4 4 u1 2011-12 
  4. o1 1 u1 2011-9 
  5. o2 2 u2 2011-10 
  6. o3 3 u3 2011-10 

我们将上述两个命令结合起来使用,现将 sort 的结果存入 sorted_order.txt,然后再进行 join,就能得到最终的结果。

  1. $ sort -k 3 order.txt > sorted_order.txt 
  2. join -1 3 -2 1 sorted_order.txt user.txt 
  3. u1 o4 4 2011-12 tom 男 
  4. u1 o1 1 2011-9 tom 男 
  5. u2 o2 2 2011-10 jack 男 
  6. u3 o3 3 2011-10 nacy 

另外,上述命令默认的列分隔符都是\t和空格,可以使用 -t 参数来制定字符作为分隔符。

通过上述命令的组合,我们就完成了按照相同列合并两个文件的操作,这也体现了 Linux 的 KISS 思想,每个工具只做一小件事情。

还是基于上述的场景,突然需要统计一下 order.txt 中每个用户购买的订单数量,然后按照订单数进行从大到小排序,这又该如何处理呢?

我们可以将 sort 和 uniq 两个工具结合起来。uniq 命令一般用于检查和删除文件中重复出现的行,我们可以使用它来计算 order.txt 中用户出现的次数。

  1. $ sort -k 3 order.txt | uniq -f 3 -c  
  2. # -f 表示按照第三列进行统计 
  3.   1 o4 4 u1 2011-12 
  4.   1 o1 1 u1 2011-9 
  5.   2 o2 2 u2 2011-10 

删除 Markdown 文件中的超链接

另外一个场景是我编辑文章时遇到的,当时 markdown 格式的文档中有很多超链接,也就是[描述](链接)格式,希望全部把超链接去掉,也就是去掉方括号、圆括号和圆括号中的内容。因为文档中还有很多代码,包含很多圆括号语句,所以必须先准确超链接格式,然后再进行替换。

这里,我们可以使用 sed 命令。sed 的全名叫 stream editor 流编辑器,可以使用程序的方式来编辑文本。想要全面学习它的小伙伴可以阅读 《SED 简明教程》或 《sed 手册》,我们这里只介绍一下最基础的功能,向大家展示使用它的可能性。使用 sed 一般要了解正则表达式,推荐《正则表达式30分钟入门教程》。

sed 最简单的使用方法就是替换文本。比如,我们要将上述的 order.txt 中的 u全部替换为user,则可以使用如下命令。

  1. $ sed 's/u/user/g' order.txt  
  2. # u是被替换的词 user是替换词 
  3. o1 1 user1 2011-9 
  4. o2 2 user2 2011-10 
  5. o3 3 user3 2011-10 
  6. o4 4 user1 2011-12 

sed 还能轻易实现 sublime 或者 vscode 经常使用的多行光标编辑的功能。比如在 order.txt 的每行前头前添加文字。

  1. $ sed 's/^/#/g' order.txt   
  2. # ^在正则表达式中表示一行开头,所以表示是在行开头上加上#字符 
  3. #o1 1 u1 2011-9 
  4. #o2 2 u2 2011-10 
  5. #o3 3 u3 2011-10 
  6. #o4 4 u1 2011-12 

下面,我们直接来看如何将超链接格式转换为纯文本。

  1. $ echo "[链接](http://http://remcarpediem.net/)" | sed -E "s/\[(.*)]\(.*\)/\1/g" 
  2. 链接 

首先,识别[描述](链接) 格式的正则表达式是\[.*\]\(.*\),其中 \[和\( 分别表示匹配文本的[和( 符号。. 表示任何单个字符,*表示某个字符出现了0次或多次, 二者组合 .* 则表示出现0次或者多次任何字符。

综上,上述正则表达的含义就是先出现一个[,再出现0次或者多次任意字符,在出现一个],在出现一个(,在出现0次或者多次任意字符,最后出现一个)。

其次,我们希望用[描述]中的描述文本来替换整个超链接文本,所以需要先识别出方括号中的内容,则需要将其用()单独括起来,表示一个子表达式,也就是\[(.*)\]\(.*\)。

最后,sed 的 s///g 模式下,s 表示替换模式,g 表示匹配每一行有行首到行尾的所有字符,加 g 则一行有多个链接可以匹配处理,不加只能匹配第一个。\1代表第一个子表达式,也就是方括号中的描述内容。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

编程技巧之 Linux 文本处理命令

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

编程技巧之 Linux 文本处理命令

合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

Linux文本处理命令的编程技巧有哪些

Linux文本处理命令的编程技巧有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行
2023-06-15

python编程开发之textwrap文本样式处理技巧

本文实例讲述了python编程开发之textwrap文本样式处理技巧。分享给大家供大家参考,具体如下: 在看python的API的时候,发现python的textwrap在处理字符串样式的时候功能强大 在这里我做了一个demo: textw
2022-06-04

Linux文件处理常用命令操作技巧

我是Linux初学者,做个笔记,以下是Linux几个常用文件处理命令: 命令提示符 [root@localhost~]# 其中:root 表示当前登录用户localhost     表示主机
2022-06-04

Linux 常用文本处理命令和vim文本编辑器

今天,来介绍几个常用文本处理命令和vim文本编辑器 day3--常用文本处理命令和vim文本编辑器col,用于过滤控制字符,-b过滤掉所有控制字符,这个命令并不常用,但可以使用man 命令名| col -b >help.txt 导出一份帮助
2022-06-04

Linux文本处理命令sort详解

sort 对文本文件内容进行排序 用法:sort +选项 +文件名(可跟多个文件) 示例1:cat 1.txtsort 1.txt #文字,默认按字母a-z排序实示例2:cat 2.txtsort 2.
2022-06-04

Linux处理文本的技巧有哪些

本篇内容主要讲解“Linux处理文本的技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux处理文本的技巧有哪些”吧!背景笔者开发机上有很多 Docker 镜像,现在需要删除名为 n
2023-06-27

Linux文本的处理技巧有哪些

Linux文本的处理技巧有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。导读作为一名 Linux 研发人员,几乎每天都要面对文本处理场景。 因此 掌握文本处理套路 并 熟练
2023-06-05

Linux的命令行中文本操作有哪些技巧

本篇内容主要讲解“Linux的命令行中文本操作有哪些技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的命令行中文本操作有哪些技巧”吧!正则表达式翻译领域不乏让人摸不着头脑的词汇,比如
2023-06-12

Linux文件处理命令之diff怎么用

这篇文章主要介绍Linux文件处理命令之diff怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!diff1.作用diff命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。2.格式diff [o
2023-06-16

如何理解Linux基础命令中文本流编辑sed命令

如何理解Linux基础命令中文本流编辑sed命令,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。与vim不同,sed是一种非交互式的文本编辑器,同时它又是面向字符流的,每行数
2023-06-16

Linux中如何使用sed文本处理命令

Linux中如何使用sed文本处理命令,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像。s
2023-06-12

Linux下常用文本处理命令有哪些

这篇文章主要介绍了Linux下常用文本处理命令有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一. sort文件排序,通常用在管道中当过滤器来使用。这个命令可以依据指定的
2023-06-16

Linux中用于文本处理的命令有哪些

本篇内容介绍了“Linux中用于文本处理的命令有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!awk基础概念Awk把文件(或其他方式的输
2023-06-12

Linux echo文本处理命令的使用及示例

echo 在linux帮助文档的描述是显示一行文本,类似于python和java等编程语言中的print语句,实际上它的作用不仅仅如此。可以使用man echo查看详细的参数说明。 echo命令用于输出指定的字符串,常见用法如下:[root
2022-06-03

PHP命令行脚本处理大数据的技巧与实践

PHP命令行脚本处理大数据在当今的互联网时代,数据已经成为了企业和个人的重要资产。无论是在数据分析、网站开发还是系统维护等领域,都需要对大量的数据进行处理和分析。而PHP作为一门强大的编程语言,其命令行脚本功能可以帮助我们高效地处理这些大数据。本文将介绍如何使用PHP命令行脚本
PHP命令行脚本处理大数据的技巧与实践
PHP2024-12-19

Linux命令行快速技巧之定位一个文件的方法

我们都会有文件存储在电脑里 —— 目录、相片、源代码等等。它们是如此之多。也无疑超出了我的记忆范围。要是毫无目标,找到正确的那一个可能会很费时间。在这篇文章里我们来看一下如何在命令行里找到需要的文件,特别是快速找到你想要的那一个。 好消息是
2022-06-04

PHP编程技巧:处理英文写入的问题

PHP编程技巧:处理英文写入的问题PHP是一种功能强大的服务器端脚本语言,广泛应用于Web开发领域。在PHP编程过程中,经常会遇到处理英文写入的问题,特别是在处理文件IO操作或者数据库操作时。本文将探讨如何在PHP中处理英文写入的问题,并
PHP编程技巧:处理英文写入的问题
2024-03-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录