sed流式编辑器

  • sed是一个非交互的文本编辑器,实现的功能跟vim相同,主要是对文件内容进行输出、删除、替换、复制、剪切、导入、导出等功能

  • 命令格式1:前置命令 | sed [选项] '[指令]' 文件名

  • 命令格式2:sed [选项] '[指令]' 文件名

  • 常用选项:

  • -n #屏蔽默认输出,默认sed会将所有的输出结果输出到屏幕中,-n只把sed处理的行输出到屏幕

  • -i #直接修改文件内容,如果不加-i选项,并不会真正改变文件的内容

  • -r #使用扩展正则,若与其他选项连用应作为首个选项

  • 动作指令:

  • p #打印指定的行,如:2,4p 打印第234行,如:2p;4p 打印第2行与第4行

  • d #删除指定的行,如:2,4d 删除第234行

  • s #字符串替换,如:s/旧字串/新字串/

  • r #导入文件内容,如:4r 1.txt 在第4行下导入1.txt文件内容

  • w #导出文件内容,如:3w 1.txt 将文件第三行内容另存到2.txt文件中

#打印文件第一行内容
[root@localhost yunwei]# sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash #打印文件第三行内容
[root@localhost yunwei]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin #打印文件第3行到6行
[root@localhost yunwei]# sed -n '3,6p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync #打印文件第3行到6行
[root@localhost yunwei]# head -6 /etc/passwd | tail -4
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync #利用正则表达式匹配以root开头的行(正则表达式要放在//内)
[root@localhost yunwei]# sed -n '/^root/p' /etc/passwd #匹配以bash结尾的行
[root@localhost yunwei]# sed -n '/bash$/p' /etc/passwd
[root@localhost yunwei]# sed -n '/nologin$/p' /etc/passwd #打印文件最后一行,打印行号
[root@localhost yunwei]# sed -n '$=' /etc/passwd
70
[root@localhost yunwei]# sed -n '/^root/=' /etc/passwd
1 #拷贝文件练习
[root@localhost opt]# cp /etc/passwd /opt/test #删除文件2到4行
[root@localhost opt]# sed '2,4d' test | wc -l
67 #使用i选项直接修改源文件
[root@localhost opt]# sed -i '2,4d' test #使用分号分隔
[root@localhost opt]# sed -i '10d;12d' test
[root@localhost opt]# sed -n '$=' test
62 #制作素材
[root@localhost opt]# vim 1.txt
aaaabbbbb
bbbbbaaaa
cccccaaaaa
dddddaaaa [root@localhost opt]# sed -n '/aaaa/p' 1.txt
aaaabbbbb
bbbbbaaaa
cccccaaaaa
dddddaaaa #取反删除
[root@localhost opt]# sed -i '/cccc/!d' 1.txt
[root@localhost opt]# cat 1.txt
ccccaaaa [root@localhost opt]# vim 1.txt
aaaabbbb
ddddaaaa
zzzzaaaa
ccccaaaa #删除以ccc开头的行
[root@localhost opt]# sed -i '/^cccc/d' 1.txt
[root@localhost opt]# cat 1.txt
aaaabbbb
ddddaaaa
zzzzaaaa #删除空行
[root@localhost opt]# sed -i '/^$/d' 1.txt
[root@localhost opt]# cat 1.txt #准备素材
[root@localhost opt]# vim xx.txt
2021 2020 2019 2018
2021 2021 2020 2019
2021 2022 2021 2020 #替换文件每一行匹配到的第一个字串
[root@localhost opt]# sed 's/2021/xxxx/' xx.txt
xxxx 2020 2019 2018
xxxx 2021 2020 2019
xxxx 2022 2021 2020 #替换文件每一行匹配到的第二个字串
[root@localhost opt]# sed 's/2021/xxxx/2' xx.txt
2021 2020 2019 2018
2021 xxxx 2020 2019
2021 2022 xxxx 2020 #替换文件每一行匹配到的所有指定字串
[root@localhost opt]# sed 's/2021/xxxx/g' xx.txt
xxxx 2020 2019 2018
xxxx xxxx 2020 2019
xxxx 2022 xxxx 2020 #将匹配到的第一个字串替换成空
[root@localhost opt]# sed 's/2021//' xx.txt
2020 2019 2018
2021 2020 2019
2022 2021 2020 #将匹配到的第=二字串替换成空
[root@localhost opt]# sed 's/2021//2' xx.txt
2021 2020 2019 2018
2021 2020 2019
2021 2022 2020 #替换时屏蔽默认输出
[root@localhost opt]# sed -n 's/root/xxoo/g' test
[root@localhost opt]# sed -n 's/root/xxoo/gp' test
xxoo:x:0:0:xxoo:/xxoo:/bin/bash
operator:x:11:0:operator:/xxoo:/sbin/nologin #替换符可以使用任意的特殊符号
[root@localhost opt]# sed 's#2021#xxoo#' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's,2021,xxoo,' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's!2021!xxoo!' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's;2021;xxoo;' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's*2021*xxoo*' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's:2021:xxoo:' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020 #将文件中/bin/bash替换成/bin/sh
[root@localhost opt]# sed -n 's/\/bin\/bash/\/bin\/sh/gp' test
[root@localhost opt]# sed -n 's,/bin/bash,/bin/sh,gp' test #使用sed给文件1-7行批量添加注释
[root@localhost opt]# sed -n '1,7s/^/#/p' test #使用sed给文件1-7行批量添加注释,直接修改源文件
[root@localhost opt]# sed -i '1,7s/^/#/p' test #批量去除1-7行的注释
[root@localhost opt]# sed -n '1,7s/^#//p' test #批量去除1-7行的注释,直接修改源文件
[root@localhost opt]# sed -i '1,7s/^#//p' test #将文件中所有的数字替换成空
[root@localhost opt]# sed -n 's/[0-9]//gp' test #将文件中所有的英文字母替换成空
[root@localhost opt]# sed -n 's/[a-Z]//gp' test #准备素材
[root@localhost opt]# vim a.txt
xxxxxxx
yyyyyyy
zzzzzz #将a.txt文件内容导入到test文件中,默认读一行导一遍
[root@localhost opt]# sed 'r/opt/a.txt' test #指定导入的行,导入到test文件第一行下边
[root@localhost opt]# sed '1r/opt/a.txt' test
root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz #指定连续导入的行
[root@localhost opt]# sed '1,3r/opt/a.txt' test
root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz #将a.txt文件第一行内容导出到b.txt文件中
[root@localhost opt]# sed '1w b.txt' a.txt
[root@localhost opt]# cat b.txt
xxxxxxx

