linux文本处理常用指令总结

引子

作为一个偏爱windows的程序员,以前做文本处理的时候总是喜欢在windows下用notepad++等图形化工具处理,比如有时需要把linux服务器上一个文件进行一次全局字符串替换这样简单的操作,还得把文件down到本地编辑好再传回去。这两天买了本《鸟哥的Linux私房菜》,终于静下心系统的学习了一下linux下的文本处理,感觉其实没有想象的难,如果早点学会节约下来的大量时间肯定远超过学习所花的时间。

概览

先说一下本文要介绍的内容:

  1. 简单回顾一下正则表达式,如果熟悉正则,至少知道正则分为基本正则和扩展正则可以跳过该部分。
  2. 本文主体:介绍4个linux文本处理命令:grep、sed、printf、awk。

下面正式开始。

正则表达式回顾

这部分是给会正则表达式的读者简单回顾一下正则表达式,如果没学过正则表达式的读者建议先找相关资料学习正则表达式再来看本文。

正则表达式分为基本正则表达式和扩展正则表达式,内容如下:

基本正则表达式

正则表达式字符含义
^word查找以word开头的文本
word$查找以word结尾的文本
.代表一个任意字符
\转义符
*0到多个字符
[abc]代表一个字符,这个字符是a或b或c
[a-z];[0-9]代表a到z中的一个字符;0到9中的一个数字
[^abc]代表一个非a、b、c的字符
{m,n}m到n个字符

 

扩展正则表达式

正则表达式字符含义
+一个或多个字符
零个或一个字符
|或者
()分组

 

文本处理命令

grep

grep的作用是按行查找字符,输出包含字符的行。

grep用法:

grep一般有两种用法,一种是从文件查找,一种是从管道的输入查找,

  1. grep 'word' file.txt
  2. cat file.txt|grep 'word'

grep的常用参数:

参数含义及示例
-n输出结果加行号
--color=auto匹配的关键字高亮显示
-A3输出匹配行的后三行
-B2   输出匹配行的前两行
-v  反向查找,即输出不包含关键字的行
-i关键字匹配时忽略关键字大小写

grep使用小技巧:

多数情况我们都想要高亮关键词(使用--color=auto参数),因此可以在~/.bashrc文件中添加上:

alias grep='grep --color=auto'

 

,再用

source ~/.bashrc

让配置生效。这样当我们使用grep的时候,就自动带了--color=auto参数。

grep使用示例:

grep的查找主要就是基于基本正则表达式的匹配,下面只是简单的给一些常用例子供参考。

grep 't[ae]st'  //查找tast或test

grep '[0-9]'   //查找数字

grep '[^a-z]oo'  //查找Xoo,其中X是一个非a到z的字符

grep '^the'  //查找以the开头的字符,这里注意区分^出现在[]里时代表“非某字符”,如上个例子,出现在[]外时代表"以某字符开头",如这个例子。

grep '^$'  //查找空行

grep 'o\{2\}'  //查找两个o,这里需要注意,{}在shell里有特殊意义,因此需要转义,这里与一般的正则使用不同,需要注意。

egrep:

我们知道正则表达式分为基本正则表达式和扩展正则表达式,但是grep只支持基本正则表达式,如果要是用扩展正则表达式,需要使用egrep命令。

几个例子:

egrep 'gd|good'  //查找gd或good

egrep 'g(la|oo)d'  //查找glad或good

egrep 'A(xyz)+C'  //查找AXC,其中X是一个或一个以上的'xyz'字符串。

 

sed

sed是一个很强大的命令,可以用来做行删除行新增行选取行替换字符串的替换这5种操作。

sed是一个管道命令,可以处理管道输入。

1.行删除

nl /etc/passwd | sed '2d'  //删除第2行

下面将省略输入管道

sed '2,5d'  //删除第2~5行

sed '3,$d'  //删除第3到最后一行,$代表最后一行

sed '/^$/d'  //删除空行

2.行新增

sed '2a drink tea'  //在第二行下面追加一行"drink tea",a代表append

