shell脚本文本三剑客grep,sed,awk

news2024/10/6 8:38:44

1.  正则表达式,又称正规表达式、常规表达式

    使用字符串来描述、匹配一系列符合某个规则的字符串

    正则表达式组成:

    普通字符包括大小写字母、数字、标点符号及一些其他符号。

    元字符是指在正则表达式中具有特殊意义的专用字符

    man 7 regex

    可以使用man手册帮助

2、元字符

   基础正则表达式常见元字符

(支持的工具:grep、egrep、sed、awk)

 

3、扩展正则表达式元字符

grep -E

字符作用
+表示匹配前面的子表达式1次以上
?表示匹配前面的子表达式0或者1次

( )

将括号里的内容看成一个整体
|

以或的方式匹配字符串

4. grep

格式:

grep [选项]… 查找条件 目标文件



-color=auto    对匹配到的文本着色显示
-m  #             匹配到#次后停止;匹配到#行后停止

-v                   显示没有被匹配到的行,即取反
-i                    忽略字符大小写
-n                  显示匹配到的行号
-c                   统计匹配到的行数
-o                  仅显示匹配到的字符串
-q                  静默模式,不输出任何信息
-A                  匹配到的行后#行也显示出来
-B                  匹配到的行前#行也显示出来
-C                 匹配到的行前后各#行也显示出来
-e                  实现多个选项间的逻辑or关系
-w                 匹配整个单词
-E                 扩展正则表达式,相当于egrep
-F                 不支持正则表达式,相当于fgrep
-f                   file根据模式文件,处理两个文件相同内容,把第一个文件作为匹配条件

-r                  递归目录,但不处理软链接
-R                 递归目录,处理软链接
 

实例:

统计当前主机的连接状态

 统计当前连接的主机数

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

sed编辑器的工作流程:
sed 的工作流程主要包括读取、执行和显示三个过程:

读取:  sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式            空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed             命令将会在所有的行上依次执行。
显示:   发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内             容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完。
           在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,
除非是用重定向存储输出或者sed -i

sed命令的基本用法

格式:

sed [option]... 'script;script;...' [input  file...]
     选项         自身脚本语法         支持标准输入管道

常用选项:

-n          不输出模式空间内容到屏幕,即不自动打印
-e          多点编辑
-f           从指定文件中读取编辑脚本
-r,-E    使用扩展正则表达式
-i.bak     备份文件并原处编辑

4、sed脚本格式

单引号中间需要写脚本;脚本格式如下

利用具体操作,进一步熟悉sed 

(1)打印内容

 打印全部内容

sed ' '            #交互模式输入一行,自动打印一行相同的

sed -n ' '        #交互模式输入一行,关闭自动打印

sed -n ' p'      #加上p又恢复自动打印,与sed ' '相同

查看文件,打印全部内容 

sed    ' '    /etc/fatab

sed  -n  ' p'   /etc/fatab

 打印指定行内容 

sed -n '3p' /etc/fstab

打印第三行内容

 

ifconfig ens33 |sed -n '2,4p'

#打印网卡信息的2至4行

cat -n /etc/passwd |sed -n '2,+4p'

#打印第2至6行,即第二行开始往后四行

sed '3q' /etc/passwd

#打印三行后退出

打印最后一行,使用通配符$ 

sed -n '$p' /etc/passwd

支持正则表达式,打印范围内容

sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
 
#sed -n '/^b/,/^f/p' /etc/passwd
###     基本格式     '/表达式1/,/表达式2/p' (不要忘记打印)p  文件名

 过滤关键字

 

 

sed -n '2,/root/p' /etc/passwd

#从第二行开始,找到root为止

sed -n '/root/,3p' /etc/passwd

#找到第三个root位置

打印文本的奇数和偶数行 

 

 (2)删除内容

删除指定行

 

 删除指定多行 

 

删除空行

 

 删除以指定字符结尾的行及取反

 

 删除行,并原文备份

(3) 插入内容

在指定行后插入

插入空行,修改文件的换行,要多加一个\

 

(4)替换内容 

 

 

(5)搜索替换 

