sed编辑器和awk

news/2024/11/17 3:43:08/文章来源:https://www.cnblogs.com/zsy828/p/18195577

目录
  • 1.sed的执行过程
    • (1)sed 的工作流程
    • (2)打印内容
    • (3)删除
    • (4)替换
    • (5)打印被修改的行
    • (6)插入
    • (7)复制粘贴
  • 2.awk
    • (1)工作原理

1.sed的执行过程

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

(1)sed 的工作流程

读取 :目标文件的每行数据一次假如到缓冲区(模式空间)里,默认从第一开始读取
执行 : 使用定义的增删改查命令来处理读取到换从区行数据
显示 : 将处理后的行数据输出到屏幕显示

sed -e '操作命令' -e '操作命令' 目标文件... ##在命令行指定操作命令处理文件行数据

在一个脚本文件里定义操作命令
sed -f 文件名 目标文件... ##使用指定脚本文件里的操作命令处理文件行数据
sed -i ##直接根据操作命令修改原文件行数据
sed -e ##增删改查的命令格式

sed -e '删操作' -e '查操作' 目标文件     sed -e '{
删操作
查操作
}' 目标文件

常用选项
-e 示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 表示用指定的脚本文件来处理输入的文本文件
-h 显示帮助
-n 禁止sed编辑器输出,但可以与p命令一起使用完成输出
-i 直接修改目标文本文件
-r 表示支持扩展正则表达式
常用操作
s 替换,替换指定字符
d 删除,删除选定的行
a 增加,在当前行下面增加一行指定内容
i 插入,在选定行上面插入一行指定内容
c 替换,将选定行替换为指定内容
y 字符转换,转换前后的字符长度必须相同
p 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用
= 打印行号
l(小写L) 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

(2)打印内容

sed编辑器有2种寻址方式:
(1)以数字形式表示行区间
(2)用文本模式来过滤出行

p(打印行内容) = (打印行号) 1(打印ASCII字符)
sed -n -e '行号p' ##根据行进行打印
sed -n -e '起始行号,终止行号p' ##根据行区间进行打印
sed -n -e'/字符串/p' ##根据字符串匹配行进行打印
sed -n -r -e '/正则表达式/p' ##根据正则表达式匹配行进行打印












(3)删除

sed -e '行号区间d'
sed -e '/字符串/d'
sed -r -e '正则表达式/p'd




(4)替换

4种替换标记:
数字:表明新字符串将替换第几处匹配的地方
g:表明新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w 文件:将替换的结果写到文件中

 替换          s (字符串替换)  c(整行内容替换)  y(对应字符替换)sed -e '行号区间 s/old/new/g'          
sed -n -e '行号区间 s/old/new/gp'    #打印被修改的行   sed -e '行号区间 s/old/new/gw 保存文件'     #保存被修改的行sed -e '/字符串/ s/old/new/g'
sed -r -e '/正则表达式/ s/old/new/g'
sed -r -e 's/(xxx)(xxx)(xxx)/\3\2\1/'sed -e '行号c 新行内容'
sed -e '/字符串/c 新行内容'sed -e 'y/旧字符/新字符/'      #注:新字符和旧字符的长度要一致 





(5)打印被修改的行

sed -e '行号区间 s/old/new/gw 保存文件'     ##保存被修改的行   
sed -e '/字符串/' s/old/new/g
sed -r -e '' s/old/new/g
sed -r -e '' s/old/new/g



(6)插入

插入    a(在指定行下面插入行内容)   i(在指定行上面插入行内容)    r(在指定行下面插入整个文件内容)sed -e '行号区间a 行内容'
sed -r -e '/字符串或正则/a 行内容'sed -e '行号区间i 行内容'
sed -r -e '/字符串或正则/i 行内容'sed -e '行号区间r 文件'



(7)复制粘贴

复制粘贴   H(复制指定行到剪切板)    G(将剪切板内容粘贴到指定行下面)
sed -e '1,3H;$G'           #将1-3行内容复制粘贴到最后一行下面
sed -e '1,3{H;d};$G'       #将1-3行内容剪切粘贴到最后一行下面

2.awk

(1)工作原理

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

awk -F '字段分隔符' '条件表达式 {操作}' 文件