sed '2i drink tea'  //在第二行上面插入一行"drink tea",i代表insert

sed '2a a\

b\

c'  //在第二行下面追加三行 "a"、"b"、"c",只需要每行结尾加"\"即可。

3.行选取

sed -n '5,7p'  //选取第5到7行输出,必须加-n参数,不然效果就是所有行都被输出,而5到7行输出两次。

4.行替换

sed '2,5c No 2~5 lines'  //将第2到5行替换为一行字符串"No 2~5 lines"

5.字符串替换

sed 's/要被替换的字符串/新的字符串/g'  //固定的格式,开头是s结尾是g,中间三个/分隔开要被替换的字符串和新的字符串,注意这里要被替换的字符串可以是正则表达式。

 

将操作结果直接写入文件

默认用sed对文件做修改之后,只是输出修改后的文件,可以用>写入到新的文件。但是如果想修改原始文件,千万不能>到原始文件,这样执行的结果就是原文件直接被清空了。想要修改原始文件可以用 -i 参数,如:

sed -i '2d' file.txt  //直接将原文件中的第二行删除。

直接修改原文件是很危险的,一旦修改错误无法还原。可以先不加 -i 参数执行命令把修改结果打印出来,确认无误后再加上 -i 参数。

printf

printf这个命令用语言不太好描述,但是一动手就明白了。

把下面的内容保存为printf.txt:

Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33

先cat看一下,是下面这个效果:

现在用printf指令加一些参数来看一下,执行

printf '%10s %10s %10s %10s %10s \n' `cat printf.txt`

输出结果:

是不是比cat输出的结果漂亮多了。

%10s代表这一列的宽度固定为10个字符。更多的格式就不介绍了,这篇文章我们掌握一个%10s就够了。

printf不是管道命令,要想用它处理文件必须像上面的命令那样使用`cat printf.txt`把文件内容给提出来。

printf的使用相当广泛,后面的awk命令中也会应用到printf命令。

awk

awk命令主要是将文件通过分隔符拆成列来处理,还能通过条件判断对不同的行进行不同的处理,甚至还可以进行数值计算~

我们也是通过例子来学习。

我们先用last命令看一下最后登录的5个用户信息:

图中的第一列是用户名,第三列是用户ip,现在我们想摘出这两列,用awk就可以做到:

last -5|awk '{print $1 "\t" $3}'

输出:

命令看起来挺复杂,不要着急,其实很简单。

首先awk使用时有固定的格式:awk '{命令}',单引号和大括号就是固定的格式而已。

然后上面的命令就是

print $1 "\t" $3    //awk默认会用空格和tab将每行分隔为N列,$1代表第一列,$3代表第三列。

这样一看是不是简单多了。

刚刚的last命令产生的数据默认就是用tab分隔的,现在我们看另一个例子,执行 cat /etc/passwd:

这次产生的数据每行是用  : 分隔的,那么想使用awk输出第一列和第三列就需要执行分隔符:

cat /etc/passwd|awk -F ':' '{print $1 "\t" $3}'    // -F ':' 代表指定使用 : 作为分隔符

执行结果:

除了$1,$3这样的特殊符号,

awk的命令中还可以使用下面的特殊符号:

NF :每一行分隔后的列数

NR :行号

下面用一个综合的例子来说明awk的条件判断和数值计算,有这样一组数据保存为pay.txt:

Name    1st   2nd   3rd
VBird   23000   24000  25000
DMTsai  21000   20000  23000
Bird2   43000   42000  41000

现在想加一列"Total",计算每一行的数值总和。

用awk可以完成这个需求:

cat pay.txt |awk 'NR==1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,$2+$3+$4}'

运行结果:

 

这里有几个要点:

  1. 加入条件判断后,awk的格式为: awk '条件1 {命令1};条件2{命令2}'
  2. 条件判断有以下逻辑运算:
    • >
    • <
    • >=
    • <=
    • ==  //注意判断相等要用两个等号
    • !=
  3. 可以直接运算行内列的值($1、$2、$3)。

