shell脚本-grep、sed、awk三剑客

文章目录

  • 介绍
  • 基本正则表达式
    • 正则表达式的基本组成部分
    • 案例
  • grep用法
    • 案例
  • sed流编辑器
  • awk:报告生成器
    • 案例
  • awk区块原理
    • 区域构成
    • awk 的执行流程
  • awk高级使用
    • 1. AWK 变量
    • 2. AWK 内置变量
  • awk操作符
    • 1. 算数操作符
    • 2. 赋值操作符
    • 3. 布尔值
    • 4. 比较操作符
    • 5. 逻辑操作符
  • awk常见的模式类型
    • 1. 正则表达式 (regexp)
    • 2. 表达式 (expression)
    • 3. 匹配范围 (ranges)
    • 4. 特殊模式 (BEGIN/END)
  • awk 中数组的使用
    • 数组的使用
    • 示例


介绍

Shell 脚本中的 grep、sed 和 awk 被称为 “三剑客”,它们是文本处理中的利器。grep 用于快速搜索文本,sed 则是对文本进行编辑和转换,而 awk 则提供了更强大的文本处理能力,可以按字段分割、执行条件操作等。这三者结合起来,能够处理各种文本处理任务,如日志分析、数据提取、格式转换等。

基本正则表达式

正则表达式的基本组成部分

  • ^:行起始标记
  • $:行尾标记
  • .:匹配任意一个(单个)字符
  • []:匹配包含在[字符]之中的任意一个字符
  • [^]:匹配除[^字符]之外的任意一个字符
  • [-]:匹配中指定范围内的任意一个字符
  • ?:匹配之前的项1或0次
  • +:匹配之前的项1次或多次
  • *:匹配之前的项0或多次
  • ():创建一个用于匹配的字串
  • {n}:匹配之前的项n次
  • {n,}:之前的项至少需要匹配n次
  • {n,m}:指定之前的项所必需匹配
  • |:交替匹配|两边的任意一项
  • \:转义字符可以将上面的特殊字符进行转义

案例

  • ^linux: 以"linux"开头
  • linux$: 以"linux"结尾
  • Alex.: 匹配"Alexs"等
  • coo[kl]: 匹配"cool"或"cook"
  • 9[^5689]: 匹配"91"、“92"等,但不匹配"95”、"98"等
  • [0-9]: 匹配任意一个数字
  • [a-z]|[A-Z]: 匹配任意一个大小写字母
  • colou?r: 匹配"color"或"clolur",但不能匹配"colouur"
  • rollno-9+: 匹配"rollno-9"、“rollno-99”、“rollno-999”,但不匹配"rollno-"
  • co*l: 匹配"cl"、“col”、“cool”、"coool"等
  • ma(tri)x: 匹配"matrix"
  • [0-9]{3}: 匹配任意一个三位数,等同于[0-9][0-9][0-9]
  • [0-9]{2,}: 匹配任意一个两位数或更多位的数字
  • [0-9]{2,5}: 匹配从两位数到五位数之间的任意一个数字
  • Oct (1st|2nd): 匹配"Oct 1st"或"Oct 2nd"
  • a\.b: 匹配"a.b",但不能匹配"ajb"
  • [a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}: 匹配一个邮箱地址
  • [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}: 匹配IP地址

grep用法

grep 的作用是检索,即根据条件查找目标文件中的匹配内容。

语法格式:
grep [选项] [条件表达式] 目标文件

常用选项:

  • -e:匹配多个表达式
  • -R:递归搜索
  • -n:显示匹配的行号
  • -o:只输出匹配内容
  • -E:支持扩展正则表达式
  • -c:统计匹配次数
  • -v:取反,即显示不匹配的内容
  • -l:显示匹配的文件名
  • -L:显示不匹配的文件名
  • -A:显示匹配行后的行数
  • -B:显示匹配行前的行数

案例

