sed & awk使用简介

2023-09-21 14:57:35

简介

本文主要介绍 Linux 系统的两个神级工具:sed 和 awk ,他们是Linux高手们必备的技能,很值得我们去研究的东西。

这里是我在网上书上收集的相关资料,因为这两个工具很有名也很重要,所以这些资料会帮助我更好的了解和熟悉它们。

什么是sed

在《sed and awk》一书中(1.2 A Stream Editor)的解释是:

Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同;同时它又是面向字符流的,输入的字符流经过Sed的处理后输出。这两个特性使得Sed成为命令行下面非常有用的一个处理工具。

Sed本身是一个管道命令,可以分析 standard input 的,主要是用来分析关键字的使用、统计等,此外还可以将数据进行替换、删除、心中、选取特定行等功能。

基本概念

sed命令的语法如下所示:

sed [-nefr] [动作]

参数说明:

-n : 使用安静模式,一般所有来自STDIN的数据会被列出到屏幕上,但是 -n 在可以只列出经过 sed 处理过的那一行。

-e : 直接在命令行模式上进行 sed 的动作编辑。

-f : 直接将 sed 的动作卸载一个文件内, -f filename 则可以执行 filename 内的 sed 动作。

-r : sed 的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式语法)。

-i : 直接修改读取的文件内容,而不是由屏幕输出。

动作说明: [n1],[n2] function

n1,n2:不见得会存在,一般代表选择进行动作的行数。举例来说:如果我的动作是需要在 10 到 20 行之间进行的,则"10,20[动作行为]"

function 有下面这些参数:

a:新增,a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)。

c:替换,c 的后面可以接字符串,这些字符串可以替换n1,n2之间的行!

d:删除,因为是删除,所以 d 后面通常不接任何参数。

i:插入,i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)。

p:打印,也就是将某个选择的数据打印出来,通常 p 会与参数 sed -n 一起运行。

s:替换,可以直接进行替换工作。通常这个 s 的动作可以匹配正则表达式!例如:1,20s/old/new/g 就是。

关于 sed 的一些常见使用

以行为单位的新增或删除功能

案例(一)

nl /etc/passwd | sed '2,5d'

说明:

  • sed 的动作为 ‘2,5d’,那个 d 就是删除,命令运行的效果就是把2~5行给删除。

  • 需要注意的是,原本应该是要执行 sed -e 才对,没有 -e 也行。

  • 另外还需要注意的一点:sed 后面接的动作,请务必要以 ‘’ 两个单引号括住。

  • 如果你只想删除第二行,那么命令就是:nl /etc/passwd | sed ‘2d’。

  • 如果你想删除第三行到最后一行,那么就可以这么写:nl /etc/passwd | sed ‘3,$d’

注:$表示最后一行。

案例(二)

nl /etc/passwd | sed '2a drink tea'

说明:

  • 命令执行的效果就是在第二行后面(也就是第三行)加上"drink tea"字样。

  • 如果你想在第二行前面加上字符串,那么你可以这样:nl /etc/passwd | sed ‘2i drink tea’

注:2a 中的 a 是指第二行后面,而 2i 中的 i 则是指第二行的前面。

案例(三)

nl /etc/passwd | sed '2a drink tea or ......\
drink beer'

说明:

  • 上面的命令的执行效果是在第二行后面加入2行字。

  • 在每一行的后面必须要以反斜杠 来进行新行的增加。

以行为单位的替换与显示功能

案例(一)

nl /etc/passwd | sed '2, 5c No 2-5 number'

说明:

  • 上面的命令的执行效果是将第2~5行的内容替换成"No 2-5 number"

案例(二)

nl /etc/passwd | sed -n '5,7p'

说明:

  • 上面的命令执行的效果是仅列出文件中的第5~7行的内容。

  • 命令中的 -n 代表的是安静模式!但是这个参数建议加上。

案例(三)

sed 's/要被替换的内容/新的内容/g'

说明:

  • 以上命令执行的效果就是替换掉指定内容。

案例(四)

下面是记录一次获取IP数据的过程:

第一步:先查看源信息,利用 /sbin/ifconfig 查询 IP。

/sbin/ifconfig eth0

注:我们的目的是要获得IP数据,那么先利用关键字找出那一行。

第二步:利用关键字配合 grep 选取出关键的一行数据。

/sbin/ifconfig eth0 | grep 'inet addr'

注:因为只需要IP数据,所以接下来就是把不需要的内容都删掉,那么就需要一个正则表达式来帮助实现:

^.*inet addr:

第三步:将 IP 前面的部分予以删除

/sbin/ifconfig eth0 | grep 'inet addr' |\
sed 's/^.*inet addr://g'

注:上面的命令就把 IP 前面的数据删掉了,那么接下来就是把 IP 后面的数据也删掉,此时的正则表达式则是:

Bcast.*$

第四步:将 IP 后面的部分予以删除

/sbin/ifconfig eth0 | grep 'inet addr' |\
sed 's/^.*inet addr://g' | sed 's/Bcast.*$//g'

