Linux命令三剑客:grep、sed、awk总结

文章目录

  • 前言
  • 一、grep
    • 命令语法
    • 实例
    • grep结合pattern正则
  • 二、sed
    • 命令语法
    • 案例
  • 三、awk
    • 命令语法
    • 实例

前言

最近看到了几篇关于linux命令grep、sed、awk的文章,这里总结下,方便后面使用。

一、grep

grep命令(grep的全称:Global search Regular Expression and Print out the line)主要用于文本内容的查找。它支持正则表达式查找。

命令语法

grep提供两种方式:

◆ grep [option] [pattern] testfile
#第一种是从文本中直接使用pattern匹配搜索
◆ stdout | grep [option] [pattern]
#第二种是从标准输出中处理 grep所提供的option(参数选项)

参数解释:
在这里插入图片描述
在这里插入图片描述

实例

做一个最简单的示例,如下先准备一个测试文件,内容如下:
在这里插入图片描述
从文本文件中搜索test字符串
在这里插入图片描述
可以看到包含有"test"的行被打印出来,默认grep是区分大小写的。所以"Test","TEST"没有被匹配出来。

如果想要不区分大小写,我们可以加"-i"的参数。如下:
在这里插入图片描述当前我们的测试文本内容比较少,我们肉眼可以见到是在第几行。如果文本行数较多的情况下那就不太方便了,这里就可以用到"-n"的参数
shell三剑客之grep
包含有"test"的并且不区分大小写的行在开头会显示行号,现在的结果中匹配的关键字所在行全部内容都会输出。

如果只想要看到匹配的关键字,怎么办?使用"-o"参数即可
在这里插入图片描述

有时候我们需要对整个目录去搜索关键字,如果直接使用grep “test” 目录名,会报错。加参数’-r’就可以避免这个问题
在这里插入图片描述
可以看到shellTest目录下的两支文件test1.txt以及testfile都包含test被打印出来了

“-q”选项表示使用静默模式,在此模式下grep命令不会有任何的打印结果,无论是否有匹配到。一般来说我们可以根据echo $?来查看上一条指令(grep)的执行结果,如果返回结果为0,表示grep有匹配到了,如果返回结果为1,表示grep没有匹配到。
在这里插入图片描述
一般我们可以shell脚本中去用if条件分支进行判断,如果echo $?结果为0,就去执行相应的操作。

grep结合pattern正则

前面我们介绍了参数的基本用法,grep的强大之处其实是和正则表达式一起才有作用。

注:本篇文章不会具体介绍正则表达式的使用,如果不了解正则表达式的同学推荐去看下之前相关的文章
我们知道在正则表达式中分为了两类:

01 基本正则表达式

◆ . 单个字符
◆ * 表示前面的字符连续出现任意次,包括0次
◆ ^ 表示锚定行首
◆ $ 表示锚定行尾
◆ [a-z] [0-9] 区间范围
......

02 扩展正则表达式

◆ ?表示匹配其前面的字符0或1次
◆ + 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
◆ () 分组
◆ {} 连续匹配
◆ | 匹配多个表达式的任何一个
......

如查询以"lemon"单词开头
在这里插入图片描述
查找文件中空白行的数量
在这里插入图片描述

正则“^$”表示空白行,参数“-c”表达计算行数

连续字数的正则匹配,如:查找“appium”,p是连续的
在这里插入图片描述
“{2}”表示p连续出现了两次,可以发现结果是匹配不到的。因为{}是扩展正则表达式,grep默认是基本正则表达式,如果需要支持扩展正则表达式,我们需要加"-E"选项:
在这里插入图片描述

二、sed

sed命令主要用于文本内容的编辑。默认只处理模式空间,不处理原数据,而且sed是针对一行行数据来进行处理的。Stream Editor文本流编辑,是一个"非交互式的"面向字符流的编辑器。

常用功能
(1) 、打印功能
能同时处理多个文件多行内容,可以不对原文件改动把整个文件输入到屏幕。
(2)、文本替换
把匹配到模式的内容输入到屏幕上。
(3)、修改文本
可以对原文件改动,但是不会在屏幕上返回结果。(谨慎使用!!!)

总结:
Sed就是修改文本、替换文本、打印文本的一个工具。

执行流程:

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行…当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。如下,简单流程图。
在这里插入图片描述
补充:
一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。

例如:使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。

命令语法

Sed [选项] 编辑命令 文件
Shell 命令 | sed [选项] 编辑命令

常用选项

