shell脚本——正则表达式,grep,awk

2023-10-27

目录

正则表达式

1、元字符(字符匹配)

2、表示次数

3、位置锚定

4、分组或其他

grep

awk的用法

1、基础用法

2、awk常见的内置变量

FS        指定输出的每行文本的字段分隔符

OFS        输出时的分隔符

NF        当前处理的行的字段个数

NR:当前处理的行的行号

3、模式

4、条件判断


正则表达式

1、元字符(字符匹配)


.           匹配任意**单个字符**,可以是**汉字**
[ ]        匹配指定**范围内**的任意**单个字符**
[^]        匹配指定范围内**除外**的任意**单个字符**
[:alpha:]        代表任何英文大小写字符
[:alnum:]        代表字母和数字
[:lower:]        小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:]        大写字母,示例:[[:upper:]],相当于[A-Z]
[:balnk:]        空白字符(空格和制表符)
[:space:]         包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比**[:blank:]**包含的范围广
[:cntrl:]        不可打印的控制字符(退格、删除、警铃...)
[:digit:]         十进制数字
[:xdigit:]        十六进制数字
[:graph:]         可打印的非空白字符
[:print:]         可打印字符
[:punct:]        标点符号
\w         #匹配单词构成部分,等价于[_[:alnum:]]
\W         #匹配非单词构成部分,等价于[^_[:alnum:]]
\S             #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s             #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode         正则表达式会匹配全角空格符