格式:格式:sed 行范围 s/旧字符串/新字符串/替换标记

替换标记:

  • 数字:表明新字符串将替换第几处匹配的地方

  • g : 表明新字符串将会替换所有匹配的地方

  • p : 打印与替换命令匹配的行,与 -n 一起使用

  • w 文件 :将替换的结果写到文件中

5.修改selinux开机不自启配置文件 

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

修改全局,后面加g

sed -i 's/root/admin/g' /etc/passwd

#将全局出现的root修改为admin

查找几点到几点之间的日志

sed -n '/2023:08:09/,/2023:09:42:37/p' access_log

 6.分组调用

调用分组段


分组使用()(),调用第一段使用\1
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/'
 
调用第2个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/'
 
调用第1个和第二个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2/'

7. 提取IP地址 

ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+)  (netmask) ([0-9.]+)  (broadcast) ([0-9.]+).*/\2/p'

8. awk

(1)什么是awk

awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

有多种版本:

AWK:原先来源于 AT & T 实验室的的AWK

NAWK:New awk,AT & T 实验室的AWK的升级版

GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容

GNU AWK 用户手册文档 

The GNU Awk User’s Guide

 在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

(2)工作原理

格式: 

 awk [options]  'program' var=value  file…

说明:

program通常是被放在单引号中,并可以由三种部分组成

  • BEGIN语句块

  • 模式匹配的通用语句块

  • END语句块

常见选项:

  • -F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符

  • -v var=value 变量赋值

Program格式:

pattern{action statements;..}  

pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END,正则表达式等
action statements:对数据进行处理,放在{}内指明,常见:print, printf
output statements:print,printf
Expressions:算术,比较表达式等
Compound statements:组合语句
Control statements:if, while等
input statements

执行过程:

常见的内建变量(可直接用) 

 

9.结合简单示例,对awk进一步理解 

打印文本内容

  • awk可以将自动将多个空格压缩成一个空格

  • 打印字符串需要加双引号

打印磁盘已经使用情况 

df |awk '{print $5}'

 

打印字符串 

awk '{print "hello"}'

 

打印字符串确定文件有多少行

awk '{print "hello"}' /etc/fstab

awk '{print "hello"}' /etc/fstab |wc -l

cat /etc/fstab |wc -l

 根据$n以及NR提取字段

 提取ip地址

根据选项-F指定分隔符

打印/etc/passwd所有用户名

cat /etc/passwd|awk -F":" '{print $1}'

cat /etc/passwd|awk -F: '{print $1}'

打印多列内容

打印时逗号可以表示空格,如果使用“:”或者“+”,需要将特殊符号加上双引号当成字符串打印

cat /etc/passwd|awk -F: '{print $1,$3}'
指定冒号作为分隔符,打印第一列和第三列
cat /etc/passwd|awk -F: '{print $1":"$3}'
用冒号分隔开
cat /etc/passwd|awk -F: '{print $1"\t"$3}'

打印磁盘已经使用情况,去除%

  1. #使用两条awk命令

  2. df|awk '{print $5}'|awk -F% '{print $1}'

  3. #使用一条awk命令

  4. df|awk -F"[ %]+" '{print $5}'

  5. ##也可以使用( |%)代表或者

  6. df|awk -F"( |%)+" '{print $5}'

 取出文本中的ip地址及时间 

取出文本中的主机并放回

根据关键字提取所在行

提取/etc/passwd 以root开头的行 

cat /etc/passwd |awk -F":" '/^root/{print}' 

 提取/etc/passwd root所在的行 

      cat /etc/passwd |awk -F: '/root/{print}'

 提取/etc/passwd nologin结尾的行 

  1. cat /etc/passwd |awk -F":" '/nologin$/{print}'

  2. ##如果提取/sbin/nologin,则需要\转义/

  3. cat /etc/passwd |awk -F":" '/\/sbin\/nologin$/{print}'

使用BEGIN输出包含指定字符的行并统计有多行

  • BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;

  • awk再处理指定的文本,之后再执行END模式中指定的动作;

  • END{ } 语句块中,往往会放入打印结果等语句。

  1. #先定义变量x,表示执行多少次

  2. awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd

