Linux sed与awk

基础正则符

字符匹配:., [], [^]
次数匹配: *, \?, \+, \{m,n\}
锚定: ^, $, \<, \>
分组引用: \(\), \1, \2, ... 

扩展正则符

次数匹配:*, ?, +, {m,n}
锚定:
分组引用:(), \1, \2, ...
或者:|

sed:行编辑工具

sed [option]... '地址 编辑命令' FILE...
	
		地址:
			行范围:
				start_line[, end_line]
				/patten1/,/patten2/: 第一次被pattern1匹配到的行开始,到第一次被pattern2匹配到的行结束之间的所有行;
			特定行:
				/pattern/
			无地址:全文

		pattern space: 模式空间

		编辑命令:命令可在之前加!取反
			p:打印
			d: 删除
			i \text: 行上方,text即为插入的内容
			a \text: 行下方,
			r /path/from/some_file: 
			w /path/to/some_file: 把符合条件的行保存至指定的文件中
			=: 显示符合条件行的行号
			s///: s@@@
				g,i


		选项:
			-n: 静默模式,不显示模式空间中的内容
			-r: 支持使用扩展正则表达式
			-i: 修改原文件;
			-e: sed -e "" -e "" -e "", sed "{COM1;COM2;COM3}"

		1、替换/etc/inittab中的"id:3:initdefault"一行数字为5;
			sed -e 's/id:3:initdefault/id:5:initdefault/' 

		2、删除/etc/init.d/functions的空白行;
			sed /^[[:space:]]*$/d

		3、删除/boot/grub/grub.conf文件中行首的空白字符;
			

		4、echo一个路径给sed,通过sed取出其目录名;例如echo "/etc/sysconfig/" | sed,返回/etc;
		 echo '/etc/sysconfig/' | sed 's@[^/]\{1,\}/\?$@@'

awk:文本报告生成器

可以实现对文件中每一行内容的每个字段分别进行格式化,而后进行显示

	awk, --> nawk
	gnu awk --> gawk 

	基本语法:
		awk [option]... 'script' FILE...
		awk [option]... '/PATTERN/{action}' FILE...

		支持使用:变量(内置变量、自定义变量)、循环、条件、数组

		PATTERN:
			地址范围:
				start_line, end_line
				/pat1/,/pat2/
			特定行:
				/pattern/
				#
			表达式:比较
				>, >=, ==, <, <=, !=, ~
			BEGIN模式:在{action}开始之前执行一次
			END模式:在{action}结束之后执行一次;


		内置变量:
			NF:Number of Field
			FS: Field Seperator,输入分隔符;-F:
			OFS:输出时的字段分隔符

			awk分隔符常用的有四种:
				字段的:FS, OFS
				行的:

			引用变量的值,不需要以$开头,所有以$开头的变量,是用于引用字段的值;

		action:
			print "string"
			print $#
			print $1,$2,...


		练习:
		1、显示gid小于500的组;
		 gawk -F: '$3<500{print $1}' /etc/group

		2、显示默认shell为nologin的用户;
		 gawk -F: '$7~/nologin$/{print $1}' /etc/passwd

		3、显示eth0网卡配置文件的配置信息,只显示=号后的内容;
		 gawk -F= '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0

		4、显示/etc/sysctl.conf文件定义的内核参数的参数名;
		 awk -F= '/^[^#]/{print $1}' /etc/sysctl.conf

		5、显示eth0网卡的ip地址;
		 ifconfig eth0 | awk -F: '/inet addr/{print $2}' | awk '{print $1}'
		 ifconfig eth0 | awk 'BEGIN{FS="[ :]+"}/inet addr/{print $4}'

  

 

posted @ 2019-01-25 16:54  Coolc  阅读(901)  评论(0编辑  收藏  举报