总结

这篇文章首先回顾了正则表达式(基本正则表达式、扩展正则表达式),然后介绍了4个常用命令,最后我们归纳一下四个命令的用途:

命令用途
grep/egrep关键字查找
sed
  1. 行的删除、添加、替换、选取
  2. 关键字替换
printf 文件格式化输出
awk
  1.  将每行按分隔符拆分成列并选取某些列
  2.  通过逻辑判断对不同行进行不同的处理
  3.  对一行中的几列数值进行计算

 

参考资料:

《鸟哥的Linux私房菜  基础学习篇(第三版)》  第12章

转载于:https://www.cnblogs.com/sheeva/p/6406285.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS——基础选择器

CSS的基础选择器1 CSS指的是层叠样式表2 CSS规则由两个主要的部分构成选择器&#xff0c;以及一条或多条声明3 选择器通常是你需要改变样式的 HTML 元素如h14 每条声明由一个属性和一个值组成&#xff0c;每个属性有一个值&#xff0c;属性和值被冒号分开5 属性大于 …

Linux中chown和chmod的区别和用法

chmod修改第一列内容&#xff0c; chown修改第3、4列内容&#xff1a; chown用法&#xff1a; 用来更改某个目录或文件的用户名和用户组。 chown 用户名:组名 文件路径&#xff08;可以是绝对路径也可以是相对路径&#xff09; 例1&#xff1a;chown root:root /tmp/tmp1 就…

玩大数据期间碰到的一些问题总结

文章目录问题一&#xff1a;Zookeeper节点数量为什么建议是奇数个&#xff1f;问题二&#xff1a;HA机制的Hadoop集群中Journal Node 作用问题三&#xff1a;两个datanode节点互相排斥怎么解决&#xff08;集群无法识别新加入的Datanode&#xff09;&#xff1f;问题四&#xf…

JAVA的SSH框架登录注册

Struts 的MVC设计模式可以使我们的逻辑变得很清晰&#xff0c;主要负责表示层的显示。 Spring 的IOC和AOP可以使我们的项目在最大限度上解藕。 hibernate的就是实体对象的持久化了, 数据库的封装。 项目截图&#xff1a;(代码是按照项目截图上传的&#xff0c;直接对号入座即可…

Visual Studio Code 前端调试不完全指南

本文最初发布于我的个人博客&#xff1a;咀嚼之味Visual Studio Code (以下简称 vscode) 如今已经代替 Sublime&#xff0c;成为前端工程师们最喜爱的代码编辑器。它作为一个大型的开源项目&#xff0c;不断推陈出新&#xff1b;社区中涌现出大量优质的插件&#xff0c;以支持我…

MySQL中(delete、truncate、drop) 的区别

delete、truncate、drop的用法 MySQL 数据表中delete删除数据的通用语法&#xff1a; ###删除 students_tbl 表中 student_id 为3 的记录&#xff1a; delete from students_tbl where student_id3; MySQL 数据表中truncate删除数据的通用语法&#xff1a; ###删除 students_…

机器学习之LDA主题模型算法

文章目录1、知道LDA的特点和应用方向1.1、特点1.2、应用方向2、知道Beta分布和Dirichlet分布数学含义3、了解共轭先验分布4、知道先验概率和后验概率5、知道参数α值的大小对应的含义6、掌握LDA主题模型的生成过程7、知道超参数α等值的参考值8、LDA总结1、知道LDA的特点和应用…

分别写出引入CSS的3种方式, 特点, 优先级

第一&#xff1a;css的三种引入方式 1.行内样式 最直接最简单的一种&#xff0c;直接对HTML标签使用style""&#xff0c;例如&#xff1a; <p style"color:#F00; "></p> 缺点&#xff1a;HTML页面不纯净&#xff0c;文件体积大&#xff0c…

[Go] Template 使用简介

Golang 提供了两个标准库用来处理模板 text/template 和 html/template。我们使用 html/template 格式化 html 字符。 模板引擎 模板引擎很多&#xff0c;Python 的 jinja&#xff0c;nodejs 的 jade 等都很好。所谓模板引擎&#xff0c;则将模板和数据进行渲染的输出格式化后的…