FS:指定每行文本的字段分隔符,默认为空格或制表符,与-F相同

        awk -v FS=: '{print $1FS$3}' /etc/passwd

NF:当前处理行的整行内容 

当前处理的行的字段个数

cat /etc/passwd |awk -F: '{print NF}'

 打印出每行最后一个字段 

cat /etc/passwd |awk -F: '{print $NF}'

打印出每行倒数第二个字段

cat /etc/passwd |awk -F: '{print $(NF-1)}'

NR:当前处理行的行号 

当前处理的行的行号

  NR==n代表行号等于什么

       awk -F: 'NR==2 {print $1}' /etc/passwd 

  NR%2==0取偶数行

       awk -F: 'NR%2==0 {print NR"\t"$1}' /etc/passwd

NR%2==1取奇数行 

       awk -F: 'NR%2==1 {print $1}' /etc/passwd

NR==1,NR==4取区间行 

        awk -F: 'NR==1,NR==4 {print $1}' /etc/passwd

取UID数值范围$n>1000 

  1. #取uid大于1000的行

  2. awk -F: '$3>1000 {print}' /etc/passwd

  3. #取uid大于等于1000的行

  4. awk -F: '$3>=1000 {print}' /etc/passwd

 

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

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

相关文章

达梦数据库——数据迁移sqlserver-dm报错问题_未完待续

记录SQL server到达梦数据迁移过程中遇到的问题,持续更新中... 报错情况一:Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted b…

2024开工大吉,便宜寄快递该怎么选呢?

随着春节的结束,大部分人回到了工作的岗位,相信许多人还沉浸在过年的喜悦的氛围中呢,但是我们可以期盼下一个春节的到来了,言归正传,工作中总会收发快递了,尤其是最近,需要联络客户的感情了&…

vtkBoarderWidget及图片坐标包含计算

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题:移动图片到坐标轴的中心,创建一个vtkBoarderWidget控件,移动控件,计算控件与图片的包含关系 关键点…

【linux网络的综合应用】补充网关服务器搭建,综合应用SNAT、DNAT转换,dhcp分配、dns分离解析,nfs网络共享以及ssh免密登录

实验拓朴图: 1)网关服务器:ens36:12.0.0.254/24,ens33:192.168.100.254/24;Server1:192.168.100.101/24;PC1和server2:自动获取IP;交换机无需配置…

SSL数据加密一定能保证数据的完整性吗?

SSL数据加密是一种常见的网络安全措施,用于保护数据在传输过程中的安全。它通过使用加密算法将数据转换为密文,然后在传输过程中对数据进行保护,以防止数据被窃取或篡改。然而,尽管SSL数据加密可以提供一定程度的数据保密性&#…

光流方向以及 remap 重映射的理解

Date: 2023-09-07 省流:光流法计算prev 到next 的flow,之后flow (加上当前位置坐标)生成flow_map,利用flow_map 和OpenCV remap 函数,可以将next remap 得到 prev,即remap 后一帧得到前一帧图像…

spring boot学习第十三篇:使用jsonrpc

因为我学习spring boot会有很多内容&#xff0c;所以和spring boot有关的文章使用的pom.xml和application.yml这2个文件的内容就全列出来&#xff0c;不用再单独抽出来了&#xff0c;单独抽出来有点麻烦也不方便学习。 1、pom.xml文件内容如下&#xff1a; <?xml version…

[深度学习] 卷积神经网络“卷“在哪里?

​ &#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[深度学习] ❤️ 热门学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 目录 1.卷积的定义 2.卷积的"卷"在哪里 3.什么又是卷积神…

【HTML】SVG实现炫酷的描边动画

前沿 今天闲来无事&#xff0c;看到Antfu大佬的个性签名&#xff0c;觉得还是非常炫酷的&#xff0c;于是也想要搞一个自己的个性签名用来装饰自己的门面&#xff0c;不过由于手写的签名太丑了&#xff0c;遂放弃。于是尝试理解原理&#xff0c;深入研究此等密法&#xff0c;终…