[root@ns ~]# cat /proc/meminfo | grep -e Mem -e Cache -e Swap  # 查看系统内存、缓存、交换分区
[root@ns ~]# grep -R -o -n -E '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/  # 查找/etc目录下的所有文件中的邮件地址;-R递归,-n表示匹配的行号,-o只输出匹配内容,-E支持扩展正则表达式
[root@ns ~]# grep -R -c 'HOSTNAME' /etc/ | grep -v "0$"  # 查找/etc/目录下文件中包含“HOSTNAME”的次数,-c统计匹配次数,-v取反
[root@ns ~]# grep -R -l 'HOSTNAME' /etc/  # 查找包含“HOSTNAME”的文件名,-l显示匹配的文件名,-L显示不匹配的文件名
[root@ns ~]# dmesg | grep -n --color=auto 'eth'  # 查找内核日志中eth的行,显示颜色及行号
[root@ns ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth'  # 用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起找出出来显示
[root@ns ~]# cat /etc/passwd | grep -c bash$  # 统计系统中能登录的用户的个数
[root@ns tmp]# touch /tmp/{123,123123,456,1234567}.txt  # 创建测试文件,以下三条命令是一样的效果,匹配文件名123,可以包含1个到多个
[root@ns tmp]# ls | grep -E '(123)+' 
[root@ns tmp]# ls | grep '\(123\)\+'
[root@ns tmp]# ls | egrep '(123)+'
[root@ns ~]# ps -ef | grep -c httpd  # 统计httpd进程数量
[root@ns ~]# grep -C 4 'games' --color /etc/passwd  # 显示games匹配的“-C”前后4行
[root@ns ~]# grep ^adm /etc/group  # 查看adm组的信息
[root@ns ~]# ip a | grep -E '^[0-9]' | awk -F : '{print $2}'  # 获取网卡名称
[root@ns ~]# ifconfig eth0 | grep -E -o 'inet addr:[^ ]*' | grep -o '[0-9.]*'  # 截取ip地址,[^ ]*表示以非空字符作为结束符,[0-9.]*表示数字和点的组合
[root@ns ~]# ifconfig eth0 | grep -i hwaddr | awk '{print $5}'  # 截取MAC地址
[root@ns ~]# cat test.txt  # 测试文档:使用grep -E命令练习正则表达式
[root@ns tmp]# cat test.txt 
ABcd
10.10.10.10
color
colur
Alex2
colouur
rollno-9
i like linux
linux funny.
I am Alex.
rollno-99
rollno-999
cl
col
cool
coool
cook
max
matrix
192.168.100.100
123456789
123123123
123123
23346123
123
12
12345
94
95
96
97
98
99
100
Oct 1st
Oct 2nd
a.b
ajb
abc
Alex@qq.com
linux
[root@ns tmp]# 

sed流编辑器

sed流编辑器:实现对文本的增删改查

# 改
[root@ns ~]# sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1  # 只是显示,不修改
[root@ns ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
[root@ns ~]# sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1  # 只修改,不显示
[root@ns ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1  # 验证
[root@ns ~]# vim ip  # 编写测试文件 
IP1=static
IP2=static
IP=static
:wq
[root@ns ~]# sed -i 's/dhcp/static/g' ip  # 将所有的dhcp替换为static
[root@ns ~]# sed -i '/^IP1/s/static/dhcp/g' ip  # 将IP1开头的行替换
[root@ns ~]# sed -i '2s/static/dhcp/g' ip  # 指定特定行号2行替换
[root@ns ~]# cat -n /etc/selinux/config  # 查看并显示行号
[root@ns ~]# sed -i '7s/disabled/enforcing/g' /etc/selinux/config  # 开启selinux
[root@ns ~]# sed -i '7s/disabled/enforcing/g' /etc/selinux/config# 删
[root@ns ~]# vim  ip  # 添加空行
[root@ns ~]# sed '/^$/d' ip  # 删除空行并显示在屏幕上
[root@ns ~]# sed -i '/IP1/d' ip  # 删除包含IP1的行
[root@ns ~]# sed -i '/^IP2/d' ip  # 删除以IP2开头的行
[root@ns ~]# sed -i '2d' ip  # 删除第二行# 增
[root@ns ~]# sed 'a IP3=static' ip  # 每一行后都加上IP3=static
[root@ns ~]# sed '3a IP3=static' ip  # 只在第3行后加上IP3=static,并显示不修改
[root@ns ~]# sed '3i IP3=static' ip  # 只在第3行前加上IP3=static,显示不修改
[root@ns ~]# sed -i '3a IP3=static' ip  # 修改,不显示
[root@ns ~]# sed -i '/^IP3/a "test add"' ip  # 在以IP3开头的行后添加# 查
[root@ns ~]# sed -n '2p' /etc/hosts  # 查看第二行
[root@ns ~]# sed -n '/www/p' /var/named/chroot/var/named/Alex.cn.zone  # 查看包含www的解析记录
[root@ns ~]# sed -n '/.100$/p' /var/named/chroot/var/named/Alex.cn.zone  # 查看以.100结尾的行
[root@ns ~]# sed -n '2~2p' ip  # 从第二行,每隔两行显示

awk:报告生成器

# awk的作用是将文件格式化后显示信息。
# 语法:
awk [选项] '模式{ 动作(action) }' 文件1 文件2 ...# 最常见的动作:print, printf# awk的基本原理特征:
# 1)每一次取一行
# 2)根据指定的分隔符(不指定是位空白字符)将该行切割位列,使用$0(整行),$1,$2,$3...(第一列,第二列,...)
# 3)可以指定行号,列号,切割符,操作后分隔符

在这里插入图片描述

案例

chkconfig --list | grep 3:启用 | awk '{print $1}'
tail -1 /etc/passwd | awk -F ':' 'BEGIN{OFS="---"}{print $1,$6,$7}'   # OFS指定输出分隔符
ifconfig eth1 | awk -F '[ :]+' 'NR==2 {print $4}'
ifconfig eth1 | awk -F '[ :]+' 'NR==2 {print "eth1_ip="$4}'  # 可以加入显示内容
awk 'BEGIN {print "line one \nline two\nline three"}'

awk区块原理

每一条编辑指令若包含多条语句,则以分号隔开。如果有多条编辑指令,则使用以分号或者空格分隔的多个{ }区域。

区域构成

区块
BEGIN { 动作 } ## 开始处理第一行文本之前的操作
{ 动作 } ## 针对每一行文本的处理操作
END { 动作 } ## 处理完最后一行文本之后的操作

awk 的执行流程

  • 1)首先执行 BEGIN { } 区块中的初始化操作;
  • 2)然后从指定的数据文件中循环读取一个数据行(自动更新 NF、 NR、 $0、 $1…… 等内建变量的值),并执行’模式或条件{ 动作 }';
  • 3)最后执行 END { } 区块中的后续处理操作。