常见的内建变量
FS 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF 当前处理的行的字段个数
NR 当前处理的行的行号(序数)
$0 当前处理的行的整行内容
$n 当前处理行的第n个字段(第n列)
FILENAME 被处理的文件名
RS 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是'\n'

BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;
awk再处理指定的文本,之后再执行END模式中指定的动作,END{}语句块中,往往会放入打印结果等语句

当getline左右无重定向符“<”或“|”时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的第二行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,然后将它打印出来。
当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件

awk -F '字段分隔符' '条件{print NR; print $0}' 文件        #换行输出行号和行内容  
awk -F '字段分隔符' '条件{print NR} 条件{print $0}' 文件awk -F '字段分隔符' '条件{print NR,$0}' 文件               #同行输出行号和行内容
awk -F '字段分隔符' 'NR==n {print $0}'        #输出 第n行的 整行内容
awk -F '字段分隔符' 'NR==n {print $1}'        #输出 第n行的 第一个字段的内容
awk -F '字段分隔符' 'NR==n {print $1,$NF}'        #输出 第n行的 第一个字段和最后一个字段的内容
awk -F '字段分隔符' 'NR==n,NR==M {print $1}'        #输出 第n行到第m行的 第一个字段的内容
awk -F '字段分隔符' 'NR>=n&&NR<=M {print $1}'        
awk -F '字段分隔符' 'NR==n||NR==M {print $1}'        #输出 第n行和第m行的 第一个字段的内容
awk -F '字段分隔符' '/字符串/ {print $1}'        #输出 包含指定字符串的行的 第一个字段的内容
awk -F '字段分隔符' '/正则表达式/ {print $1}'        #输出 匹配正则表达式的行的 第一个字段的内容
awk -F '字段分隔符' '$1>=n {print $0}'        #输出 第一个字段的数值大于等于n的 整行内容== != >= > <= <
awk -F '字段分隔符' '$1~"字符串" {print $0}'        #输出 第一个字段包含指定字符串的 整行内容~(包含) !~(不包含) ==(等于) !=(不等于)









free | awk '/Mem:/{print int($3/$2*100)"%"}'            #内存使用率
top -b -n1 | awk -F, '/%Cpu\(s\)/{print $4}' | awk '{print 100-$1"%"}'    #CPU使用率
df | grep -w "/" | awk '{print $5}' | awk -F% '{print $1}'     #磁盘分区容量使用率
df | grep -w "/" | awk '{print $5}' | awk -F% '{print 100-$1"%"}'     #磁盘分区空闲使用率



awk '(NR%2)==1 {print $0}'     #输出奇数行
awk '{print $0; getline}'
sed -n 'p;n'awk '(NR%2)==0 {print $0}'     #输出偶数行
awk '{getline; print $0}'
sed -n 'n;p'



awk 'BEGIN {...}; 条件{...}; END {...}'  文件BEGIN {...}   表示处理文件前要执行的操作条件{...}     表示对匹配满足指定条件的文件行内容要执行的操作END {...}     表示处理完文件所有行内容后要执行的操作awk -F '字段分隔符' 'BEGIN{OFS="输出的字段分隔符"}; {$1=$1; print $0}'      #修改字段分隔符awk '{控制语句条件 {操作}}' 文件awk 'if(条件表达式) {操作}' 文件                  #行内容满足if的条件则执行操作awk '变量=条件表达式?值1:值2; {操作}' 文件        #行内容是否条件表达式,如果条件成立则变量取值1,条件不成立则变量取值2awk 'BEGIN{执行循环前的操作; while("命令" | getline) 每次循环的操作; 执行循环完后的操作}'     #使用while循环对每行内容执行操作awk '/Failed password/{a[$11]++}; END{for(i in a) {print i, a[i]}}' /var/log/secure    #通过awk数组统计日志文件里IP出现的次数awk '/Failed password/{a[$11]++}; END{for(i in a) if(a[i]>5){print "sshd:"i}}' /var/log/secure >> /etc/hosts.deny      #将出现超过5次的IP导入到黑名单里












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

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

相关文章

“复兴杯”2023第四届大学生网络安全精英赛排位赛 Writeup

