14@文件处理三剑客之grep

1|0三剑客之grep命令

1|1一、grep介绍

grep命令主要用于过滤文本,grep家族如下

grep: 在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行 egrep:扩展的egrep,支持更多的正则表达式元字符 fgrep:固定grep(fixed grep),有时也被称作快速(fast grep),它按字面解释所有的字符

1|01、grep命令格式如下

grep [选项] PATTERN 文件1 文件2 ... [root@egon ~]# grep 'root' /etc/passwd [root@egon ~]# fgrep 'bash' /etc/passwd 找到: grep返回的退出状态为0 没找到: grep返回的退出状态为1 找不到指定文件: grep返回的退出状态为2

1|02、grep简述

#grep 命令的输入可以来自标准输入或管道,而不仅仅是文件,例如: ps aux |grep 'nginx'

1|2二、选项(参数)

-n, --line-number 在过滤出的每一行前面加上它在文件中的相对行号 -o, --only-matching 只显示匹配的内容 -q, --quiet, --silent 静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容 --color 颜色 -i, --ignore-case 忽略大小写 -A, --after-context=NUM 如果匹配成功,则将匹配行及其后n行一起打印出来 -B, --before-context=NUM 如果匹配成功,则将匹配行及其前n行一起打印出来 -C, --context=NUM 如果匹配成功,则将匹配行及其前后n行一起打印出来 -c, --count 如果匹配成功,则将匹配到的行数打印出来 -v, --invert-match 反向查找,只显示不匹配的行 -w 匹配单词 -E 等于egrep,扩展 -l, --files-with-matches 如果匹配成功,则只将文件名打印出来,失败则不打印 通常-rl一起用,grep -rl 'root' /etc -R, -r, --recursive 递归

1|01、示例

# 1、-n [root@egon ~]# grep -n 'root' /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin [root@egon ~]# # 2、-o [root@egon ~]# grep -o 'root' /etc/passwd root root root root [root@egon ~]# # 3、-q [root@egon ~]# grep -q 'root' /etc/passwd [root@egon ~]# echo $? 0 # 4、--color [root@egon ~]# alias grep alias grep='grep --color=auto' [root@egon ~]# # 5、-i [root@egon ~]# echo "EGON" |grep -i egon EGON [root@egon ~]# # 6、-A\-B\-C [root@egon ~]# grep -A 2 'root' /etc/passwd [root@egon ~]# grep -B 2 'root' /etc/passwd [root@egon ~]# grep -C 2 'root' /etc/passwd # 7、-c [root@egon ~]# grep -c 'root' /etc/passwd 2 [root@egon ~]# # 8、-v [root@egon ~]# ps aux | grep nginx |grep -v grep [root@egon ~]# [root@egon ~]# ps aux | grep [n]ginx [root@egon ~]# # 9、-w [root@egon ~]# netstat -an |grep -w 80 tcp6 0 0 :::80 :::* LISTEN [root@egon ~]# netstat -an |grep '\<80\>' tcp6 0 0 :::80 :::* LISTEN [root@egon ~]# netstat -an |grep '\b80\b' tcp6 0 0 :::80 :::* LISTEN # 10、-rl [root@egon ~]# grep -rl 'root' /etc # 将/etc目录下所有包含'root'内容的文件都列出来

1|3三、正则表达式

1|01、正则表达式介绍

