欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux——grep文本过滤工具

程序员文章站 2022-07-12 18:58:50
...

grep:

	linux文本处理三剑客
		grep:文本过滤工具(模式:pattern)工具
			grep,egrep,fgrep
		sed:stream editor,文本编辑工具;
		awk:Linux上的实现gawk,文本报告生成器
	
	grep:Global search Regular expression and Print out the line.
		作用:文本搜索工具,根据用户指定的“模式”对目标文本朱行进行匹配检查;打印匹配到的行
			模式:有正则表达式字符及文本字符所编写的过滤条件
			REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示
				控制或通配的功能;
				分两类:
					基本正则表达式:BRE
					扩展正则表达式:ERE
						grep -E,egrep

				正则表达式引擎:
					grep [OPTIONS] PATTERN [FILE...]
						选项:
							--color=auto:对匹配到的文本着色显示;
							-v:显示不能够被patter匹配到的行;取反;
							-i:匹配检查时忽略大小写
							-o:仅显示匹配到的字符串
							-q:静默模式,不输出任何信息。可使用echo $?查看执行结果
							-A n;after,后n行
							-B n;before ,前n行
							-C n,context,前后各n行
							
							-E,使用ERE;
							
	基本正则表达式元字符:
		字符匹配:
			.:匹配任意单个字符; grep 's..n' /etc/passwd
			[]:匹配指定范围内的单个字符
			[^]:匹配指定范围外的任意单个字符
			[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
		匹配次数:用在要指定次数的字符后面,用于指定前面字符要出现的次数;
			* :匹配前面的字符任意次;贪婪模式,
			.* : 任意长度的任意字符
			\? : 匹配前面字符0次或1次;即前面字符可有可无;
			\+ : 匹配前面字符至少一次;
			\{m\} : 匹配前面的字符m次;
			\{m,n\} : 最少m最多n 次;
				\{0,n\} :匹配前面字符至多n次;
				\{m,\} :匹配前面字符至少m次;
		位置锚定:
			^: 行首锚定;用于模式的最左侧
			#:行尾锚定;用于模式最右侧
			^PATTERN$:用于模式匹配整行;
			^#:空行;
			^[[:space:]]*$
			\< 或 \b :词首锚定,单词左侧
			\> 或 \b:词尾锚定,单词右侧;
			\<PATTERN\>:匹配整个单词;
							
		分组:
			\(\) :分组,将一个字符或多个字符当成一个整体;grep "\(xy\)"

			注意:
				\(\):分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,
					这些变量为:、1,、2,、3.。。。
					\1:从左侧起,第一个左括号与最右侧右括号之间的模式所匹配到的字符
					\(ab\+\(xy\)*\)
						\1:\(ab\+\(xy\)*\)
						\2:(xy\)
			后向引用:引用前面的分组括号中的模式所匹配到的字符(而非模式本身)

	实例:
		1、显示/proc/meminfo文件中以大小s开头的行:(两种方式)
			grep -i '^s' /proc/meminfo 
			grep '^[Ss]' /proc/meminfo 
		2、显示/etc/passwd文件中不以/bin/bash结尾的行;
			 grep -v '/bin/bash$' /etc/passwd
			
		3、显示/etc/passwd文件中的ID号最大的用户名
			sort -t: -k3 -n /etc/passwd |tail -1| cut -d: -f1
		4、如果用户root存在,显示其默认的shell程序
			id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
		5、找出/etc/passwd中的两位或三位数;
			grep '\<[0-9]\{2,3\}\>' /etc/passwd  
		6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;
			grep '^[[:space:]]\+[^[:space:]]' /etc/rc.d/rc.sysinit
		7、找出‘netstat -tan’命令的结果中以‘LISTEN' 后跟0/1或多个空白字符结尾的行;
			 netstat -tan |grep "LISTEN[[:space:]]*$"
		8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd
			中用户名通shell名的行
			grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd 

	示例:写一个脚本实现
			如果user1用户存在,就显示其存在否则添加之;
			显示添加用户的id号等信息;
			#!/bin/bash
			id user1 &> /dev/null && echo 'user1 exists.'|| useradd user1
			id user1
		2、写一个脚本,如果root用户登录了当前系统,就显示root用户在线,否则说明其未登录
			w | grep "^root\>" &> /dev/null && echo "root logged" 

egrep及扩展的正则表达式

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

	扩展正则表达式的元字符:
		字符匹配:
			.
			[]
			[^]
		次数匹配:
			*
			?:0或1次
			+:1次或多次
			{m}:匹配m次
			{m,n}:至少m至多n次;
		锚定:
			^
			$
			\<,\b
			\>,\b 
		
		分组:
			()
			
		或者:
			a|b
				C|cat:C或cat
				(C|c)at:C或者c
			
		
		
	示例:	
		1、显示当前系统root、centos、user1用户的默认shell和UID
			[[email protected] ~]# grep -E '^(root|centos|user1)\>' /etc/passwd |cut -d: -f1,3,7
		
		2、找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行
			grep -E -o '^[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions
		3、使用echo输出一绝对路径,使用egrep取出其基名;
			 echo '/mnt/sdc' |grep -E -o '[^/]+$' |cut -d"/" -f1 
			使用egrep取出路径的目录名,类似于dirname命令的结果
		4、找出ifconfig命令结果中1-255之间的数值
			**basename /etc/sysconfig   -->sysconfig
			  dirname /etc/sysconfig    -->/etc
		
		5、找出ifconfig命令中的IP地址