【Linux相识相知】文本处理工具之grep-egrep-fgrep及正则表达式

本文主要是介绍【Linux相识相知】文本处理工具之grep-egrep-fgrep及正则表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常说Linux上有文本处理的三剑客,grep、sed和awk,本文就grep做出详细的描述,并引出正则表达式。

 

grep

NAME:打印模式匹配的行
SYNOPISIS:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用选项:
--color=auto:对匹配到的文本着色后进行高亮显示,默认已被别名alias grep='grep --color=auto'
-i:忽略字符的大小写
-o:仅显示匹配到的字符串本身
-v:显示不能被模式匹配到的行
-E:支持使用扩展的正则表达式
-q:静默模式,即不输出任何信息
-A #:显示被模式匹配的行及其后#行
-B #:显示被模式匹配的行及其前#行
-C #:显示被模式匹配的行及其前后各#行

 

举例1:匹配/etc/passwd下有frank的行

[root@localhost tmp]# grep "frank" /etc/passwd
frank:x:1000:1000:frank:/home/frank:/bin/bash

 

举例2:匹配/etc/passwd下有frank的行,忽略大小写

[root@localhost tmp]# grep -i "frank" /etc/passwd
frank:x:1000:1000:frank:/home/frank:/bin/bash
Frank:x:1001:1001::/home/Frank:/bin/bash

 

举例3:匹配/etc/passwd下不能被bash匹配的行

[root@localhost tmp]# grep -v "bash" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

 

举例4:仅仅匹配/etc/passwd下的frank,忽略大小写

[root@localhost tmp]# grep -oi "frank" /etc/passwd
frank
frank
frank
Frank
Frank

 

举例5:静默模式匹配含有frank的行

[root@localhost tmp]# grep -q "frank" /etc/passwd
[root@localhost tmp]# 

 

举例6:匹配/etc/passwd下含有ftp的行及其后3行

[root@localhost tmp]# grep -A 3 "ftp" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

 

举例7:匹配/etc/passwd下含有ftp的行及其前3行

[root@localhost tmp]# grep -B 3 "ftp" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

举例8:匹配/etc/passwd下含有ftp的行及其前后各2行

[root@localhost tmp]# grep -C 2 "ftp" /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin

 

egrep

支持扩展正则表达式实现类似于grep的文本过滤功能,相当于grep -E

NAME:打印模式匹配的行
SYNOPISIS:
egrep [OPTIONS] PATTERN [FILE...]   
-i:忽略字符的大小写
-o:仅显示匹配到的字符串本身
-v:显示不能被模式匹配到的行
-q:静默模式,即不输出任何信息
-A #:显示被模式匹配的行及其后#行
-B #:显示被模式匹配的行及其前#行
-C #:显示被模式匹配的行及其前后各#行
-G:支持基本正则表达式

 

fgrep

fgrep搜索字符串而不是搜索匹配的表达式的模式,所以支持正则表达式,当无需要用到元字符去编写模式的时候,使用fgrep必能更好更快。

支持-i,-v,-o,-A,-B,-C,-p等选项

 

正则表达式

Regular Expression,正则表达式,由一类特殊字符及文本字符编写的模式,其中有些不表示其字面的意义,而是用户控制或通配功能,分为基本正则表达式和扩展正则表达式。

基本正则表达式元字符:

字符匹配

. :匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
特殊匹配:[:digit:] 匹配任意单个数字
[:lower:] 匹配任意单个小写字母
[:upper:] 匹配任意单个大写字母
[:alpha:] 匹配任意单个字母
[:alnum:] 匹配任意单个字母或数字
[:punct:] 匹配任意单个符号
[:space:] 匹配单个空格
[^]:匹配指定范围外的任意单个字符;

 

匹配次数

用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式

*:匹配其前面的字符任意次数:0,1,多次
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或者1次;
\+:匹配其前面的字符1次或者多次;
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{m,\}:至少m次

 

位置锚定

^:托字符,行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧

单词:非特殊字符组成的连续字符(字符串)都称为单词

\<或\b:词首锚定,用于单词模式的左侧
\>或\b:词尾锚定,用户单词模式的右侧
\<PATTERN\>:匹配完整单词

 

分组及引用

分组:
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
后向引用:引用前面的分组括号中的模式所匹配到的字符
分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:
\1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容
\2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容
以此类推

 

举例:

1.显示/etc/passwd文件中不以/bin/bash结尾的行

[root@localhost tmp]# grep -v "/bin/bash$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

2.找出/etc/passwd文件中的两位或三位数字