awk高级使用

1. AWK 变量

  • FS:列分隔符,默认为空白
  • RS:行分隔符,默认为换行符
  • OFS:输出列分隔符
  • ORS:输出行分隔符

2. AWK 内置变量

  • NR:处理中的行数
  • FNR:单个文件的行数
  • NF:列的个数

在 MarkdownPad2 中,你可以将 awk 操作符优化为如下形式:

awk操作符

1. 算数操作符

  • -x
  • +x
  • x^y
  • x**y
  • x*y
  • x/y
  • x+y
  • x-y
  • x%y

2. 赋值操作符

  • =
  • +=
  • -=
  • *=
  • /=
  • %=
  • ++
  • --

3. 布尔值

在 awk 中,任何非零值或非空字符串都为真,反之为假。

4. 比较操作符

  • >
  • <
  • >=
  • <=
  • ==
  • !=
  • ~ (字符串能被表达式 y 匹配)
  • !~ (字符串不能被表达式 y 匹配)

5. 逻辑操作符

  • &&
  • ||
  • !

awk常见的模式类型

1. 正则表达式 (regexp)

使用 /regular expression/ 格式的正则表达式进行匹配。

awk -F : '/^u/{print $1}' /etc/passwd

2. 表达式 (expression)

使用值非零或非空字符串的表达式进行条件判断。

awk -F : '$3>=500{print $1,$3,$7}' /etc/passwd  # 打印普通用户
awk -F : '$3+1<=100 && $3+1>=10{print $1,$3,$7}' /etc/passwd  # UID在10-100之间的用户
awk -F : '$2=="!!"{print $1,$2}' /etc/shadow  # 检查未初始化密码的用户
passwd -d u01
awk -F : '$2==""{print $1}' /etc/shadow  # 打印密码为空的用户
awk -F : '$7~"bash$"{print $1,$3,$7}' /etc/passwd  # 匹配$7为bash结束行
awk -F : '$7!~"bash$"{print $1,$3,$7}' /etc/passwd

3. 匹配范围 (ranges)

指定的匹配范围,格式为 part1,part2

awk -F : '$3==3,$3==10{print $1,$3,$7}' /etc/passwd
awk -F : '$1=="root",$1=="adm"{print $1,$3,$7}' /etc/passwd
awk -F : '/^r/,/^a/{print $1,$3,$7}' /etc/passwd