这样就能把 IP 截取出来了~~~

案例(五)

这里主要是展示 sed 与正则表达式的配合使用。

假设我想在一个文件(你自己新建或者已有的,主要是测试而已)获取MAN字样的那几行数据,但是#在内的批注我不需要,而且空白行也不要。

第一步:先使用 grep 将关键字 MAN 所在行取出来。

cat /home/man.config | grep 'MAN'

第二步:删除掉批注之后的数据。

cat /home/man.config | grep 'MAN' | sed 's/#.*$//g'

第三步:那么接下来就是把空白行删除掉。

cat /home/man.config | grep 'MAN' | sed 's/#.*$//g' |\
sed '^$/d'

直接修改文件内容(慎重)

首先要特别提醒的是,要练习 sed 修改文件内容的时候不能用任何系统配置文件,最好是自己新建一个测试文本来测试练习。

案例(一)

sed -i 's/\.$/\!/g' test.txt

说明:

  • 上面命令执行效果是利用 sed 将test.txt内的每一行结尾为"." 的换成 !

  • 命令中的 -i 参数可以让你的 sed 直接去修改后面接的文件内容,而不是由屏幕输出。

案例(二)

sed -i '$a # This is a test' test.txt

说明:

  • 上面命令执行的效果是利用 sed 直接在test.txt最后一行加入 “This is a test”。

  • 由于 $ 代表的是最后一行,而 a 的操作是新增,因此该文件最后新增。

什么是 awk

简单来说,awk 是一个数据处理工具。

相比于 sed 常常作用于一整行的处理,awk 则比较倾向于将一行分成数个"字段"来处理。因此,awk 相当适合处理小型数据的数据处理。

对于编程语言来讲,awk 是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务。

基本概念

基本语法

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
  • awk 后面接两个单引号病加上大括号{}来设置想要对数据进行的处理动作。

  • awk 可以处理后续接的文件,也可以读取来自签个命令的 standardoutput。

  • 如前面说的,awk 主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或者[tab]键。 比如:

last -n 5 // 仅取出登陆者的数据前五行(last 可以将登陆者的数据取出来)

如果我还要在这些信息中取出:账号与登陆者的IP,且账号与IP之间以[tab]隔开,那么可以这么改命令:

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

上面是 awk 最常使用的动作,通过 print 的功能来讲字段的数据列出来,字段的分割则以空格键或者[tab]按键来隔开。

上面的例子中,在每一行的每个字段都是有变量名称的,那就是$1,$2等变量名称。

备注:$1 指的就是第一列,但是 $0 则是代表一整行(第一行)。

上面的例子中整个awk的处理流程:

(1)读入第一行,并将第一行的数据填入$0,$1,$2等变量中;
(2)依据条件类型的限制,判断是否需要进行后面的动作;
(3)昨晚所有的动作与条件类型;
(4)若还有后续的"行"的数据,则重复上面1~3的不知,直到所有的数据都读完为止。
  • 注:awk是以行为一次处理的单位,而以字段最小的处理单位。

对于上面的案例指令 last -n 5 … 来讲,有几点需要注意的:

  • 列出每一行的账号(就是$1)。

  • 列出目前处理的行数(那就是 awk 内的 NR 变量)。

  • 并且说明,该行有多少个字段(就是 awk 内的 NF 变量)。

注意: awk 后续的所有动作都是以单引号 “'” 括住的,由于单引号与双引号都必须是成对的,所以 awk 的格式内容如查想要以 print 打印时,记得非变量的文字部分,包含一小节 printf 提到的格式中,都需要使用双引号来定义出来,因为单引号已是 awk 的命令固定用法了。

last -n 5 | awk '{print $1 "\t lines: " NR "\t lines: " NR "\t columes: " NF}'

awk的一些常见使用

awk 的运算符

  • 大于: >

  • 小于: <

  • 大于或等于: >=

  • 小于或等于: <=

  • 等于: ==

  • 不等于: !=

值得关注的是那个等于 “==” 的符号,因为:

  • 逻辑运算上面也就是所谓的大于,小于,等于等判断式上面,习惯上是以"=="来表示的。

  • 如果是直接给与一个值,例如变量设置时,就直接使用 = 而已。

案例(一)

cat /etc/passwd | \awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'

说明:上面的指令运行的效果是查阅第三列小于10以下的数据,并且仅列出账号与第三列。(在 /etc/passwd 当中是以冒号":"来作为字段的风,该文件中第一字段为账号,第三字段则是UID)

案例(二)

cat /etc/passwd | \awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'

说明:由于案例一中并没有显示出第一行的数据,那么此命令则是把第一行也显示出来了。利用 BEGIN 关键字预先设置 awk 的变量。

案例(三)

此外 awk 还可以进行"计算功能"。

比如有一个文件,内容如下:

name 1st 2nd 3th
小A 1000 1000 1000
小B 2000 2000 2000
小C 3000 3000 3000

