三剑客命令grep sed awk

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三剑客命令grep sed awk相关的知识,希望对你有一定的参考价值。

剑客之grep命令

grep介绍

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

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

grep命令格式如下

grep [选项] PATTERN 文件1 文件2 ...

[root@egon ~]# grep 'root' /etc/passwd
[root@egon ~]# fgrep 'bash' /etc/passwd

找到:				grep返回的退出状态为0
没找到:				grep返回的退出状态为1
找不到指定文件:	  	grep返回的退出状态为2

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

ps aux | grep 'nginx'

选项

-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			递归

正则表达式

正则表达式,又称规则表达式。正则表达式由元字符组成,通常被用来检索、替换那些符合某个模式(规则)的文本(许多程序设计语言都支持利用正则表达式进行字符串操作)。

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

shell元字符(也称为通配符): 由shell解释器来解析,如rm -rf *.txt,元字符*,Shell将其解析为任意多个字符
正则表达式元字符 : 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk

基本正则元字符集

元字符		  功能										       示例	
^ 			  行首										      ^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\\).*\\1er	

x\\{m\\}				字符x重复出现m次							         x\\{3\\}
x\\{m,\\}				字符x重复出现m次以上								 x\\{3,\\}						
x\\{m,n\\}		    字符x重复出现m到n次								 x\\{3,6\\}	

关于(…)使用讲解

[root@m01 ~]# cat a.txt 
lovesshoqsoqsjoqloveer
[root@m01 ~]# grep -E "(love).*\\1er" a.txt				# \\1表示(..)的数据
lovesshoqsoqsjoqloveer

扩展正则元字符集

扩展正则元字符
+					匹配一个或多个前导字符		    [a-z]+ove	
?					匹配零个或一个前导字符		    lo?ve	
a|b					匹配a或b					    love|hate
()					组字符						love(able|rs)  (nana)+
(..)(..)\\1\\2		标签匹配字符				    (love).*\\1er
x{n}			    x出现n次				  	    x{3}		
x{n,}			    x出现n次至无穷次			    x{3,}
x{n,m}		        x出现n次至m次			    x{3,6}

若想使用扩展正则
grep加-E 或 egrep 或转义\\

sed 加 -r 参数 或转义\\

AWK 直接支持大多数扩展正则,更多支持需要加选项--posix选项

只显示ip a命令输出结果的ip地址和子网掩码

[root@m01 ~]# ip a | grep -Eo "([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}"
127.0.0.1/8
192.168.15.61/24
172.16.1.61/24

总结

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	词边界									'\\80\\b'					  '\\<80\\>'

以上是关于三剑客命令grep sed awk的主要内容,如果未能解决你的问题,请参考以下文章

Shell ❀ 三剑客 - Grep + Sed + Awk

linux三剑客的基本使用——grep、sed、awk

三剑客命令grep sed awk

linux命令三剑客:awk,grep,sed

linux命令三剑客:awk,grep,sed

Linux的命令及三剑客(grep sed awk )