正则表达式,又称规则表达式**。**(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式由元字符组成,通常被用来检索、替换那些符合某个模式(规则)的文本(许多程序设计语言都支持利用正则表达式进行字符串操作)。

元字符:是一类可以表达出超越其字面本身含义的特殊字符

#shell元字符(也称为通配符): 由shell解释器来解析,如rm -rf *.pdf,元字符*Shell将其解析为任意多个字符 #正则表达式元字符: 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk #例如:vim示例: :1,$ s/tom/EGON/g # 如anatomy、tomatoes及tomorrow中的“tom”被替换了,而Tom确没被替换 :1,$ s/\<[Tt]om\>/EGON/g

1|02、 正则表达式元字符

基本正则元字符集

元字符 功能 示例 ^ 行首 ^love $ 行尾 love$ . 除了换行符以外的任意单个字符 l..e * 前导字符的零个或多个 ab*love .* 所有字符 a.*love [] 字符组内的任一字符 [lL]ove [^] 对字符组内的每个字符取反(不匹配字符组内的每个字符) [^a-z0-9]ove ^[^] 非字符组内的字符开头的行 [a-z] 小写字母 [A-Z] 大写字母 [a-Z] 小写和大写字母 [0-9] 数字 \ 用来转义元字符 love\. \< 词首定位符 单词一般以空格或特殊字符做分隔、连续的字符组成 \<love \> 词尾定位符 love\> \(..\) 匹配稍后将要使用的字符的标签 \(love\)able\1er :1,$ s/\(192.168.11\).66/\1.50/g x\{m\} 字符x重复出现m次 e\{3\} x\{m,\} 字符x重复出现m次以上 e\{3,\} x\{m,n\} 字符x重复出现m到n次 e\{3,6\}

1|03、示列

# 1、^ 行首 [root@egon ~]# grep '^root' /etc/passwd root:x:0:0:root:/root:/bin/bash [root@egon ~]# # 2、$ 行尾 [root@egon ~]# grep 'bash$' /etc/passwd root:x:0:0:root:/root:/bin/bash user1:x:1002:1003::/home/user1:/bin/bash egon1:x:198:1005::/home/egon1:/bin/bash gg:x:1004:1006::/home/gg:/bin/bash egon:x:1005:1007::/home/egon:/bin/bash tom:x:1006:1008::/home/tom:/bin/bash [root@egon ~]# # 3、. 除了换行符以外的任意单个字符 [root@egon ~]# grep 'r..t' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@egon ~]# # 4、* 前导字符的零个或多个 [root@egon ~]# cat a.txt a ab abb abbb bbbbb [root@egon ~]# grep 'ab*' a.txt a ab abb abbb [root@egon ~]# # 5、.* 所有字符=贪婪 [root@egon ~]# cat a.txt a123+-*/c11113333c a1c a77Ac a23333c ac 111 222 333 [root@egon ~]# grep 'a.*c' a.txt a123+-*/c11113333c a1c a77Ac a23333c ac [root@egon ~]# # 5.1 .*?=》非贪婪,默认情况下,grep不支持非贪婪修饰符,但您可以使用grep -P来使用Perl语法来支持.*? [root@egon ~]# cat a.txt <a href="http://www.baidu.com">"我他妈的是百度"</a> <a href="http://www.sina.com.cn">"我特么的是新浪"</a> [root@egon ~]# [root@egon ~]# grep -o 'href=".*"' a.txt # 贪婪 href="http://www.baidu.com">"我他妈的是百度" href="http://www.sina.com.cn">"我特么的是新浪" [root@egon ~]# [root@egon ~]# grep -oP 'href=".*?"' a.txt # 非贪婪 href="http://www.baidu.com" href="http://www.sina.com.cn" [root@egon ~]# # 6、[] 字符组内的任一字符 # 7、[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符) [root@egon ~]# cat a.txt a1c a2c a33c aAc aZc [root@egon ~]# grep 'a[0-9]c' a.txt a1c a2c [root@egon ~]# grep 'a[^0-9]c' a.txt aAc aZc [root@egon ~]# [root@egon ~]# grep 'a[0-9][0-9]c' a.txt a33c [root@egon ~]# # 8、^[^] 非字符组内的字符开头的行 [root@egon ~]# cat a.txt a1c a2c a33c aAc aZc [root@egon ~]# grep '^[^0-9]..$' a.txt a1c a2c aAc aZc [root@egon ~]# # 9、[a-z] 小写字母 # 10、[A-Z] 大写字母 # 11、[a-Z] 小写和大写字母 # 12、[0-9] 数字 # 13、\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词 # 14、\> 单词尾 [root@egon ~]# netstat -an |grep -w 80 tcp6 0 0 :::80 :::* LISTEN [root@egon ~]# netstat -an |grep '\<80\>' tcp6 0 0 :::80 :::* LISTEN [root@egon ~]# netstat -an |grep '\b80\b' tcp6 0 0 :::80 :::* LISTEN

1|04、Ps: grep匹配换行符和制表符

[root@egon ~]# echo -e "a\nb" |grep $'a\nb' a b [root@egon ~]# [root@egon ~]# echo -e "a\tb" |grep $'a\tb' a b [root@egon ~]#

1|05、扩展正则元字符集

# 扩展正则元字符 + 匹配一个或多个前导字符 [a-z]+ove ? 匹配零个或一个前导字符 lo?ve a|b 匹配a或b love|hate () 组字符 love(able|rs) (egon)+ (..)(..)\1\2 标签匹配字符 (love)able\1er x{n} x出现n次 e{3} x{n,} x出现n次至无穷次 e{3,} x{n,m} x出现n次至m次 e{3,6} # 若想使用扩展正则 grep加-E 或 egrep 或转义\ sed 加 -r 参数 或转义 AWK 直接支持大多数扩展正则,更多支持需要加选项--posix选项

1|06、示例

# ======================grep扩展正则示例====================== [root@egon ~]# cat a.txt a ab abb abbb abbbb abbbbb bbbbbbb [root@egon ~]# grep 'ab{2,4}' a.txt # 默认不支持扩展正则,所以没效果 [root@egon ~]# egrep 'ab{2,4}' a.txt abb abbb abbbb abbbbb [root@egon ~]# # ======================sed扩展正则示例====================== [root@egon ~]# sed -n '/roo?/p' /etc/passwd # 默认不支持扩展正则? [root@egon ~]# sed -n '/roo\?/p' /etc/passwd # 可以用\转义扩展正则符号? 有结果,结果略... [root@egon ~]# sed -rn '/roo?/p' /etc/passwd # 也可以加-r选项 有结果,结果略... [root@egon ~]# # ======================awk扩展正则示例====================== [root@egon ~]# cat a.txt a ab abb abbb abbbb abbbbb bbbbbbb [root@egon ~]# awk '/ab{1,3}/{print}' a.txt ab abb abbb abbbb abbbbb [root@egon ~]# awk --posix '/ab{1,3}/{print}' a.txt ab abb abbb abbbb abbbbb [root@egon ~]#

1|07、总结

grep: 使用基本元字符集 ^, $, ., *, [], [^], \< \>,\(\),\{\} egrep(或grep -E): 使用扩展元字符集 ?, +, { }, |, ( ) # 注:grep也可以使用扩展集中的元字符,仅需要对这些元字符前置一个反斜线 \w 所有字母与数字,称为字符[a-zA-Z0-9] 'l[a-zA-Z0-9]*ve' 'l\w*ve' \W 所有字母与数字之外的字符,称为非字符 'love[^a-zA-Z0-9]+' 'love\W+' \b 词边界 '\blove\b' '\<love\>'

1|4四、posix定义的字符分类

# 表达式 功能 示例 [:alnum:] 字母与数字字符 [[:alnum:]]+ [:alpha:] 字母字符(包括大小写字母) [[:alpha:]]{4} [:blank:] 空格与制表符 [[:blank:]]* [:digit:] 数字字母 [[:digit:]]? [:lower:] 小写字母 [[:lower:]]{5,} [:upper:] 大写字母 [[:upper:]]+ [:punct:] 标点符号 [[:punct:]] [:space:] 包括换行符,回车等在内的所有空白[[:space:]]+ # 详解 [:alnum:] Alphanumeric characters. 匹配范围为 [a-zA-Z0-9] [:alpha:] Alphabetic characters. 匹配范围为 [a-zA-Z] [:blank:] Space or tab characters. 匹配范围为 空格和TAB键 [:cntrl:] Control characters. 匹配控制键 例如 ^M 要按 ctrl+v 再按回车 才能输出 [:digit:] Numeric characters. 匹配所有数字 [0-9] [:graph:] Characters that are both printable and visible. (A space is print- able, but not visible, while an a is both.) 匹配所有可见字符 但不包含空格和TAB 就是你在文本文档中按键盘上能用眼睛观察到的所有符号 [:lower:] Lower-case alphabetic characters. 小写 [a-z] [:print:] Printable characters (characters that are not control characters.) 匹配所有可见字符 包括空格和TAB 能打印到纸上的所有符号 [:punct:] Punctuation characters (characters that are not letter, digits, con- trol characters, or space characters). 特殊输入符号 +-=)(*&^%$#@!~`|\"'{}[]:;?/>.<, 注意它不包含空格和TAB 这个集合不等于^[a-zA-Z0-9] [:space:] Space characters (such as space, tab, and formfeed, to name a few). [:upper:] Upper-case alphabetic characters. 大写 [A-Z] [:xdigit:] Characters that are hexadecimal digits. 16进制数 [0-f] # 使用方法: [root@egon ~]# grep --color '[[:alnum:]]' /etc/passwd

1|5五、案列

正则表达式及字符处理

目标文件/etc/passwd,使用grep命令或egrep 1.显示出所有含有root的行: 2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容: 3. 显示出有多少行含有nologin。 4.显示出那些行含有root,并将行号一块输出。 5.显示出文件中 6.新建用户 abominable abominate anomie atomize 编写正则表达式,将他们匹配出来 egrep 'a.omi(nabl|nat|z|)e' /etc/passwd 7.建四个用户 Alex213sb Wpq2222b yH438PIG egon666 egon 过滤出用户名组成是字母+数字+字母的行 [root@MiWiFi-R3-srv ~]# egrep '^[a-Z]+[0-9]+[a-Z]+' /etc/passwd 8.显示出/etc目录下所有包含root的文件名 9. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行 grep -v '^#' /etc/ssh/sshd_config |grep -v '^ *$'

__EOF__

本文作者ଲ小何才露煎煎饺
本文链接https://www.cnblogs.com/zeny/p/15121516.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ଲ小何才露煎煎饺  阅读(84)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示