grep/egrep/fgrep 用法-文本处理三剑客之一

本文介绍了Linux文本处理工具grep、egrep和fgrep的含义、用法以及正则表达式的基础知识。grep是全面搜索正则表达式并打印匹配行的工具,egrep支持扩展正则表达式,fgrep则用于搜索固定字符串。文章通过多个示例展示了如何使用这些命令进行文本过滤和搜索。
部署运行你感兴趣的模型镜像

grep/egrep/fgrep 简介

文本处理三剑客

文本处理三剑客:

  • grep, egrep, fgrep:文本过滤器
  • sed:Stream EDitor,流编辑器,行
  • awk:文本格式化工具,报告生成器

grep 含义

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

egrep 含义

egrep 命令 用于在文件内查找指定的字符串。egrep 执行效果与 grep -E 相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep 是用extended regular expression 语法来解读的,而 grep 则用 basic regular expression 语法解读,extended regular expression比basic regular expression 的表达更规范。

fgrep 含义

fgrep 命令 是用来搜索 file 参数指定的输入文件(缺省为标准输入)中的匹配模式的行。fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串。如果在 File 参数中指定一个以上的文件 fgrep 命令将显示包含匹配行的文件。
fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$, *, [, |, (, )和\等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为正则表达式。因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号‘ … ’。. 如果没有指定文件, fgrep 命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。

正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

简述之,正则表达式(Regual Expression, REGEXP)由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;分两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。

grep 用法

  • 作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行。
  • 模式:由正则表达式的元字符及文本字符所编写出的过滤条件。
  • 命令格式如下:
    grep  [OPTIONS]  PATTERN  [FILE...]
    grep  [OPTIONS]  [-e PATTERN | -f FILE]  [FILE...]
    

OPTION

命令格式中的 OPTION 选项如下:

--color=auto:对匹配到的文本着色后高亮显示
-i:ignorecase,忽略字符的大小写
-o:仅显示匹配到的字符串本身
-v, --invert-match:显示不能被模式匹配到的行
-E:支持使用扩展的正则表达式元字符
-q, --quiet, --silent:静默模式,即不输出任何信息;常用于脚本,可使用 echo $? 来判断是否执行成功
-A #:after, 除了显示符合范本样式的那一行之外,并显示该行之后 # 行的内容
-B #:before,除了显示符合范本样式的那一行之外,并显示该行之前 # 行的内容
-C #:context, 除了显示符合范本样式的那一列之外,并显示该列之前后各 # 行的内容

基本正则表达式元字符

基本正则表达式元字符可从字符匹配匹配字数位置锚定分组及应用四个方面来进行叙述。

字符匹配

. :匹配任意单个字符
[]:匹配指定范围内的任意单个字符,示例: [wang] [0-9] [a-z] [a-zA-Z]
[^]:匹配指定范围外的任意单个字符
[:alnum:]:字母和数字
[:alpha:]:代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:]:小写字母 [:upper:] 大写字母
[:blank:]:空白字符(空格和制表符)
[:space:]:水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:]:不可打印的控制字符(退格、删除、警铃...)
[:digit:]:十进制数字 
[:xdigit:]:十六进制数字
[:graph:]:可打印的非空白字符
[:print:]:可打印字符
[:punct:]:标点符号

匹配字数

用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式(命令结果进行着色时,按贪婪模式进行体现)。

*:匹配其前面的字符任意次;0,1,多次;   包含0次,一定要注意  
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的
    grep "x\?y" grep.txt  有特殊字符的话,一定要加双引号,进行强引用
\+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次
\{n\}:匹配前面的字符n次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{0,n\}:至多n次
\{m,\}:至少m次

位置锚定

^:行首锚定;用于模式的最左侧
$:行尾锚定;用于模式的最右侧
^PATTERN$:用于PATTERN来匹配整行
^$:空白行;空白字符也不能有
^[[:space:]]*$:空行或包含空白字符的行		
#单词:非特殊字符组成的连续字符(字符串)都称为单词			
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配完整单词的行

分组及应用

在bash中,() 有特殊意义,所以要使用转译符 \ 。所以在正则表达式中使用 () 时,需要配合 \ 进行转译,比如:() 。

分组: \(\) 将一个或多个字符捆绑在一起,当作一个整体处理,如: \(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些
	变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
	示例: \(string1\+\(string2\)*\)
		  \1:string1\+\(string2\)*
		  \2:string2
后向引用:引用前面的分组括号中的模式所匹配字符, 而非模式本身
或者: \|
	示例: a\|b:a或b 
		  C\|cat:C或cat 
		  \(C\|c\)at:Cat或cat

grep 用法示例1

# 显示 /etc/passwd 文件中不以 /bin/bash 结尾的行
~]# grep -v "/bin/bash$" /etc/passwd
						