读写分离的利器——MySQL Proxy

0 引言 MySQL Proxy是一个位于客户端和MySQL服务器端之间的程序&#xff0c;通过它可以实现监听和管理客户端与MySQL服务器端之间的通信&#xff0c;最大的作用是实现数据库的读写分离&#xff0c;从而达到负载均衡的目的。 MySQL Proxy的常用用途包括负载平衡、故障分析、查…

纯前端低代码平台demo,vue框架,nodejs,简单的pm2纯前端部署实践

文章目录 目录结构说明本地运行项目启动后的页面demo前端部署打包pm2nginx 后话 前段时间开发了一个纯前端的低代码平台demo&#xff0c;vue框架&#xff0c;nodejs&#xff0c;pm2纯前端部署实践。为此记录一下开发过程以及各方面遇到的问题&#xff0c;并作说明。 表单用了若…

74VHC4040使用方法

74VHC4040芯片是一款12位异步二进制计数器 Q:数据输出引脚。 CP:计数引脚。当CP引脚接收到下降沿&#xff08;从高电平电平变为低电平&#xff09;时&#xff0c;计数器的输出Q会加一。MR:复位输入。当MR引脚接收到高电平时&#xff0c;计数器的所有输出都会变为低电平&#…

特征提取匹配方案不止SuperPoint

局部特征匹配在计算机视觉领域广泛应用&#xff0c;涵盖图像检索、3D重建和目标识别等领域。然而&#xff0c;由于视点和光照变化等因素&#xff0c;改进匹配的准确性和鲁棒性仍然面临挑战。近年来&#xff0c;深度学习模型的引入引发了对局部特征匹配技术的广泛探索。这些方法…

MoonBit新增functional for loop控制流支持

1. 增加functional for loop控制流支持 与传统的命令式for loop 不同&#xff0c;循环变量是不可变的。这样的设计将来也容易抽取出来做形式化验证&#xff1a; fn init {for i 0; i < 5; i i 1 {debug(i)// i i 4 error: The variable i is not mutable.} }输出&am…

基于物联网的工业企业能耗监控系统

上海安科瑞电气股份有限公司 胡冠楠 咨询家&#xff1a;“Acrelhgn”&#xff0c;了解更多产品资讯 摘要&#xff1a;针对工业制造企业存在高能耗、高污染的问题&#xff0c;提出了一种用于工业企业能耗监控的多层级网络系统。本系统可完成企业内部电力、水资源以及燃气等能源…

【内网穿透】如何在小米4A中刷OpenWRT并实现公网访问本地路由器

文章目录 前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 前言 OpenWRT是一个高度模块化、高度自…

linux基础学习(10):基本权限与相关命令

1.基本权限 用ls -l查看当前目录文件时&#xff0c;可以看到文件的基本权限 其由10位组成&#xff0c;其中&#xff1a; 第1位&#xff1a;代表文件类型。 - d lbc普通文件目录文件软链接文件块设备文件&#xff0c;也就是硬盘等存储设备的文件字符设备文件&#xff0c;是鼠…

迈向AI时代:掌握Python编程与ChatGPT的强强联手

文章目录 一、ChatGPT与Python编程的结合二、利用ChatGPT学习Python编程的优势三、如何使用ChatGPT学习Python编程四、学习技巧与建议《码上行动&#xff1a;用ChatGPT学会Python编程》特色内容简介作者简介目录获取方式 随着人工智能技术的飞速发展&#xff0c;编程已经成为了…

如何在三维地球上加载obj、fbx、ifc、dae、3ds、gltf/glb模型?

通过以下方法可以在三维地球上加载obj、fbx、ifc、dae、3ds、gltf/glb模型。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe&#xff0c;安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“…

element-ui 中合并表格的总结

合并表头 <el-table :span-method"objectSpanMethod" :header-cell-style"headerMethod"/>// 合并表头headerMethod6({ row, cloumn, rowIndex, columnIndex }) {// row数组对应的是每一列row[0].colSpan 0row[1].colSpan 2if (columnIndex 0) {r…