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,一经查实,立即删除!

相关文章

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;而不是必须…

SparkSQL-从0到1认识Catalyst

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

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

摘要&#xff1a; 一提到程序员&#xff0c;大多数人的印象大概就是死宅、无趣、没有私人生活&#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…

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

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;第二篇文章在第一…

Java Map 怎样实现Key 的唯一性?

大家都知道。在Map和Set不可存在反复元素&#xff1f; 可是对于内部的细节我们并不了解。今天我们就一块来 探讨一下&#xff01; 1 对于 HashMap HashSet 他们的底层数据结构的实现是&#xff1a;维护了一张 HashTable 。容器中的元素所有存储在Hashtable 中。他们再加入…

win10下安装pyspark及碰到的问题

文章目录前言安装过程Q1总结&#xff1a;前言 最近由于工作需要&#xff0c;需要了解下pyspark&#xff0c;所以就在win10环境下装了下&#xff0c;然后在pycharm中使用的时候碰到了一些问题。整个过程可谓是一波三折。下面一一道来。 安装过程 安装过程就不详细说了&#x…

解决AttributeError AttributeError: 'NoneType' object has no attribute 'filename'

原因忘记上传文件 表单需要加属性 enctype"multipart/form-data" 否则报错&#xff01;AttributeError AttributeError: NoneType object has no attribute filename enctype"multipart/form-data是设置表单的MIME编码。默认情况&#xff0c;这个编码格式是ap…

SQLAlchemy()分页器paginate方法

Flask的数据分页示例 用法&#xff1a; 1&#xff0c;首先写数据获取的视图函数&#xff0c;就像这样&#xff1a; # 首页 blog_bp.route(/, endpointindex) def index():#获取页数page request.args.get(page,1)paginate Article.query.paginate(pageint(page),per_page3)…

开源中国 2014 年源创会年度计划

时光总是从敲代码的指尖不经意地滑过&#xff0c;转眼2014年已快过去一半&#xff0c;OSC依然心怀着最初的梦想。 源创会&#xff0c;oscer的线下快乐大本营&#xff0c;我们仍在继续...... 聆听技术大牛讲解最前沿的技术&#xff0c;和同道中人切磋IT秘籍&#xff0c;吃点心侃…

互联网金融行业申请评分卡(A卡)简介

文章目录前言基本概念1、信用违约风险的基本概念什么是信用违约风险&#xff1a;组成部分违约的主体个贷中常用的违约定义M0&#xff0c;M1&#xff0c;M2的定义2、申请评分卡的重要性和特性信贷场景中的评分卡申请评分卡的概念为什么要开发申请评分卡评分卡的特性 &#xff08…

Flask的csrf_token的用法

在flask当中&#xff0c;flask-wtf模块时携带csrf校验的&#xff0c;只是需要开启&#xff1b; 如果不开启校验就不需要校验&#xff0c;但是那样不安全。 Csrf是针对与post请求的跨域限制&#xff0c;get请求没有作用 csrf_token的开启 在flask中开启csrf保护 from flask_…

dotty编译器语法特性之一交叉类型,联合类型和文本单例类型

2019独角兽企业重金招聘Python工程师标准>>> ###翻译&#xff1a;http://dotty.epfl.ch/docs/reference/intersection-types.html #交叉类型 trait Resettable {def reset(): this.type } trait Growable[T] {def add(x: T): this.type } def f(x: Resettable &…

【转】Zookeeper 安装和配置

转自&#xff1a;http://coolxing.iteye.com/blog/1871009 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进行介绍. 单机模式 1. 配置 点击这里下载zookeeper的安装包之后, 解压到合适目录. 进入zookeeper目录下的conf子目录, 创建z…

一分钟精通Flask-Bootstrap的使用

要想在程序中集成Bootstrap&#xff0c;显然要对模板做所有必要的改动。不过&#xff0c;更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展&#xff0c;简化集成的过程。 安装&#xff1a; Flask-Bootstrap 使用pip安装&#xff1a; pip install flask_bootstrap Fl…