-n:只显示匹配处理的行
-e:执行多个编辑命令(一般使用;代替)
-i:直接在文件中进行修改,不输出到屏幕
-r:支持扩展正则表达式
-f:从脚本文件中读取内容并执行文件中的编辑命令。
补充:这里比较常用的-n -r -e(用;代替)

常用编辑命令:

p:打印匹配行
d:删除匹配行
a:在定位行号后附加新文本信息
i:在定位行号后插入新文本信息
c:用新文本替换定位文本
r:从另一个文件中读文本,类似输入重定向(<)
w:写文本到一个文件,类似输出重定向(>)
s:使用替换模式替换相应模式
补充:这里比较常用的p d s

案例

案例1:
n 一般和 p连用
//打印文件的3-6行,使用行号

odysee:~$sed -n '3,6p' /etc/passwd

在这里插入图片描述
//打印(^odysee)以odysee开头的行,使用正则

sed -n '/^odysee/p' /etc/passwd

在这里插入图片描述

案例2:
参数d(删除匹配行),不会改变原文件内容
//$表示最后一行,!表示取反,d删除匹配行,p打印,;多个命令分割符
//连起来就是只打印文件最后一行

sed -n '$!d;p' /etc/passwd

在这里插入图片描述
查看原文件,并没有改变
在这里插入图片描述
案例3:

参数a(在定位行号后附加新文本信息)
//1a表示在第一行后面追加,也可使用正则

sed '1a abc' demo.txt

在这里插入图片描述
案例4:

参数i(在定位行号后插入新文本信息)
//1i:在第一行前插入,可以使用正则

sed '1i abc' demo.txt

在这里插入图片描述

三、awk

awk同sed命令类似,只不过sed擅长取行,awk命令擅长取列。(根据了解awk是一种语言,不过我们只关注他处理文本的功能,用的好的话几乎可以取代excel)
原理:一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理。
awk命令主要用于文本内容的分析处理。
如果对处理的数据需要生成报告之类的信息,或者处理的数据是按列进行处理的,最好使用awk。

命令语法

awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名

实例

打印某几列

$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI

我们将字符串 I love you 通过管道传递给awk命令,相当于awk处理一个文件,该文件的内容就是I love you,默认通过空格作为分隔符(不管列之间有多少个空格都将当作一个空格处理)I love you就分割成三列了。

假如分割符号为.,可以这样用

$ echo '192.168.1.1' | awk -F "." '{print $2}'
168

条件过滤

我们知道awk的用法是这样的,那么pattern部分怎么用呢?

awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87

$2>=90 表示如果当前行的第2列的值大于90则处理当前行,否则不处理。说白了pattern部分是用来从文件中筛选出需要处理的行进行处理的,这部分是空的代表全部处理。pattern部分可以是任何条件表达式的判断结果,例如>,<,==,>=,<=,!=同时还可以使用+,-,*,/运算与条件表达式相结合的复合表达式,逻辑 &&,||,!同样也可以使用进来。另外pattern部分还可以使用 /正则/ 选择需要处理的行。

判断语句

判断语句是写在pattern{ 命令 }命令中的,他具备条件过滤一样的作用,同时他也可以让输出更丰富

$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"优秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 优秀
jack 良好

BEGIN 定义表头

awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名

使用方法如下:

$ awk 'BEGIN{print "姓名 语文 数学 英语"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}' score.txt
姓名 语文数学英语
tom 60 60 60
kitty 90 95 87
jack 72 84 99

这里要注意,我为了输出格式好看,做了左对齐的操作(%-8s左对齐,宽8位),printf用法和c++类似。

不仅可以用来定义表头,还可以做一些变量初始化的工作,例如

$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'
1.26 0.12

这里OFMT是个内置变量,初始化数字输出格式,保留小数点后两位。

END 添加结尾符

和BEGIN用法类似

$ echo ok | awk '{print $1}END{print "end"}'
ok
end

数据计算

这个地方我要放大招了!上面的知识点你都记住了吗?

$ awk 'BEGIN{print "姓名 语文 数学 英语 总成绩"; \
sum1=0;sum2=0;sum3=0;sumall=0} \
{printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\
sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\
END{printf "%5s%5d%5d%5d%5d\n","总成绩",sum1,sum2,sum3,sumall}'\score.txt
姓名 语文 数学 英语 总成绩tom 60 60 60 180
kitty 90 95 87 272jack 72 84 99 255
总成绩 222 239 246 707