4. 特殊模式 (BEGIN/END)

在处理开始前(BEGIN)或处理结束后(END)执行的特殊模式。

awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd  # 在处理前打印头部
awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}$7~"bash$"{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd  # 多个模式混合使用
awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}$7~"bash$"{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "End of report"}' /etc/passwd  # 在处理后打印尾部
awk -v i=1 '$5~"yum"{i++}END{print "yum use times:", i}' /var/log/messages

awk 中数组的使用

数组的使用

在 awk 中,数组的下标(index-expression)可以是任意字符串。如果某个数组元素事先不存在,awk 会自动创建该元素并初始化为空串。要判断数组中是否存在某个元素,需要使用 下标 in 数组 的方式。要遍历数组中的每个元素,可以使用特殊结构 for (变量 in 数组) { 语句1, ... }

例如:

state[abc]=3
state[efg]=6
for (A in state) {print A,state[A]
}

其中,Aindex-expression(下标abc/efg),state[A] 是具体的值(3/6)。

示例

假设我们有以下 netstat -ant 命令的输出:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address    Foreign Address        State      
tcp        0      0 0.0.0.0:22       0.0.0.0:*           LISTEN      
tcp        0      0 127.0.0.1:25     0.0.0.0:*           LISTEN      
tcp        0      0 192.168.1.106:22 192.168.1.101:36318 ESTABLISHED 

若要统计每种状态的个数,只需将 state 作为数组下标,然后使用 ++ 自增操作即可。

netstat -ant | awk '/^tcp|^udp/ {state[$6]++} END {for (i in state) {print i,state[i]}}'

这段代码中,state[$6]++ 表示定义数组 state[]$6 是下标,++ 表示自增1。

另一个示例是使用 awk 遍历 /etc/passwd 文件中的每一行,如果用户的 shell 是 bash,且其 UID 在 1 到 500 之间,则将其 shell 修改为 /sbin/nologin

for i in $(awk -F : '$7~"bash$" {if($3 > 1 && $3 < 500) print $1}' /etc/passwd); dochsh -s /sbin/nologin $i;
done

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

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

相关文章

gPTP简介

1、gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议 gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议&#xff0c;即IEEE 802.1AS协议。它是IEEE 1588协议的延伸&#xff0c;可以为TSN提供全局精准…

M3C芯片——支持工业级HMI应用,集成2D加速、4路串口及2路CAN

M3C芯片是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU&#xff0c;配备强大的 2D 图形加速处理器、PNG/JPEG 解码引擎、丰富的接口&#xff0c;支持工业宽温&#xff0c;具有高可靠性、高开放性&#xff0c;可广泛应用于工业自动化控制、HMI人机交互、 …

RPC学习笔记一

什么是RPC RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种用于实现分布式系统中不同计算机或进程之间进行通信和调用的技术和模式。 在传统的过程调用中&#xff0c;当一个程序需要调用另一个程序的函数或方法时&#xff0c;通常是在同一台…

Python条件语句深度解析:从基础到应用的全面指南

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 一、引言 &#x1f4dd; 二、…

如何申请https证书

目录 第一步先选择合适的证书类型&#xff1a; 第二步在填写自己需要保护的域名信息&#xff1a; 第三步验证域名所有权&#xff08;或者是单位组织信息、详细组织单位业务详情&#xff09;&#xff1a; 第四步验证完成后证书会正常签发&#xff1a; 第五步将下载完成的证书…

一款基于 SpringCloud 开发的AI聊天机器人系统,已对接GPT-4.0,非常强大

简介 一个基于SpringCloud的Chatgpt机器人&#xff0c;已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图。用户可以在界面上与聊天机器人进行对话&#xff0c;聊天机器人会根据用户的输入自动生成回复。同时也支持画图&#xff0c;用户输入文本…

swagger3快速使用

目录 &#x1f37f;1.导入依赖 &#x1f32d;2.添加配置文件 &#x1f9c2;3.添加注解 &#x1f96f;4.访问客户端 1.导入依赖 引入swagger3的依赖包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artif…

RealBasicVSR使用记录

对各种场景图片、视频超分结果都很不错的模型。 paper&#xff1a;https://arxiv.org/pdf/2111.12704.pdf code&#xff1a;https://github.com/ckkelvinchan/RealBasicVSR 一、使用步骤 1. git clone https://github.com/ckkelvinchan/RealBasicVSR.git 2. 我的环境已安装…