元字符点(.

元字符"[ ]"

元字符"[^]" 

2、表示次数

*         #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*        #任意长度的任意字符,不包括0次
\?         #匹配其前面的字符出现0次或1次,即:可有可无
\+         #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}         #匹配前面的字符n次
\{m,n\}         #匹配前面的字符至少m次,至多n次
\{,n\}          #匹配前面的字符至多n次,<=n
\{n,\}          #匹配前面的字符至少n次

* #匹配前面的字符任意次,包括0次

 .*        #任意长度的任意字符,不包括0次

 \?         #匹配其前面的字符出现0次或1次,即:可有可无

 \+         #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次

 \{n\}         #匹配前面的字符n次

\{m,n\}         #匹配前面的字符至少m次,至多n次
\{,n\}          #匹配前面的字符至多n次,<=n
\{n,\}          #匹配前面的字符至少n次

3、位置锚定

^         #行首锚定, 用于模式的最左侧
$         #行尾锚定,用于模式的最右侧
^PATTERN$         #用于模式匹配整行 (单独一行  只有root)
^$         #空行
^[[:space:]]*$ #  空白行
\< 或 \b        #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词

例1:列出/etc/fstab文件内不是#号开头的非空行

[root@heitui opt]#grep "^[^#]" /etc/fstab

例2:统计/etc/fstab文件内有多少正常的单词

[root@heitui opt]#grep -o '\b[[:alpha:]]\+\b' /etc/fstab |wc -l

4、分组或其他

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名

方式为: \1, \2, \3, ...

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

 或者:|(\|)有些情况需要使用 \ 进行转义

例1:取出网卡的IP地址

[root@heitui ~]#ifconfig ens33|grep netmask|grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{3\}'|head -1

grep

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

  • -i:查找时忽略大小写

  • -v:反向查找,输出与查找条件不相符的行

  • -o 只显示匹配项

  • -f 对比两个文件的相同行

  • -c 匹配的行数([root@localhost ky15]# grep -c root passwd 2)

选项:
-color=auto 对匹配到的文本着色显示
-m  # 匹配#次后停止
grep -m 1 root /etc/passwd   #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
grep -c root /etc/passwd    #统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A    # after, 后#行 
grep -A3 root /etc/passwd   #匹配到的行后3行业显示出来
-B   # before, 前#行
-C   # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -E root|bash  /etc/passwd
-w 匹配整个单词
grep -w root /etc/passwd
useradd rooter
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f   file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r   递归目录,但不处理软链接
-R   递归目录,但处理软链接

-i:查找时忽略大小写
-o 只显示匹配项

 -v:反向查找,输出与查找条件不相符的行

-n 显示匹配的行号

-c 统计匹配的行数

 -A    n   ,after, 显示匹配的行与后n行

-B   n  , before, 显示匹配的行与前n行
-C   n , context, 前后各n行

awk的用法

1、基础用法

格式:awk   [选项]    '模式条件{操作}'

选项:

-F        指定分隔符

-v        自定义变量

-f        脚本

例一:打印

[root@heitui opt]#awk '{print "hello"}'   #如果print后面不加打印内容,你输入什么就打印什么
1
hello
2
hello
3
hello

 例二:使用awk过滤出剩余内存大小

[root@heitui opt]#free -h|awk '{print $4}'|tail -n +2

 例三:提取host.txt主机名

www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com

[root@heitui opt]#cat host.txt |awk -F '.' '{print $1}'

 例四:查出/tmp的权限,以数字方式显示

[root@heitui opt]#stat /tmp|awk -F'[/(]' '/权限/{print $2}'

2、awk常见的内置变量

  • FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"

  • OFS:输出时的分隔符

  • NF:当前处理的行的字段个数

  • NR:当前处理的行的行号(序数)

  • $0:当前处理的行的整行内容

  • $n:当前处理行的第n个字段(第n列)

  • FILENAME:被处理的文件名

  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

FS        指定输出的每行文本的字段分隔符

[root@heitui ~]#awk -v FS=':' '{print $1FS$3}' /etc/passwd

OFS        输出时的分隔符

[root@heitui ~]#awk -v FS=':' -v OFS='==' '{print $1,$3}' /etc/passwd

NF        当前处理的行的字段个数

[root@heitui ~]#awk -F: '{print NF}' /etc/passwd

NR:当前处理的行的行号

[root@heitui ~]#awk 'NR==1,NR==3{print}' /etc/passwd

3、模式

wak     '模式{处理动作}'

不支持使用行号,但是可以使用变量NR 间接指定行号

[root@heitui ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd

 取奇数和偶数

[root@heitui ~]#seq 10 | awk 'NR%2==1'

[root@heitui ~]#seq 10 | awk 'NR%2==0'

4、条件判断

在awk中套用if条件判断

如:过滤出系统中uid号大于1000的用户名和uid号

[root@heitui ~]#awk -F: '{if($3>1000)print $1,$3}' /etc/passwd

 

面试题

1.统计/etc/fstab文件中每个文件系统类型出现的次数

[root@heitui ~]#cat /etc/fstab        #先查看/etc/fstab文件中需要取得内容有何特点

[root@heitui ~]#cat /etc/fstab |tail -4         # 要去的内容都在最后四行中

[root@heitui ~]#cat /etc/fstab |tail -4|awk '{print $3}'         #取出需要的内容

[root@heitui ~]#cat /etc/fstab |tail -4|awk '{print $3}'|uniq -c         #去重,列出每个文件系统出现的次数

2.统计/etc/fstab文件中每个单词出现的次数

[root@heitui ~]#cat /etc/fstab |grep -Eo '\b[[:alnum:]]+\b'|uniq -c

3.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

方法一

[root@heitui ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" |grep -o "[0-9]"

方法二

[root@heitui ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|tr -cd "[0-9]\n"   

#使用\n换行,否则就会出现下图的情况

4.提取host.txt主机名并放入原文件

host.txt

www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com


[root@heitui opt]#cat host.txt |awk -F'.' '{print $1}'>>host.txt

5.查出/tmp的权限,以数字方式显示

[root@heitui ~]#stat /tmp|awk -F'[(/]' '/权限/{print $2}'

6.查出用户UID最大值的用户名、UID及shell类型

[root@heitui ~]#cat /etc/passwd |sort -t: -k 3 -rn|awk -F':' '{print $1 $3 $7}'|head -1

#思路 :先观察格式,然后以“:”为分隔符,按照第三列排倒序,然后过滤出第一三七列,最后取第一个,就是UID最大的一个

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本——正则表达式,grep,awk 的相关文章

  • perl regex是什么_如何在Perl单行代码中使用Regex匹配多行

    perl regex是什么 Perl one liners with perl s regular expression statement can be a very powerful text processing tools used
  • 用Matlab作函数的图像

    函数简介 1 作图函数是plot 其调用格式如下 plot y plot x y plot x y LineSpec plot x1 y1 s1 x2 y2 s2 x3 y3 s3 说明 1 plot y 绘出以向量y为纵坐标 y的个元素的
  • DNF管理软件包

    DNF是一款Linux软件包管理工具 用于管理RPM软件包 DNF可以查询软件包信息 从指定软件库获取软件包 自动处理依赖关系以安装或卸载软件包 以及更新系统到最新可用版本 DNF与YUM完全兼容 提供了YUM兼容的命令行以及为扩展和插件提
  • 正则表达式中.*的作用

    今天看正则表达式的书籍是看到这么个例子 要求匹配 文章中的xml 匹配使用的正则表达式为 lt xml gt 一开始没有理解 是做什么用处的 百度了一番后明白了 原来 中 代表任意单个字符 包括空格 代表前面任意单个字符的重复次数 因此 l
  • Day 13 - 正则表达式习题

    利用正则表达式完成下面的操作 1 用户名匹配 要求 1 用户名只能包含数字 字母 下划线 2 不能以数字开头 3 度在 6 到 16 位范围内 re username re compile r a zA Z w 5 15 print re
  • 【Python_requests学习笔记(一)】基于requests和re模块,爬取百度图片

    基于requests和re模块 爬取百度图片 前言 此篇文章中介绍requests的基本用法 和基于requests和re模块 爬取百度图片的案例 正文 1 requests模块 1 1 requests模块介绍 requests模块 类似
  • 人人都看得懂的正则表达式教程

    编写验证规则最流行和最简单的方法就是正则表达式了 但唯一的一个问题是正则表达式的语法太隐晦了 让人蛋疼无比 很多开发者为了在项目中应用复杂的验证 经常要使用一些小抄来记住正则式的复杂语法和各种常用命令 在这篇文章中 我将试图让大家明白什么是
  • 正则表达式大全

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • Linux文本处理工具和正则表达式

    Linux文本处理工具和正则表达式 一 查看 截取和修改文本的工具 1 查看文本的工具 cat 最常用的文件查看命令 当不指明文件或者文件名为一杠 时 读取标准输入 cat OPTION FILE A 显示所有控制符 tab键 I 行结束符
  • Nmap源码分析(服务与版本扫描)

    Nmap源码分析 服务与版本扫描 2012年8月23日 在进行端口扫描后 Nmap可以进一步探测出运行在端口上的服务类型及应用程序的版本 目前Nmap可以识别几千种服务程序的签名 Signature 覆盖了180多种应用协议 比如 端口扫描
  • 4.4.5 密码验证(2)

    4 当且仅当含数字和字母的密码验证 如果密码当且仅当包含数字和字母 那么该密码的强度是中等强度 当然 它的安全性一般 以下正则表达式能够验证当且仅当包含数字和字母的密码 da zA Z d a zA Z da zA Z 74 正则表达式 7
  • JavaScript最后分水岭——正则表达式

    个人简介 个人主页 微风洋洋 博客领域 编程基础 后端 写作风格 干货 干货 还是tmd的干货 精选专栏 JavaScript 支持洋锅 点赞 收藏 留言 好久不见 甚是想念 大家好 我是微风洋洋 也可以叫我洋锅 细心地小伙伴可能已经发现
  • 对字符串进行正则取子串

    题目是这样的 对一段HTML网页内容 解析出其中所有的键值对 比如其中type text type为属性 text为值 二者为一个键值对 内容如下
  • 使用正则表达式爬虫抓取猫眼电影排行Top100

    目标站点分析 分析网址 首页 https maoyan com 点击榜单 https maoyan com board 点击Top100 https maoyan com board 4 目标站点为 https maoyan com boa
  • 中文姓名、电话、邮箱的正则表达式

    1 中文姓名 如 张三 噶及 洛克业 a zA Z0 9 u4e00 u9fa5 1 10 2 电话验证 如 010 85369999 186199999 0 d 2 3 d 7 8 d 3 5 13 14 15 18 17 d 9 3 电
  • C#中Validating和Validated事件

    您可能经常需要检查用户输入到 Windows 窗体中的信息是否有效 例如 如果您有一个电话号码的 TextBox 控件 则可以检查该控件是否只包含适当的字符 数字 括号和连字符等等 通常 可使用正则表达式验证用户输入的数据 了解Valida
  • QRegexp、QRegularExpression的用法学习

    QRegexp QRegularExpression的用法学习 文章目录 QRegexp QRegularExpression的用法学习 QRegexp QRegularExpression 模式选项 QRegexp Regexp 由表达式
  • java OpenOffice把word转html(Convert word to html )

    1 下载安装OpenOffice 网址http download openoffice org index html 2 下载第三方工具包JODConverter http www artofsolving com opensource j
  • 正则校验手机号

    正则表达式可以用来校验手机号码的合法性 如果你想使用正则表达式来校验中国大陆的手机号码 可以使用如下的正则表达式 1 3 9 d 9 这个正则表达式可以匹配所有 13 到 19 开头的 11 位数字 即所有中国大陆的手机号码 例如 如果你想
  • 【Python】Python 模式匹配与正则表达式

    Python 模式匹配与正则表达式 1 模式匹配与正则表达式 你可能熟悉文本查找 即按下Ctrl F 输入你要查找的词 正则表达式 更进一步 它们让你指定要查找的 模式 你也许不知道一家公司的准确电话号码 但如果你住在美国或加拿大 你就知道

随机推荐

  • Springboot定时任务

    下文为 Scheduled的使用方法 1 简介 Scheduled支持三种部署方式 fixedRate fixedRateString 上一次执行开始后 n秒后再次执 fixedDelay fixedDelayString 上一次执行完毕后
  • 舵机的三条线分别代表什么

    橙色信号线 红色正极 棕褐色负极
  • @RequestParam和@PathVariable的用法与区别

    SpringBoot PathVariable URL变量 Web应用中的URL通常不是一成不变的 例如微博两个不同用户的个人主页对应两个不同的URL http weibo com user1和http weibo com user2 我们
  • 工厂(factory)模式

    转自 http www cnblogs com hegezhou hot archive 2010 11 30 1892227 html 一 开篇 一个多月没有写文章了 一方面是由于家庭的原因 还有一方面是因为工作上的原因 所以在这里给大家
  • 使用hutool库,对excel进行一些导出、导入操作

    所用到的各种类 依赖的话百度一下吧 最后再给上全部代码 import cn hutool core collection CollUtil import cn hutool core io IoUtil import cn hutool p
  • Struts 2 标签

    原文 https www mkyong com struts2 struts 2 shidden hidden value example 在struts2中可以使用
  • 调gensim库,word2vec模型的保存和加载

    一 模型的保存 模型保存可以有很多种格式 根据格式的不同可以分为2种 一种是保存为 model的文件 一种是非 model文件的保存 我常用的保存格式是 model和 vector直接上代码和结果 1 保存为model文件 数据的读入 fi
  • PCIe中断之MSI和MSI-X的区别(详细)总结附图文快速掌握

    目录 一 整体介绍 二 MSI和MSI X对比 2 1 中断向量连续 2 2 映射区域区别 2 3 MSI X配置空间 2 3 1 MSI X Capbility介绍 2 3 2 Capbility ID介绍 2 3 3 Message C
  • tree树做过滤

    代码如下 递归tree关键词搜索 param key 需要递归的key名 param keyword 需要搜索查询的关键字 param treeList 遍历tree列表 param first 是否是首次传入 默认true functio
  • Thymeleaf (select、checkbox)数据绑定和数据回回显

    第一种情况 select 数据绑定 前端页面 div class col sm 10 div
  • 放大电路中的自激震荡及相位补偿方法

    自激震荡 产生原因 1 电容对信号的超前和滞后作用 要分析自激震荡 首先得了解电路中的相移 放大电路中使信号发生相移的罪魁祸首主要在于电容 如果电容串接在电路中 则构成高通滤波电路 在截止频率之前相位超前90 2 之后相移为0 如图1所示
  • 2023年数学建模:种群竞争模型及其MATLAB实现

    订阅专栏后9月比赛期间会分享思路及Matlab代码 目录 种群竞争模型 MATLAB实现 实战案例 两种昆虫的竞争
  • Typora常用快捷键(详细)

    1 typora常用快捷键 ctrl 切换编辑语法模式 预览模式 ctrl 1 6 标题1 6 等同于 一级标题 空格 标题内容 二级标题 空格 标题内容 三级标题 空格 标题内容 最多六级标题 ctrl B 粗体 ctrl I 斜体 ct
  • Unity编译Android的原理解析和apk打包分析

    作者 张坤 最近由于想在Scene的脚本组件中 调用Android的Activity的相关接口 就需要弄明白Scene和Activity的实际对应关系 并对Unity调用Android的部分原理进行了研究 本文主要探讨Scene和Activ
  • [机器学习] 代价函数(cost function)

    前言 代价函数也叫做损失函数 loss function 机器学习中训练模型的过程就是优化代价函数的过程 代价函数对每个参数的偏导数就是梯度下降中的梯度 1 代价函数的定义 假设有训练样本 x y 模型为f 参数为w f w wTx w T
  • Android项目构建之build.gradle配置与打包

    一 build gradle配置 Google推荐使用的Android Studio是采用Gradle来构建项目的 Gradle是用了一种基于Groovy的领域特定语言 DSL Domain Specific Language 来声明项目设
  • 数据库系统实现课程设计:图书管理系统

    图书管理系统 项目简介 开发环境 数据层 控制层 表示层 项目简介 围绕中小学 注 无图书馆 图书管理需求 如采购入库 图书编码 借书还书 图书出库 设计合理的系统功能模块和数据库结构 构建一个较为实用的图书管理系统 任务要求 按照软件工程
  • Electron-vue环境配置,打包报错问题解决

    Electron vue 项目构建过程 1 搭建Electron vue框架 参照网址 https electron org cn 2 执行npm install npm 在国内比较慢 所以采用淘宝镜像代理 执行以下命令 安装cnpm np
  • Android初级到高级视频教程全套 百度网盘下载

    百度网盘视频资源下载 https pan baidu com s 1MVYKj4L8 1nU7Er3z5UGRA https pan baidu com s 1ewu5bDpuggEu9y KCZC bg 入门级 中级 高级 进阶级 更多资
  • shell脚本——正则表达式,grep,awk

    目录 正则表达式 1 元字符 字符匹配 2 表示次数 3 位置锚定 4 分组或其他 grep awk的用法 1 基础用法 2 awk常见的内置变量 FS 指定输出的每行文本的字段分隔符 OFS 输出时的分隔符 NF 当前处理的行的字段个数