# 找出 /etc/passwd 文件中的两位数或三位数
~]# grep  "\<[0-9]\{2,3\}\>"  /etc/passwd

# 找出 /etc/passwd 文件中的两位数或三位数,并只显示数字
~]# grep -o  "\<[0-9]\{2,3\}\>"  /etc/passwd
					
# 找出 /etc/grub2-efi.cfg 文件中,以至少一个空白字符开头,且后面非空白字符的行
~]# grep  "^[[:space:]]\+[^[:space:]]"  /etc/grub2-efi.cfg

# 找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
~]# netstat -tan | grep  "LISTEN[[:space:]]*$"

grep 用法示例2

# grep 文本内容如下:
[root@LeeMumu ~]# cat grep.txt 
AAABBBCCC
aaabbbccc
ABC
abc
ABc
  aBC
  abC
aBc
AbC
abcabcabc
ABCABCABC
abcABCabc
# 显示以至少2个至多3个大写字母开头的行,并显示行号
[root@LeeMumu ~]# grep -n "^[[:upper:]]\{2,3\}" grep.txt 
1:AAABBBCCC
3:ABC
5:ABc
11:ABCABCABC
# 显示不以至少2个小写字母开头的行,并显示行号
[root@LeeMumu ~]# grep -n -v "^[[:lower:]]\{2,\}" grep.txt 
1:AAABBBCCC
3:ABC
5:ABc
6:  aBC
7:  abC
8:aBc
9:AbC
11:ABCABCABC
# 显示包含小写字母 a 的行
[root@LeeMumu ~]# grep ".*a.*" grep.txt 
aaabbbccc
abc
  aBC
  abC
aBc
abcabcabc
abcABCabc
# 显示至少包含一个 ABC 字符串的行
[root@LeeMumu ~]# grep "\(ABC\)\+" grep.txt 
ABC
ABCABCABC
abcABCabc
# 显示以小写字母 c 结尾的行
[root@LeeMumu ~]# grep "c$" grep.txt 
aaabbbccc
abc
ABc
aBc
abcabcabc
abcABCabc
# 显示以空格开头的行
[root@LeeMumu ~]# grep "^[[:space:]]" grep.txt 
  aBC
  abC
# 显示以非空格开头的行
[root@LeeMumu ~]# grep "^[^[:space:]]" grep.txt 
AAABBBCCC
aaabbbccc
ABC
abc
ABc
aBc
AbC
abcabcabc
ABCABCABC
abcABCabc
# 显示含有非空格字符的行
[root@LeeMumu ~]# grep "[^[:space:]]" grep.txt 
AAABBBCCC
aaabbbccc
ABC
abc
ABc
  aBC
  abC
aBc
AbC
abcabcabc
ABCABCABC
abcABCabc

egrep 用法

支持扩展的正则表达式实现类似于grep文本过滤功能,相当于 grep -E 。
命令格式如下:

grep -E [OPTIONS]  PATTERN  [FILE...]
egrep  [OPTIONS]  PATTERN  [FILE...]

OPTION

命令格式中的 OPTION 选项如下:

--color=auto:对匹配到的文本着色后高亮显示
-i:ignorecase,忽略字符的大小写
-o:仅显示匹配到的字符串本身
-v, --invert-match:显示不能被模式匹配到的行
-G:支持使用基本的正则表达式元字符
-A #:after, 除了显示符合范本样式的那一行之外,并显示该行之后 # 行的内容
-B #:before,除了显示符合范本样式的那一行之外,并显示该行之前 # 行的内容
-C #:context, 除了显示符合范本样式的那一列之外,并显示该列之前后各 # 行的内容

扩展正则表达式元字符

扩展正则表达式元字符可从字符匹配匹配字数位置锚定分组及应用四个方面来进行叙述。

字符匹配

.:任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符

次数匹配

*:任意次,0,1或多次
?:0次或1次,其前的字符是可有可无的
+:其前字符至少1次
{m}:其前的字符m次
{m,n}:至少m次,至多n次;
{0,n}:至多n次
{m,}:至少m次

位置锚定

^:行首锚定;
$:行尾锚定;
\<, \b:词首锚定;
\>, \b:词尾锚定;

分组及引用

():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中
   (带数字,代表后向引用:\1, \2, ...) 
a|b:a或者b(C|cat 表示 C 或 cat ; (c|C)at 代表 cat 或 Cat)

egrep 用法示例

# 找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;
~]# grep -i "^s" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo
~]# grep -E "^(s|S)" /proc/meminfo
					
# 显示肖前系统上root、centos或user1用户的相关信息;
~]# grep -E "^(root|centos|user1)\>" /etc/passwd

