grep 文本过滤,sed 文本替换,awk 文本截取
grep文本过滤
语法
在 Shell 中,grep 命令是一种用于在文件中查找指定字符串的强大工具。grep 命令的基本语法如下:
grep [选项] "[模式]" [目标文件]
grep [OPTIONS] PATTERN [FILE...]
PATTERN 模式 --》里面可以使用正则表达式
正则表达式
基本正则:元字符 - * ?
扩展正则: 新增了很多的元字符,功能更加强大:| - * ?
grep 默认只是使用基本正则,egrep可以使用拓展正则
转义元字符:就是\ ,让有特殊符号的字符,回归到它原始的含义,没有特殊作用
.*
就表示任意数量(包括零个)的任意字符
简单例子:
直接用egrep的效率最高,只用开启一个进程,cat+egrep要启动两个进程
1.进入/lianxi目录,复制/etc/passwd到当前目录下,然后对passwd进行操作
2、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。
3、查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕上输出。
4、查找出当前passwd文件中以bash结尾的行。
5、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。
6、查找出/var/log/messages文档中有16个字母的单词?
\b
表示边界;[a-Z]
表示匹配任意一个大写或小写字母;{16}
表示前面的字符集要连续出现 16 次
7、查找/etc/ssh/sshd_config 里的有效行
\s+#
匹配以一个或多个空白字符开头紧接着是#
的行
8、查找出/etc/ssh/sshd_config 文件里的包含连续2个数字的行
9、查找出包含特殊字符的行
10、查找出不包含数字的行
颗粒度问::-v和[^..]的区别
- -v 选项整行取反,
-v
选项表示反向匹配,即输出不匹配指定模式的行。 - [^0-9] 单字取反
^
,在方括号内表示取反,即匹配除了0-9
之外的任意字符
查找网址的正则表达式
写某个类型的正则表达式,就是找规律
协议://字符串.字符串.字符串
协议://字符串.字符串.字符串.字符串
[a-Z]+://[0-Z]+\.[0-Z]+\.[0-Z]+
[a-Z]+://[0-Z]+\.[0-Z]+(\.[0-Z]+)+ --->实现3个字符串和4个字符串的都能匹配
先新建url文件,写一些网址进去
[root@kafka1 lianxi]# egrep "[a-Z]+://[0-Z]+\.[0-Z]+(\.[0-Z]+)+" url.txt
邮箱的正则表达式
字符串@字符串.字符串
[0-Z_]+@[0-Z]+\.[0-Z]+([0-Z_]
是一个字符集,表示匹配 0
到 Z
之间的任意字符,以及下划线 _
。)
先新建mail文件,写一些邮箱进去
[root@kafka1 lianxi]# egrep -o "[0-Z_]+@[0-Z]+\.[0-Z]+" mail.txt
- -o仅输出匹配部分
ip地址的正则表达式
先写第1部分的正则,然后写后面3部分的正则
如何精准表示1~126?
[1-9]|[1-9][0-9]|1[01][0-9]|12[0-6]
如何精准表示0~255?
[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
拼凑起来,一段当成一个整体
([1-9]|[1-9][0-9]|1[01][0-9]|12[0-6])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}
比较简单的ip地址正则
直接4段0~255 ---》可以匹配A,B,C,D,E
匹配A类ip地址的正则表达式:
[root@kafka1 lianxi]# cat ip.txt |egrep "\b([1-9]|[1-9][0-9]|1[01][0-9]|12[0-6])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}\b"
\b
保证了 IP 地址是一个整体。-
时间的正则表达式
随便找一个日志文件
案例1: 匹配从10:40到10:59分之间的时间
[03/Mar/2025:10:40:00+0800] [03/Mar/2025:10:59:00 +0800]
年月日是固定的,小时也是固定的,只是分钟有变化
日/月/年:小时:分钟:秒
[root@kafka1 logs]# egrep "\[03/Mar/2025:10:[45][0-9]:[0-5][0-9]\b" access.log
\[
:在正则表达式中,方括号[
有特殊含义,用于定义字符类。这里使用反斜杠\
进行转义
案例2:一个小时的正则
[root@kafka1 logs]# egrep "\[03/Mar/2025:10:[0-5][0-9]:[0-5][0-9]\b" access.log
案例3:一天的正则
[root@kafka1 logs]# egrep "\[03/Mar/2025\b" access.log
案例4:一分钟的正则
[root@kafka1 logs]# egrep "\[03/Mar/2025:10:49:[0-5][0-9]\b" access.log
案例5:每分钟
11点的每分钟
\[16/Apr/2024:11:[0-5][0-9]:[0-5][0-9]
awk 文本截取
awk 是一个文本处理工具,通常用于从文本文件中提取数据并对其进行处理。它是一种解释型语言,可以从标准输入或文件中读取数据,并对这些数据进行逐行处理。
例如awk以":"为分隔符,将数据格式root:x:0:0root:/root:/bin/bash 化成7段,每段数据存入$1至$7变量中,s0存储的是整行数据
语法
awk options 'pattern { action }' filename
awk 选项 '模式{操作}' 文件名
模式可以是正则表达式,条件表达式或两种组合
如果模式是正则表达式要用/定界符
-F 指定的输入分隔符 OFS指定输出分隔符
awk options 'pattern { action }' filename
awk -F "分隔符" -v OFS="输出分隔符" '模式{操作}' 文件名[root@kafka1 11-16]# cat /etc/passwd|awk -F":" 'OFS="," {print $1,$3,$4,$7}'|head -3
$1
、$3
、$4
和$7
分别代表每行分割后的第 1、3、4 和 7 个字段。
常用内置变量NR,NF,FS,OFS
NR ---》number of record 行号 ,一条记录就是一行
NF --》number of feild 字段数 ,一行里有多少个字段
[root@kafka1 11-16]# awk -F: '{print NR,$1,$3,$NF}' /etc/passwd
$NF 表示最后一个字段
$(NF-1) 倒数第2个字段
awk 有查找功能--》只有模式没有动作
例子1:获取cpu使用率最高的前5个进程的 pid %cpu command name ,按照降序排列
ps aux 查看进程信息
方法1️⃣[root@kafka1 ~]# ps aux|awk 'NR>1 {print $2,$3,$11}'|sort -k2 -nr|head -5
NR>1
意味着跳过第一行,只处理后续的数据行。- 再次使用管道符号,将
awk
命令的输出作为sort
命令的输入。
sort -k2 -nr
,-k2
表示按照第 2 列进行排序(因为awk
命令的输出第二列为cpu),-n
表示以数值方式进行排序,-r
表示降序排列。
简单例子:
1.只显示df -h结果的第一列文件系统
[root@kafka1 ~]# df -h|awk '{print$1}'
2.显示passwd文件的第5行和第10行的行号和用户名
[root@kafka1 ~]# awk -F: 'NR==5||NR==10{print NR,$1}' /etc/passwd
3.使用NF变量显示passwd文件倒数第二列的内容
[root@kafka1 ~]# awk -F: '{print $(NF-1)}' /etc/passwd
4.passwd文件中第5到第10行的用户名
[root@kafka1 ~]# awk -F: 'NR>=5&&NR<=10{print $1}' /etc/passwd
5.显示passwd文件中第7列不是bash的用户名
[root@kafka1 ~]# awk -F: '$7 !~ /bash/{print $1}' /etc/passwd
!~
是awk
中的不匹配运算符。/bash/
是一个正则表达式,表示匹配包含字符串bash
的内容。6.显示passwd文件中行号是5结尾的行号和行
[root@kafka1 ~]# awk -F: 'NR%5==0{print NR,$0}' /etc/passwd
sed 文本替换
Sed(Stream Editor)是一种支持正则表达式的非交互式交流编辑器,常用于在命令行中对文本进行编辑和转换。脚本中修改文本或文本替换的最佳工具。
语法
sed 查找的时候
- 根据行号匹配
- 根据字符串 --》 模式匹配
sed [选项参数] '[定位符]命令' 文件
sed的作用
1.修改某个值(局部替换)
2.整行替换
3.注释掉某行 --》行首加#
4.删除某些字符串--》使用空的字符串去替换
5.插入文件
1.修改某个值(局部替换)
例子1:
[root@kafka1 lianxi]# sed -i -r '/^zhang|^feng/ s/caojie/zhangjie/' name.txt
- 将以
zhang
或者feng
开头的行里的caojie
被替换成了zhangjie
。
-r
为了支持扩展正则表达式 | 。
2.整行替换
例子1:在
config
文件中,将所有以SELINUX=
开头的行替换为SELINUX=disabled
,通常用于修改 SELinux 的配置状态为禁用状态。[root@kafka1 lianxi]# sed -i '/^SELINUX=/ c SELINUX=disabled' config
c
是sed
命令中的替换整行操作符。当sed
匹配到满足/^SELINUX=/
条件的行时,会将整行内容替换为后续指定的文本。
3.注释掉某行 --》行首加#
例子1:在
config
文件里,把所有以SELINUX=
开头的行注释掉。[root@kafka1 lianxi]# sed -i '/^SELINUX=/ s/^/#/' config
s/^/#/
,这里的^
同样表示行首,此命令会在匹配到的行的开头插入一个#
符号,也就是将匹配行注释掉。
4.删除某些字符串--》使用空的字符串去替换(默认情况只匹配第一个)
例子1:在
config
文件中,把所有的SELINUX
字符串删除,也就是用空字符串替换它们。[root@kafka1 lianxi]# sed -i 's/SELINUX//' config
's/SELINUX//'
:这里的原字符串是SELINUX
,新字符串为空,其作用是把文件中所有的SELINUX
字符串删除。
5.插入文本
[root@kafka1 lianxi]# sed -i '/^feng/ a xxxx' name.txt
a
:是sed
中的追加命令,a
即append
,表示在匹配行的 后面追加一行 append