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}'