因为命令太长,末尾我用\符号换行了。。

  • BEGIN体里我输出了表头,并给四个变量初始化0
  • pattern体里我输出了每一行,并累加运算
  • END体里我输出了总统计结果
  • 当然了,一个正常人在用linux命令的时候是不会输入那么多格式化符号来对齐的,所以新命令又来了
  • column -t(鬼知道我为什么会记得这么多乱七八糟的命令。)
    在这里插入图片描述
    有用的内置变量

NF:表示当前行有多少个字段,因此$NF就代表最后一个字段
NR:表示当前处理的是第几行
FILENAME:当前文件名
OFMT:数字输出的格式,默认为%.6g。表示只打印小数点后6 位

$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync

内置函数

awk定义了很多内置函数,用awk来写shell脚本倒是一个不错的选择,但是大多数我们是用不上的,以下是常用函数

$ echo 1 2 | awk '{print $1+sqrt($2)}'
2.41421

随机数,先设置种子再随机

rand() 0 <= n < 1,srand([expr]) |将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。

$ echo 1 | awk 'BEGIN{srand()}{print rand()}'
0.929885

字符串
Linux三剑客传 | 老大:AWK

系统常用
在这里插入图片描述

不常用算数:
在这里插入图片描述

参考:
https://www.toutiao.com/i6741262116495294987/
https://www.toutiao.com/a6726544069754880523/
https://www.toutiao.com/a6675158518468706829/
https://www.toutiao.com/a6705966822589465100/

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

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

相关文章

python 机器学习资料