awk编程语言

  • awk编程语言/数据处理引擎

  • 创造者:Aho Winberger Kernighan

  • 基于模式匹配检查输入文本,逐行处理并输出,获取指定的数据

  • awk过滤数据时支持仅打印某一列,如:第2列、第4列...

  • awk命令格式1:awk [选项] '条件1{指令} 条件2{指令}' 文件名

  • awk命令格式2:前置命令 | awk [选项] '条件{指令}'

  • 常用指令:print 是最常用的打印指令

  • 常用选项:-F #指定分隔符,如不指定分隔符,默认以空格或tab键为默认分隔符,可通过[]集合匹配多种单个字符

  • awk内置变量:$1第一列,$2第二列,$3第三列,依次类推,NR文件当前行号,NF文件当前列数

  • 命令格式1示例:

#准备素材
[root@localhost opt]# vim test.txt
hello the woman
welcome to china #打印文件的第一列
[root@localhost opt]# awk '{print $1}' test.txt
hello
welcome #打印文件第一列和第三列
[root@localhost opt]# awk '{print $1,$3}' test.txt
hello woman
welcome china #打印passwd文件第一列(默认没有空格与tab键作为分隔符,打印文件所有内容)
[root@localhost opt]# awk '{print $1}' /etc/passwd #手动指定以:作为分隔,打印文件第一列
[root@localhost opt]# awk -F: '{print $1}' /etc/passwd #打印文件第一列与第七列
[root@localhost opt]# awk -F: '{print $1,$7}' /etc/passwd #通过[]集合匹配多种单个字符作为分隔符,打印用户名与解释器字段
[root@localhost opt]# awk -F[:/] '{print $1,$10}' /etc/passwd #通过正则表达式过滤以root开头的行
[root@localhost opt]# awk -F: '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash #通过正则表达式过滤以root开头的行,打印第1列与第7列
[root@localhost opt]# awk -F: '/^root/ {print $1,$7}' /etc/passwd
root /bin/bash #打印文件每一行与每一行的列数
[root@localhost opt]# awk -F: '{print NR,NF}' /etc/passwd #打印文件每一行与每一行的列数,并打印最后一列
[root@localhost opt]# awk -F: '{print NR,NF,$NF}' /etc/passwd #通过常量打印执行的列
[root@localhost opt]# awk -F: '{print $1,"用户的解释器为:",$7}' /etc/passwd
root 用户的解释器为: /bin/bash #匹配第一列包含root的行
[root@localhost opt]# awk -F: '$1~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash #排除第7列noloogin的行,打印第1列与第7列
[root@localhost opt]# awk -F: '$7!~/nologin/{print $1,$7}' /etc/passwd #利用扩展正则过滤,以root或者adm开头的行,打印第1列与第7列
[root@localhost opt]# awk -F: '/^(root|adm)/{print $1,$7}' /etc/passwd
root /bin/bash
adm /sbin/nologin

