文本处理三剑客grep,sed ,awk 笔记,附例子!

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

    • csed 命令中的替换整行操作符。当 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 中的追加命令,aappend,表示在匹配行的 后面追加一行 append

         

        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值