!(7 Steps to Mastering Machine Learning With Python) [http://www.kdnuggets.com/2015/11/seven-steps-machine-learning-python.html] 转载于:https://www.cnblogs.com/zk47/p/6448506.html

Flask-SQLAlchemy 中如何不区分大小写查询?

例如下面的 User 模型&#xff0c;在数据库中查询时并不会区分大小写 class User(db.Model):__tablename__ usersid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(64), uniqueTrue, indexTrue)password_hash db.Column(db.String(128)) 这时&…

Git常用指令及功能总结

文章目录前言&#xff1a;1、常用的git指令2、常用git功能及操作2.1、下载代码&#xff1a;2.2、当前分支和master保持一致2.3、修改代码后提交代码到指定分支2.4、版本回退&#xff08;时空穿梭机&#xff09;2.5、概念工作区和暂存区2.6、添加远程库2.7、分支管理2.8、标签管…

MacOS下MySQL配置

先去官网下载一个 MySQL for mac http://www.cnblogs.com/xiaobo-Linux/ 命令行运行终端&#xff0c;运行下面两条命令&#xff1a; 12alias mysql/usr/local/mysql/bin/mysqlalias mysqladmin/usr/local/mysql/bin/mysqladmin方便终端直接输入mysql命令&#xff0c;而不是必须…

HashMap为什么在多线程下会让cpu100%

首先HashMap并不是sun公司多线程提供的集合&#xff0c;很多时候我们的程序是一个主线程&#xff0c;用了hashmap并没有什么问题&#xff0c;但是在多线程下会出现问题。 hashmap是一个哈希表&#xff0c;存储的数据结构也可以是一个线性数组&#xff0c;我们的存储的数据都在e…

flask中关于endpoint端点、url_map映射、view_func视图函数,view_functions、及视图函数名是否何以相同的问题?

视图函数中关于url_map视图的映射&#xff1a;应该是[ url->methonds->endpoint ] 而整个请求的过程&#xff0c;是先通过url地址映射到端点endpoint&#xff0c;然后通过endpoint找到试图函数view_func&#xff08;扩展:在Flask类里边有一个view_funtions的属性&…

SparkSQL-从0到1认识Catalyst

文章目录前言正文预备知识&#xff0d;Tree&RuleCatalyst工作流程ParserAnalyzerOptimizerSparkSQL执行计划前言 这篇文章是转载一位大神的文章&#xff0c;为什么要转载的&#xff0c;实在是因为写的太经典了&#xff0c;所以忍不住希望能有更多的人可以看到。后续还会转…

为什么程序员一定要加班?

摘要&#xff1a; 一提到程序员&#xff0c;大多数人的印象大概就是死宅、无趣、没有私人生活&#xff0c;除了上班写写写代码&#xff0c;加班写代码更是标配。似乎在深夜顶着鸡窝头&#xff0c;目光呆滞&#xff0c;面无表情敲键盘的场景才是一个程序员的真实写照。 当然&…

javascript 反斜杠\

通常&#xff0c;我们在动态给定一个div的innerHTML时&#xff0c;通常是样做的&#xff1a; <div id"demo1" /> <SCRIPT> var demo document.getElementById("demo1"); var str "<h1>" "<a hrefjavascript:; ο…

SQLAlchemy 中的 Session、sessionmaker、scoped_session

SQLAlchemy 中的 Session、sessionmaker、scoped_session 目录 一、关于 Session 1. Session是缓存吗&#xff1f;2. Session作用&#xff1a;3. Session生命周期&#xff1a;4. Session什么时候创建&#xff0c;提交&#xff0c;关闭&#xff1f;4. 获取一个Session&#xf…

没有任何权力的“项目经理”该如何当?

2016.11.25 11:40* 字数 1454 阅读 108评论 0喜欢 1小王几月前被任命为项目经理&#xff0c;负责9个人的工作安排。工作上要对上负责&#xff0c;完成项目&#xff0c;可对下小王却没有对小组成员的工作考核权&#xff0c;也就是说&#xff0c;不能影响他们的收入。 图片发自简…

SparkSQL之Join原理

文章目录前言&#xff1a;Join背景介绍Join常见分类以及基本实现机制Hash JoinBroadcast Hash JoinShuffle Hash JoinSort-Merge Join总结前言&#xff1a; 写SQL的时候很多时候都有用到join语句&#xff0c;但是我们真的有仔细想过数据在join的过程到底是怎么样的吗&#xff…

SQLAlchemy中filter_by()和filter()的用法不同

filter_by() 和 filter() 的最主要的区别&#xff1a; 模块语法><&#xff08;大于和小于&#xff09;查询and_和or_查询filter_by()直接用属性名&#xff0c;比较用不支持不支持filter()用类名.属性名&#xff0c;比较用支持支持 谈 filter_by() 的语法之前先看下 filt…

python爬虫从入门到放弃(六)之 BeautifulSoup库的使用

上一篇文章的正则&#xff0c;其实对很多人来说用起来是不方便的&#xff0c;加上需要记很多规则&#xff0c;所以用起来不是特别熟练&#xff0c;而这节我们提到的beautifulsoup就是一个非常强大的工具&#xff0c;爬虫利器。 beautifulSoup “美味的汤&#xff0c;绿色的浓汤…

SparkHiveSQL中Join操作的谓词下推?

前言&#xff1a; SparkSQL和HiveSQL的Join操作中也有谓词下推&#xff1f;今天就通过大神的文章来了解下。同样&#xff0c;如有冒犯&#xff0c;请联系。 正文 上文简要介绍了Join在大数据领域中的使用背景以及常用的几种算法&#xff0d;broadcast hash join 、shuffle h…

【转载】通过金矿模型介绍动态规划 (动态规划入门)

先附上原文地址&#xff1a;http://www.cnblogs.com/sdjl/articles/1274312.html 通过金矿模型介绍动态规划 对于动态规划&#xff0c;每个刚接触的人都需要一段时间来理解&#xff0c;特别是第一次接触的时候总是想不通为什么这种方法可行&#xff0c;这篇文章就是为了…

flask模型中【外键】relationship的使用笔记

模型中relationship的使用笔记 模型.PY class User(db.Model):# __tablename__ user1 #定义表名id db.Column(db.Integer, primary_keyTrue, autoincrementTrue)username db.Column(db.String(10), nullableTrue)password db.Column(db.String(64), nullableTrue)phone …

六种方式实现生产者消费者(未完)

2019独角兽企业重金招聘Python工程师标准>>> 一、利用Object对象是wait和notify\notifyAll package com.jv.parallel.consumerandproducer.objectwait;public class Car {private volatile int flag 0;public void showConsumer(){System.out.println("I am a…

SQL中基于代价的优化

还记得笔者在上篇文章无意中挖的一个坑么&#xff1f;如若不知&#xff0c;强烈建议看官先行阅读前面两文&#xff0d;《SparkSQL Join原理》和《Join中竟然也有谓词下推?》 第一篇文章主要分析了大数据领域Join的三种基础算法以及各自的适用场景&#xff0c;第二篇文章在第一…

git如何解决冲突(代码托管在coding)

分支A提交合并请求到分支B&#xff0c;有冲突git fetch code 拉取远程仓库的其他分支代码&#xff08;我拉代码是remote add code所以这里是code,可以用git remote查看&#xff09;git checkout 分支A 切换到分支Agit pull code 分支A 拉取分支A代码git checkout 分支B 切换到分…