awk使用数值/字符串比较设置条件

  • 等于: ==

  • 不等于: !=

  • 大于: >

  • 大于等于: >=

  • 小于: <

  • 小于等于:<=

#打印行号等于3
[root@localhost opt]# awk 'NR==3{print}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin #使用sed更加方便打印某一行
[root@localhost opt]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin #打印文件中第3列大于等于1000,打印第1列,第3列,第7列
[root@localhost opt]# awk -F: '$3>=1000{print $1,$3,$7}' /etc/passwd
lisi 1000 /bin/bash #打印文件中第三列小于1000,打印第1列,第3列,第7列
[root@localhost opt]# awk -F: '$3<1000{print $1,$3,$7}' /etc/passwd
root 0 /bin/bash #打印文件中第3列大于500并且小于1000,打印第1列,第3列,第7列
[root@localhost opt]# awk -F: '$3>500 && $3<1000 {print $1,$3,$7}' /etc/passwd
polkitd 999 /sbin/nologin #打印第一列不等于root的行
[root@localhost opt]# awk -F: '$1!="root"{print}' /etc/passwd

awk过滤时机:awk ‘BEGIN{指令} {指令} END{指令}’ 文件名

  • BEGIN{指令} #读取文件内容之前执行指令,指令执行一次,行前处理

  • {指令} #读取文件过程中执行,指令逐行执行,读一行,执行一次

  • END{指令} #读取文件内容结束后执行指令,指令执行一次,行后处理

#BEGIN{指令}行前处理
[root@localhost opt]# awk 'BEGIN{print "正在处理中"}'
正在处理中 #定义变量
[root@localhost opt]# awk "BEGIN{x=10;print x}"
10 #四则运算
[root@localhost opt]# awk "BEGIN{x=10;print x+5}"
15
[root@localhost opt]# awk "BEGIN{x=10;print x+5}"
15
[root@localhost opt]# awk "BEGIN{x=10;print x-5}"
5
[root@localhost opt]# awk "BEGIN{x=10;print x*5}"
50
[root@localhost opt]# awk "BEGIN{x=10;print x/5}"
2 [root@localhost opt]# awk "BEGIN{print 10+10}"
20
[root@localhost opt]# awk "BEGIN{print 10-5}"
5
[root@localhost opt]# awk "BEGIN{print 10*2}"
20
[root@localhost opt]# awk "BEGIN{print 10/3}"
3.33333
[root@localhost opt]# awk "BEGIN{print 10%3}"
1 #通过awk统计系统里使用bash解释器的用户有什么个?
[root@localhost opt]# awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd
27
[root@localhost opt]# awk '/bash$/{x++}END{print x}' /etc/passwd
27

awk分支结构

  • if单分支格式:if(条件){指令}
  • if双分支格式:if(条件){指令}else{指令}
#if单分支统计passwd文件中UID大于或等于1000的用户个数
awk -F: '{if($3>=1000){x++}} END{print x}' /etc/passwd
if($3>=1000){x++}
[root@localhost ~]# awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd #if双分支统计passwd文件中UID大于等于1000的用户,和小于1000的用户个数
[root@localhost ~]# awk -F: '{if($3>=1000){i++} else{x++}} END{print i,x}' /etc/passwd

awk数组

  • 定义数组格式1:数组名[下标]=值

  • 定义数组格式2:数组名[下标]

  • 数组的用法:for(变量名 in 数组名) {print 数组名[变量]}