# 找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
~]# grep  -E  -o  "[_[:alnum:]]+\(\)"  /etc/rc.d/init.d/functions
					
# 使用echo命令输出一绝对路径,使用egrep取出基名;
~]# echo /etc/sysconfig/ | grep  -E  -o  "[^/]+/?$"
					
# 取出其路径名;类似于对其执行dirname命令的结果;
~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
					
# 找出ifconfig命令结果中的1-255之间的数值;
~]# ifconfig | grep  -E  -o  "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
					
# 找出ifconfig命令结果中的IP地址;
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
					
# 找出/etc/passwd文件中用户名同shell名的行;
~]# grep  -E  "^([^:]+\>).*\1$"  /etc/passwd

fgrep

当无需要用到元字符去编写模式时,使用 fgrep 更好,处理速度更快。
命令格式如下:

fgrep  [OPTIONS]  PATTERN  [FILE...]

fgrep 用处较少,此处不做累述,如有需要,可参考:https://wangchujiang.com/linux-command/c/fgrep.html

作业练习

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

[root@LeeMumu ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
test:x:1000:0:test:/home/test:/bin/bash
[root@LeeMumu ~]# grep -v "/bin/bash$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
... ...
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

2、找出 /etc/passwd 文件中,包含两位数字或者三位数字的行。

[root@LeeMumu ~]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
... ...
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

3、显示 /proc/meminfo 文件中以大写或者小写字母 s 开头的行,用三种方式实现。

[root@LeeMumu ~]# grep "^[Ss]" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              7772 kB
Slab:              63068 kB
SReclaimable:      21548 kB
SUnreclaim:        41520 kB
[root@LeeMumu ~]# grep -i "^[S]" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              7772 kB
Slab:              63068 kB
SReclaimable:      21548 kB
SUnreclaim:        41520 kB
[root@LeeMumu ~]# grep -i "^[s]" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              7772 kB
Slab:              63068 kB
SReclaimable:      21548 kB
SUnreclaim:        41520 kB
[root@LeeMumu ~]# grep -E "^(s|S)" /proc/meminfo
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              7772 kB
Slab:              63068 kB
SReclaimable:      21548 kB
SUnreclaim:        41520 kB

4、使用 echo 输出一个绝对路径,使用 egrep 取出其路径名,执行结果相当于 # dirname /etc/passwd 的结果。

[root@LeeMumu ~]# echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'
/etc/
[root@LeeMumu ~]# echo "/etc/passwd" | sed -r 's@[^/]+/?$@@'
/etc/

# sed 用法可参照以下博客:
# https://blog.csdn.net/weixin_44983653/article/details/94355805

5、找出 ifconfig 中的IP地址,要求结果只显示 IP地址。

[root@LeeMumu ~]# ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' 
192.168.1.7
127.0.0.1
[root@LeeMumu ~]# ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
192.168.1.7

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

这个命令行是一个Linux shell脚本的一部分,用于查找并列出指定目录下名为"adas-rt/hobot-adas-workflow"的工作流程相关的进程,过滤掉`grep`本身以及`watchdog`进程。以下是命令的解释: - `ps`:查看当前系统的进程状态。 - `|`:管道操作符,将`ps`的结果传递给下一个命令。 - `grep /mnt/adas/adas-rt/hobot-adas-workflow`:筛选出包含指定路径的进程名。 - `grep -v grep`:排除执行此命令本身的grep进程。 - `grep -v watchdog`:排除名字为"watchdog"的进程。 - `grep -v`后面的两个参数再次使用了排除操作,这里可能会导致信息丢失,因为如果目标进程名正好是`grep`或者`watchdog`,则会被误杀。 然而,循环kill 1000次的过程不在这个命令里,你需要在获取到PID之后,再用循环结构(如bash的for循环或Python的while循环)配合`kill`命令来实现。例如,在bash中可以这样做: ```bash # 获取PID pid_list=$(ps aux |grep "/mnt/adas/adas-rt/hobot-adas-workflow" | grep -v grep | grep -v watchdog | awk '{print $2}') # 初始化计数器 count=0 # 循环kill 1000次 while [ "$count" -lt 1000 ]; do # 检查pid_list是否为空 if [ -n "$pid_list" ]; then pid_to_kill=$(echo $pid_list | head -n 1) # 取第一个PID kill "$pid_to_kill" pid_list=$(ps aux |grep "/mnt/adas/adas-rt/hobot-adas-workflow" | grep -v grep | grep -v watchdog | awk '{print $2}' | tail -n +2) # 移除已杀死的进程 count=$((count+1)) else echo "No more processes to kill." break fi done ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值