内存泄露监测

2019独角兽企业重金招聘Python工程师标准>>> iOS 内存泄露监测 144 作者 谢谢生活 已关注 2017.05.19 17:38* 字数 4235 阅读 209评论 0喜欢 6 iOS可能存在的内存泄露&#xff1a;block 循环引用。当一个对象有一个block属性&#xff0c;而block属性又引用这个对象…

玩Azkaban跳过的坑

文章目录一号坑&#xff1a;启动Azkaban报错&#xff1a;User xml file conf/azkaban-users.xml doesnt exist.二号坑&#xff1a;报错&#xff1a;failed SslSocketConnector0.0.0.0:8443: java.io.FileNotFoundException: /home/hadoop/app/azkaban/azkaban-web-2.5.0/bin/ke…

两种解除禁止右键、选中、复制的方法

我在网上找的 两种解除禁止右键、选中、复制的方法 1、直接存到书签点击即可 javascript:(function(){var docdocument;var bddoc.body;bd.onselectstartbd.oncopybd.onpastebd.onkeydownbd.oncontextmenubd.onmousemovebd.onselectstartbd.ondragstartdoc.onselectstartdoc.o…

删除节点removeChild()

http://www.imooc.com/code/1700 删除节点removeChild() removeChild() 方法从子节点列表中删除某个节点。如删除成功&#xff0c;此方法可返回被删除的节点&#xff0c;如失败&#xff0c;则返回 NULL。 语法: nodeObject.removeChild(node) 参数: node &#xff1a;必需&…

机器学习自主解决安全威胁离我们还有多远?

曾经听见不止一次这样的问题&#xff1a; “机器学习会替代基于人工经验规则的安全解决方案么&#xff1f;”把这个问题放在去年来看&#xff0c;我们已经得到了非常多的讨论甚至是一些已经实际应用的解决方案&#xff0c;对于人工智能在安全以及其它各种对数据进行价值挖掘的场…

Linux执行定时任务(crontab)遇到的坑

文章目录前言&#xff1a;1、建立定时任务的两种方式1.1、crontab -e1.2、vi /etc/ crontab2、两种方法的区别2.1、用户级2.2、系统级3、解决办法前言&#xff1a; 之前第一次要在生产环境部署定时任务&#xff0c;无奈的是&#xff0c;博主对定时任务这块还是个小白&#xff…

Vue:解决[Vue warn]: Failed to resolve directive: modle (found in Anonymous)

解决问题 [Vue warn]: Failed to resolve directive: modle (found in <ComponentA>) console.error(("[Vue warn]: " msg trace)); 原因是 我把model 写成了 modle 这类错误一般是单词写错了 (found in <Anonymous>) 解决思路

Oracle树查询及相关函数

Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了。依托于该语法&#xff0c;我们可以将一个表形结构的中以树的顺序列出来。在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等&#xff0c;在这里只涉及到…

Mysql常用函数总结

文章目录前言&#xff1a;1、日期相关函数1.1、mysql获取未来、现在、过去的时间&#xff1a;DATE_SUB&#xff08;&#xff09;、DATE_ADD()1.2、格式化日期&#xff1a;date_format&#xff08;&#xff09;1.3、MySQL 日期、时间相减函数&#xff1a;datediff(date1,date2),…

一行Python代码制作动态二维码

目录 1、普通二维码 2、艺术二维码 3、动态二维码 在GitHub上发现了一个比较有意思的项目&#xff0c;只需要一行Python代码就可以快捷方便生成普通二维码、艺术二维码(黑白/彩色)和动态GIF二维码。 GitHub网站参加&#xff1a;https://github.com/sylnsfar/qrcode 用法比…

Vue常用经典开源项目汇总参考-海量

Vue常用经典开源项目汇总参考-海量 Vue是什么&#xff1f; Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是&#xff0c;Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层&#xff0c;并且非常…