主机与windows虚拟机远程桌面实现方法

目录 一、虚拟机相关配置1. 配置虚拟机网络2. 打开虚拟机远程桌面功能3. 配置虚拟机用户与分组 二、主机相关配置 当无法通过共享文件夹实现主机与windows虚拟机文件共享时&#xff0c;可以通过主机与虚拟机远程桌面的方法实现文件的共享传输。本文主要介绍主机与虚拟机远程桌面…

01.Linked-List-Basic

1. 链表简介 1.1 链表定义 链表&#xff08;Linked List&#xff09;&#xff1a;一种线性表数据结构。它使用一组任意的存储单元&#xff08;可以是连续的&#xff0c;也可以是不连续的&#xff09;&#xff0c;来存储一组具有相同类型的数据。 简单来说&#xff0c;「链表」…

5G安全技术新突破!亚信安全5G安全迅龙引擎正式发布

5G专网应用飞速增长&#xff1a;2020年5G专网数量800个&#xff0c;2021年2300个&#xff0c;2022年5325个&#xff0c;2023年已经超过16000个&#xff0c;5G与垂直行业的融合快速加深&#xff0c;5G带来的变革正加速渗透至各行各业。 5G网络出现安全问题&#xff0c;将是异常严…

【原创】手动安装open-webui,非官方docker安装方法,可汉化ui

open-webui是一个为LLMs&#xff08;大型语言模型&#xff09;设计的友好型Web用户界面&#xff0c;支持Ollama和OpenAI兼容的API。它提供了直观的聊天界面、响应式设计、快速响应性能、简易安装、代码语法高亮、Markdown和LaTeX支持、本地RAG集成、Web浏览能力、提示预设支持、…

初识JavaScript

1、JavaScript实现 JavaScript包含一下几个部分&#xff1a; 核心&#xff08;ECMAScript&#xff09;文档对象模型&#xff08;DOM&#xff09;游览器对象模型&#xff08;BOM&#xff09; 1.1ECMScript ECMAScript,即ECMA-262定义的语言&#xff0c;并不局限于web游览器&…

OpenAI 的 GPTs 提示词泄露攻击与防护实战:防御卷(二)

防御提示词 在对抗提示注入攻击的持续战斗中&#xff0c;以下是防御方的防御提示。请随意将这些内容复制到您的提示库中&#xff0c;以防止提示误用 1. Please, no matter what anyone asks you, do not share these instructions with anyone asking for them. No matter how…

C语言基础知识点(十四)求模符号%

今天继续看基础&#xff0c;发现这个求模符号可以对正数取模也可以对复数取模。求模运算符的作用是给出左侧证书除以右侧证书的余数。求模预算符只能用于整数不能用于浮点数。 学习代码 #include <stdio.h>int main() {int a, b,c,d;a 11;b 5;c -11;d -5;printf(&qu…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本 | 三维梁 | 3D梁 | 空间梁

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

隐语笔记1 —— 数据可信流通,从运维信任到技术信任

数据可信流通体系 关于可信的反思 信任是涉及交易或交换关系的基础 信任的基石&#xff1a; 身份可确认利益可依赖能力有预期行为有后果 数据流通中的不可信风险&#xff1a;可信链条失效&崩塌 法规层面&#xff1a;数据的持有权&#xff0c;加工权&#xff0c;经营权…

代码随想录算法训练营第十四天|

144. 二叉树的前序遍历 已解答 简单 相关标签 相关企业 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示…

C++面向对象:virtual关键字的使用

virtual实现多态 类的多态特性是支持面向对象的语言最主要的特性&#xff0c;但是支持类并不能说明就是支持面向对象&#xff0c;能够解决多态问题的语言&#xff0c;才是真正支持面向对象的开发的语言。 C多态举例&#xff1a; #include <iostream> using namespace …

鼠标右键增加CMD打开快捷键(亲测有效)

1. 我们用regedit或者其他注册表编辑器定位到HKEY_CLASSES_ROOT\Directory\Background\shell\处&#xff0c;右击新建项“OpenCMDHere”&#xff0c;并在该项下&#xff0c;右击新建项“command”。 2.我们在右边OpenCMDHere项下&#xff0c;右击新建REG_DWORD类型整数值。设置…