时间跟全国信安初赛重了(),不过也是第一次在CTF AK了( 个人信息 个人排名:15 解题过程 1观察代码,使用科学技术法进行绕过,2.023e3也就是2.023*10^3=2023,弱比较时会化为2023,但是运算时后并不绝对等于2024。 输入得到flag。2 打开网站可以看到电脑账号是ly,使用过滤…

基于webapi的websocket聊天室(四)

上一篇实现了多聊天室。这一片要继续改进的是实现收发文件,以及图片显示。 效果问题 websocket本身就是二进制传输。文件刚好也是二进制存储的。 文件本身的传输问题不太,但是需要传输文件元数据,比如文件名和扩展名之类的。这很必要,如果我们想知道怎么展示这个文件的话。比…

嵌入式Linux中的LED驱动控制(以野火STM32MP157开发板为例)

在嵌入式Linux系统中,由于从硬件到软件都是自己定制的,所以很多时候需要对自己定义的设备编写驱动程序。本例就以野火STM32MP157开发板为例,讨论如何控制开发板上三个LED的亮灭。 先来看一下LED部分的电路原理图,如下所示。从上图中可以看到,三个RGB颜色的二极管采用共阳接…

BUUctf xor

0x01 关于xor xor,即为计算机中的异或计算,相同为0,不同为1。 下面是关于异或加密的四个定理A ^ 0 = A A ^ A = 0 (A ^ B) ^ C = A ^ (B ^ C) (B ^ A) ^ A = B ^ 0 = B // 明文 B;密码 A观察可知,经历异或加密后的密文,再次进行异或算法即可得到明文。 0x02 题解 先丢进…

解决VSCode中Debug和运行路径不一致的

哈喽,大家好,我是木头左!背景介绍 在Visual Studio Code(简称VSCode)中进行开发时,经常需要使用到调试(Debug)功能。然而,有时候会发现,当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问…

DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查

文章原创不易,转载请注明来源 ,谢谢! 一、 问题 周末在家,给自己的老的台式机安装DockerDesktop。 电脑配置是处理器 Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz 3.30 GHz机带 RAM 16.0 GB (15.9 GB 可用)系统类型 64 位操作系统, 基于 x64 的处理器版本 Windows 10 专业版…

软件设计原则—接口隔离原则

B类需要方法1好处是b类继承A类后就有了方法1的功能,问题是B类被迫有了它不使用的方法2 这个其实是根据方法的职责细分接口,只需要依赖其中一个接口就可以了客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。 下面看一个例子来理解接口隔…

科翼阁:网赚广告套路千千万,美食沙雕占大半

在网赚的世界里,有70%是新手,20%是刚上手不久的,但这类人能坚持在网赚这个行业持续发展的机率只有10%,所以只有10%的能在网赚这个行业中进行持久战的,也有只这类人能真正在网赚中赚到大钱的人,网赚需要坚持,中途退出的人绝对无法在网赚这行中得到赢利。在国外,由于网赚…

关于 双向不循环列表的创建、插入、删除、遍历、检索、销毁

双向循环链表公式双向不循环链表代码 #include <stdio.h> #include <stdlib.h> #include <string.h>//宏定义一个数据域 #define DATA_LEN 60//双向不循环链表的节点定义 typedef struct double_link_list {//数据域char data[DATA_LEN]; // 数据…

软件设计原则—依赖倒转原则

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。下面看一个例子来理解依赖倒转原则:组装电脑 现要组装一台电脑,需要配件cpu,硬盘,…

关于没有熔断降级导致服务重启问题

场景 1.k8s微服务触发重启 容器配置的健康检查采用actuator curl 127.0.0.1:8080/actuator/health 2.容器重启钩子回调curl -X POST http://127.0.0.1:8080/actuator/shutdown 最终原因是因为调用第三方服务,超时设置3秒,重试3次,三方服务挂起导致tomcat连接池占满,健康检查…

stm32 bootloader的app中断向量偏移设置,HAL库

如何设置Hal库的中断向量偏移看前几篇的 stm32f103c8t6 HAL库更改中断向量表(app部分) - 这一切足够了 - 博客园 (cnblogs.com)我这里bootloader的APP开始地址就是0x08006000,中断向量偏移0x00006000 设置完成之后编译mdk,将生成的bin文件使用ymodem写入0x08006000中 这里设…