查看原文
其他

正则表达式(4)-三剑客之grep

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新!

Linux环境有文本处理三剑客:grep \ sed \ awk。今天我们就开始学习他们。我们先来看看他们都是做什么用的:

  • grep:针对文本的行进行过滤

  • sed:stream edit,文本处理工具

  • awk:文本报告生成器

好了,接下来我们就从grep开始学习。


文本处理三剑客之grep



grep 命令用于查找文件里符合条件的字符串。如果发现文件的内容存在指定的字符串, grep 指令会把含有需要查找的字符串的那一行显示出来。

[root@studyclub ~]# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
# OPTION:
--color=auto 自动添加颜色
-i 忽略字符大小写
-v 反向显示,显示没有匹配到的行
-n 显示的时候,显示对应的行号
-c 统计匹配的行数
-q 无论是否查找到,都不显示
-o 仅显示匹配到的字符串而不是整行
-A num after,后num行
-B num before,前num行
-C num context,前后各num行
-w 查找完整的单词
-E 使用ERE,相当于egrep
-r 递归目录,但不处理软连接
-R 递归目录,处理软连接


例子:


# 实例1:查找含有root的行
[root@studyclub jason]# grep -n root passwd
1:root:x:0:0:root:/root:/bin/bash
2:root:x:0:0:root:/root:/bin/bash/
16:operator:x:11:0:operator:/root:/sbin/nologin

# 实例2:查看磁盘分区的大小
[root@studyclub jason]# df -h| grep "^/dev/sd" | tr -s ' ' : | cut -d : -f 2
18G
187M

# 实例3:显示出含有当前系统ip地址的行
[root@studyclub jason]# ifconfig | grep broadcast
        inet 10.0.0.136 netmask 255.255.255.0 broadcast 10.0.0.255

# 实例4(重点面试题、企业场景实战):获取当前系统socket连接信息,看看有哪些地址和本机的链接数最多
[root@studyclub jason]# ss -nt > ss.log # 获取socket连接信息并把信息保存到一个文件中。注意:如果你的信息不够多,可以按照已有的信息自行编辑文件,多创建几行内容。
[root@studyclub jason]# cat ss.log # 查看一下ss.log中的内容
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 36 10.0.0.136:22 10.0.0.1:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.0.0.1:51934
ESTAB 0 36 10.0.0.136:22 10.0.0.1:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
ESTAB 0 36 10.0.0.136:22 10.3.0.23:51934
[root@studyclub jason]# grep "ESTAB" ss.log | tr -s ' ' : | cut -d : -f6 | sort | uniq -c | sort -nr
     12 10.3.0.23
      3 10.0.0.1
# 上面cut命令后面第一个sort命令是为了让所有相同的地址都紧靠一块,便于后面处理。uniq -c是为了统计相邻的内容相同的行的行数,最后sort -nr是按照数字反向排序。可以自行尝试去掉第一个sort命令后是什么结果并自行总结我们上面这条命令的意义。

# 实例5:反向显示。查看passwd文件中不以s或t字母开头的行
[root@studyclub jason]# grep -v "^[st]" passwd

# 实例6:反向显示、-E、egrep。查看/etc/profile文件,但是不显示注释的行和空行【以下集中方法都可以,请自行练习】
[root@studyclub jason]# grep -v "^#" /etc/profile | grep -v "^$"

[root@studyclub jason]# grep -v "^#\|^$" /etc/profile
[root@studyclub jason]# grep -Ev "^#|^$" /etc/profile
[root@studyclub jason]# egrep -v "^#|^$" /etc/profile

[root@studyclub jason]# grep -v "^\(#\|$\)" /etc/profile
[root@studyclub jason]# grep -Ev "^(#|$)" /etc/profile
[root@studyclub jason]# egrep -v "^(#|$)" /etc/profile
# 通过上面这个例子我们也可以发现,还是扩展的正则表达式看上去更简洁一些。

# 实例7:-i,-c忽略大小,统计匹配到的行数。查看passwd中匹配到ROOT、root的行数
[root@studyclub jason]# grep -i "ROOT" passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash/
operator:x:11:0:operator:/root:/sbin/nologin
[root@studyclub jason]# grep -ic "ROOT" passwd
3

# 实例8:-o。只查看匹配到的ip地址
[root@studyclub jason]# ifconfig | egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}" | head -1

# 实例9:-A。找到特定字符的后几行也输出到屏幕。为了便于查看是把后三行也打印出来了,我们加上-n选项,即输出行号
[root@studyclub jason]# grep -n -A3 jason passwd
25:jason:x:1000:1000::/home/jason:/bin/bash
26-nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin
27-apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
28-james:x:1001:1002::/home/james:/bin/bash

# 实例10:-R。当我们不知道需要查找的字符串在哪个文件中时,建议加上这个选项,他可以到子目录中去查找。
[root@studyclub jason]# grep -R "home" ./ # 在当前目录中查找home字符串。


好了,我们对grep做了一些讲解,没有实例讲解的选项请自行练习。


手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

   057 - Shell基础(9)-条件判断2   058 - Shell基础(10)-条件判断3    059 - Shell基础(11)-关于shell语句中小括号()和大括号{}的作用    060 - 正则表达式(1)-基本正则表达式1    061 - 正则表达式(2)-基本正则表达式2    062 - 正则表达式(3)-扩展正则表达式


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存