#awk定义数组方式
[root@localhost ~]# awk 'BEGIN{x[0]=10;x[1]=20;print x[0],x[1]}'
10 20 #awk定义数组方式
[root@localhost ~]# awk 'BEGIN{x[0]++;print x[0]}'
1

awk循环结构

  • 命令格式:for(变量名 in 数组名){print 数组名[变量]}
[root@localhost ~]# awk 'BEGIN{a[0]=00;a[1]=11;a[2]=22;for(i in a){print i,a[i]}}'
0 0
1 11
2 22
  • awk命令格式2:前置命令 | awk [选项] '条件{指令}'
#通过awk打印剩余内存
[root@localhost opt]# free -h | grep Mem | awk '{print $4}'
134M
[root@localhost opt]# free -h | awk '/Mem/{print $4}'
134M #用awk写一个监控脚本,监控网卡的进出口流量
[root@localhost ~]# vim while_liuliang.sh
#!/bin/bash
while :
do
clear
ifconfig ens32 | awk '/inet /{print "IP:",$2}'
ifconfig ens32 | awk '/RX p/{print "入口流量:",$5}'
ifconfig ens32 | awk '/TX p/{print "出口流量:",$5}'
sleep 0.1
done #使用awk过滤系统根分区使用情况
[root@localhost ~]# df -h | grep '/$' | awk '{print $4}' | awk -FG '{print $1}'
51 #过滤根分区剩余空间与物理内存空间
[root@localhost ~]# vim df_free.sh
#!/bin/bash
df -h | grep '/$' | awk '{print "根分区剩余空间:",$4}'
free -h | grep Mem | awk '{print "物理内存剩余空间:", $4}' #通过awk统计用户登录系统的次数
[root@localhost ~]# who | awk '{ip[$1]++}END{for(i in ip)print i,ip[i]}'
root 1

RHCE_DAY04的更多相关文章

随机推荐

  1. 敢为人先,从阿里巴巴云原生团队实践Dapr案例,看分布式应用运行时前景

    背景 Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2 ...

  2. .net core mysql entity映射时字符串被截断

    参考地址:https://stackoverflow.com/questions/40833262/net-core-entity-framework-mysql-string-fields-stor ...

  3. 14.4、web排错三部曲

    1.在客户端上ping服务器端ip : ping 服务器ip地址 :#排除线路问题: 2.在客户端上telnet服务器端Ip 端口号: telnet 服务器ip地址 端口号:#排除防火墙的影响: 3. ...

  4. Pandas高级教程之:plot画图详解

    目录 简介 基础画图 其他图像 bar stacked bar barh Histograms box Area Scatter Hexagonal bin Pie 在画图中处理NaN数据 其他作图工 ...

  5. 【知识点】inline函数、回调函数、普通函数

    目录 一.inline内联函数 1.1 使用 1.2 编译器对 inline 函数处理步骤 1.3 优缺点 1.3.1 优点 1.3.2 慎用内联 1.3.3 不宜使用内联 1.4 虚函数(virtu ...

  6. Kafka:docker安装Kafka消息队列

    安装之前先看下图 Kafka基础架构及术语  Kafka基本组成 Kafka cluster: Kafka消息队列(存储消息的队列组件) Zookeeper: 注册中心(kafka集群依赖zookee ...

  7. XSS challenges 1-10

    学长发的xss靶场,刚好js学完了,上手整活. 这个提示说非常简单,直接插入就完事了 <script>alert(document.domain)</script> 第二关. ...

  8. gitlab用户,组,项目权限管控

    前言:gitlab上的权限管控是非常重要的,尤其是很多研发人员开发一个项目.这个是我总结的权限管控. 1.这个是创建项目时开放权限设置   2.这个创建用户设置的权限   3.用户权限,5种类型用户是 ...

  9. C# 8.0和.NET Core 3.0高级编程 分享笔记一:C#8.0与NET Core 3.0入门

    在学习C#相关知识的过程中,我们使用Visual Studio Code来入门整个C#. 一.安装Visual Studio Core环境 通过https://code.visualstudio.co ...

  10. ArchLinux安装步骤(一)

    本文为安装archlinux的教程,需要有硬盘分区,挂载等基础linux命令的了解还有vim的基本操作,不知道也没关系,这里有大神的视频教程ArchLinux指南. 确实是不是uefi模式 ls /s ...