那么怎么计算每个人的总额呢?而且还需要格式化输出,那么可以这样思考:

  • 第一行只是说明,所以第一行不要进行加总(NR==1时处理)。

  • 第二行以后就会有加总的情况出现(NR>=2以后处理)。

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

说明:

  • 所有 awk 的动作(即在{}内的动作),如果有需要多个命令来辅助是,可利用分号";"间隔,或者直接以[Enter]按键来隔开每个命令,上面则是摁了三次。

  • 逻辑运算中,如果是"等于"的情况,则务必使用两个等号"=="!

  • 格式化处输出时,在 printf 的格式设置当中,务必加上 n ,才能实现分行。

  • 与 bash 、shell 的变量不同,在 awk 当中,变量可以直接使用,不需要加上 $ 符号。

更多推荐

浙工大MBA常规批复试建议怎么准备?

&nbsp;&nbsp;&nbsp;&nbsp;如果你第一志愿报考浙江工业大学MBA项目不想被无故的淘汰,小编建议你还是认真对待考后的复试环节。因为从2023年的招生录取可以看到,浙工大MBA项目的提前批面试对于最终录取几乎是没什么作用的,在与普通考生同层次竞争的局面下,复试谁发挥的好,分数高,谁就可以获得录取的资格。

接口自动化测试:pytest基础讲解

为什么要做接⼝测试?只靠前端测试很难确保很⾼的覆盖率。接⼝测试,可以模拟出各种类型的⼊参,包括⼀些在前端模拟不出来的⼊参,还能根据接⼝⽂档的定义,设计出相对完善的⼊参值,在接⼝层保证质量,剩余的绝⼤多数问题就是应⽤程序⾃⾝的交互和数据展⽰问题。接⼝测试相对于交互界⾯测试和功能测试来说,更容易实现⾃动化,执⾏起来⽐较稳定

数据分析的-五种常用方法实例

一、对照俗称对比,单独看一个数据是不会有感觉的,必需跟另一个数据做对比才会有感觉。比如下面的图a和图b。图a毫无感觉图b经过跟昨天的成交量对比,就会发现,今天跟昨天实则差了一大截。这是最基本的思路,也是最重要的思路。在现实中的应用非常广,比如选产品丶监控增量等,这些过程就是在做【对照】,决策BOSS们拿到数据后,如果数

websocket php教程

WebSocket是HTML5提供的一种网络通讯协议,用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯,APP与服务器的实时通讯等场景。相比传统HTTP协议请求响应式通讯,WebSocket协议可以做到实时的双向通讯,服务端可以在任何时候向客户端推送数据(HTTP协议需要客户端发起请求后才能推送)。PH

Spring高手之路14——深入浅出:SPI机制在JDK与Spring Boot中的应用

文章目录1.SPI解读:什么是SPI?2.SPI在JDK中的应用示例3.SPI在Spring框架中的应用3.1传统Spring框架中的SPI思想3.2SpringBoot中的SPI思想4.SPI在JDBC驱动加载中的应用5.如何通过SpringBoot自动配置理解SPI思想6.SPI(ServiceProviderIn

Ajax学习笔记

目录Ajax介绍Ajax概述同步异步原生Ajax演示AxiosAxios的基本使用Axios快速入门Axios请求方法别名Axios案例Ajax介绍Ajax概述我们前端页面中的数据应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以必须涉及到2个程序的交互

Golang net/http 包中的 RoundTripper 接口详解

RoundTripper是什么?RoundTripper是net/http包中的一个接口,定义了处理HTTP请求返回和响应的方法,是http.Client结构体中执行http请求的核心部分。接口定义如下:typeRoundTripperinterface{RoundTrip(*Request)(*Response,er

深入分析Spring的IoC容器:从底层源码探索

前言:博主在最近的几次面试中,大中小厂都问到了Spring的ioc容器相关问题,这块知识确实是面试中的重点内容,因此结合所看的书籍,在这篇文章中总结下。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读,感谢大佬的关注。如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~小威在此先感谢各位小伙

Flink窗口

窗口(Window)6.1.1窗口的概念Flink是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地处理无界流,一种方式就是将无限数据切割成有限的“数据块”进行处理,这就是所谓的“窗口”(Window)。注意:Flink中窗口并不是静态准备好的,而是动态创建——当有落在这个窗口区间

OpenCV自学笔记二十一:视频处理

一、VideoCapture类在OpenCV中,`VideoCapture`类提供了一系列函数来读取和控制视频流。以下是一些常用的`VideoCapture`类函数说明:1.`isOpened()`:检查视频是否成功打开。返回一个布尔值,True表示成功打开,False表示未成功打开。2.`open(filenameo

React 窗口防抖_ 提升网页性能的利器

React窗口防抖是一种优化网页性能的技术,它能够有效地减少浏览器中不必要的渲染和计算,从而提高网页的响应速度和用户体验。在本文中,我们将探讨React窗口防抖的原理、应用场景以及如何在你的React项目中使用它。引言随着互联网的发展,越来越多的网页应用需要处理大量的数据和复杂的交互逻辑。而这些复杂的操作往往会导致网页

热文推荐