[root@localhost tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
......
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

3.找出etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;

[root@localhost tmp]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 
load_env
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
set default="${saved_entry}"
menuentry_id_option="--id"
menuentry_id_option=""
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true

4.找出"netstat -tan"命令的结果中以LISTEN后跟0,1或多个空白结尾的行

[root@localhost tmp]# netstat -tan | grep  "LISTEN[[:space:]]*$"
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN 

 

扩展正则表达式元字符:

字符匹配

. :匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
特殊匹配:[:digit:] 匹配任意单个数字
[:lower:] 匹配任意单个小写字母
[:upper:] 匹配任意单个大写字母
[:alpha:] 匹配任意单个字母
[:alnum:] 匹配任意单个字母或数字
[:punct:] 匹配任意单个符号
[:space:] 匹配单个空格
[^]:匹配指定范围外的任意单个字符;

 

匹配次数

用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式。

*:匹配其前面的字符任意次数:0,1,多次
.*:匹配任意长度的任意字符
?:匹配其前面的字符0次或者1次;
+:匹配其前面的字符1次或者多次;
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次
{m,}:至少m次

 

位置锚定

^:托字符,行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧

单词:非特殊字符组成的连续字符(字符串)都称为单词

\<或\b:词首锚定,用于单词模式的左侧
\>或\b:词尾锚定,用户单词模式的右侧
\<PATTERN\>:匹配完整单词

 

分组及引用

分组:
():将一个或多个字符捆绑在一起,当做一个整体进行处理
后向引用:引用前面的分组括号中的模式所匹配到的字符
分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:
\1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容
\2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容
以此类推

 

a|b:a或b
C|cat:C或cat
(C
|c)at:cat或Cat

 

小练习

1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次

who | grep -o  "^\<[[:alpha:]]*" |  uniq
View Code

2、取出最后登录到当前系统的用户的相关信息

id `who | tail -1 | grep -o  "^\<[[:alpha:]]*"`
View Code

3.取出当前系统上被用户当做其默认shell的最多的那个shell

cut -d: -f7 /etc/passwd | uniq -c | sort -n | tail -1 | cut -d' ' -f7
View Code

4.将/etc/passd中的第三个字段设置最大的后10个用户的信息全部给为大写保存至/tmp/maxuser.txt文件中

[root@localhost ~]# sort -t: -k3 -n /etc/passwd | tail -10 | tr 'a-z' 'A-Z'  &>  /tmp/maxuser.txt
View Code

5.取出当前主机的IP地址

ifconfig | grep -Eo "([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])\.([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\.([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\.([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])[[:space:]]" |grep -v "127.0.0.1"
或者
ifconfig | grep "[[:space:]*]\<inet\>" |  cut -d' ' -f10 | grep -v "127.0.0.1"
View Code

6.列出/etc目录下所有已.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中

find  /etc  -name  "*.conf" | egrep -o "[^/][^/]*$" | tr 'a-z' 'A-Z' > /tmp/etc.test
View Code

7.显示/var目录下一级子目录或文件的总数

ls /etc/ | wc -l
View Code

8.取出/etc/group第三个字段数值最小的10个组的名字

sort -t: -k3 -n /etc/group | head -10 | cut -d: -f1
View Code

9.将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中

cat /etc/issue  /etc/fstab | tee /tmp/etc.test  &> /dev/null
View Code

10.显示/proc/meminfo文件中以大写或者小写S开头的行,用两种方式

[root@localhost home]# egrep "^[sS]" /proc/meminfo
[root@localhost home]# egrep  -i "^s" /proc/meminfo 
View Code

11.显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户

[root@localhost home]# grep -v "/sbin/nologin"  /etc/passwd
View Code

12.显示/etc/passwd文件中其默认shell为/bin/bash的用户

[root@localhost home]# grep  "/bin/bash"  /etc/passwd
View Code

13.找出/etc/passwd文件中的一位或两位数

[root@localhost /]# egrep "\<[[:digit:]]{1,2}\>"  /etc/passwd
View Code

14.显示/boot/grub2/grup.cfg中至少一个空白字符开头的行

[root@localhost /]# egrep "^[[:space:]]+[^[:space:]]"  /boot/grub2/grub.cfg 
View Code

15.显示/etc/rc.d/rc.local文件中以#开头,后面跟至少一个空白字符,而后又至少一个非空白字符的行

[root@localhost /]# egrep  "^#[[:space:]]+[^[:space:]]"   /etc/rc.d/rc.local 
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
View Code

16.打出netstat -tan命令执行结果以'LISTEN'后跟空白字符结尾的行

[root@localhost /]# netstat -tan | egrep "LISTEN[[:space:]]+"
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN 
View Code

17.添加用户bash,testbash,basher,nologin(此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息

[root@localhost /]# useradd bash
[root@localhost /]# useradd testbash
[root@localhost /]# useradd basher
[root@localhost /]# useradd -s /sbin/nologin nologin
[root@localhost /]# egrep  "^(\<[a-z]+\>).*\1$"   /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:2004:2004::/home/bash:/bin/bash
nologin:x:2007:2007::/home/nologin:/sbin/nologin
View Code

 

这篇关于【Linux相识相知】文本处理工具之grep-egrep-fgrep及正则表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/323044

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。