正则表达式及linux文本处理三剑客(grep,sed,awk):
正则表达式(RE):
Basic RE(基本正则表达式):
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
*:匹配其前的字符0,1或多次(次数匹配,贪婪模式下),例如:ab*c,abbc,ac,abbbc
?:匹配其前的字符0或1次(次数匹配),例如:ab?c
.*:匹配任意长度的任意字符
\{m,n\}:匹配其前m到n次(次数匹配),例如:a[a-z]\{0,2\}c
\{m,\}:至少m次
\{0,n\}:最多n次
\{m\}:精确匹配m次
锚定符:
单词锚定
\<:锚定词首,例如\ \>:锚定词尾,例如root\> ^:行首锚定,例如^root,^[[:space:]]*root $:行尾锚定,例如root$,root[[:punct:]]\{0,1\}$ 分组: 例如xa*b*y,xay,xby,xy,xaby \(\),x\(ab\)*y 前向引用,\1,\2,\3 例如:grep.txt he love his lover she like her liker he love his liker she like her lover grep --color=auto 'l..e.*l..er' grep.txt grep --color=auto '\(l..e\).*\1(数字1)r' grep.txt Extended RE(扩展正则表达式)
元字符 . [] [^] 个数 * \? + 至少一次 {m,n} 锚定符 同基本正则表达式相同 或者: |: 例如:a|b 分组: () linux文本处理三剑客:grep,sed,awk grep命令: Global RE(Regular Expression) Printing,文本过滤工具,能够实现根据指定的模式(pattern)逐行搜索文件内容,并将匹配到的行显示出来。 格式: grep [option]……'PATTERN' FILE 模式:是由正则表达式的元字符,其它字符组成的匹配条件 选项: -v 取反 --color=auto 颜色自动 -i 不区分字符大小写 -o 只显示匹配到的串,例如:ifconfig | grep -o 'inet addr:[[:space:]]*' | cut -d: -f2 | grep -v '127.0.0.1' -A 2 匹配行向后多2行 -B 2 匹配行向前多2行 -C 2 匹配行前后多2行 -E 把元字符解释到扩展正则表达式 egrep 等同于 grep -E 举例:ifconfig | egrep -o '\<[1-9] | [1-9][0-9]\>' fgrep 快速grep,不解析正则表达式,直接搜索文本 sed命令: 流式编辑器,行编辑器,不会更改源文件 格式:sed [option] 'script' input_file sed -f 'script_file' input_file
命令: d:删除 例如:sed '1d' /etc/fstab 删除/etc/fstab的第一行 p:打印、显示 例如:sed '1,3p' /etc/fstab 打印/etc/fstab的1到3行 a:追加,附加 例如:sed '/^\/a \# this is a / line' /etc/fstab i:插入,和a相反,即在行前插入 例如:sed '/^\/i \# this is a /line. \n# hello world' /etc/fstab c:和a、i类似,只是替换 r:/path/to/somefile w:/path/to/somefile s/PATTERN/string/,s@@@,s### g:全局修改 i:不区分字符大小写 前向引用: & \1,\2 =:用于显示指定行的行号 例如:sed '/^\//=' /etc/fstab y/source/dest/:逐个字符对应替换,类似于tr 'a-z' 'A-Z'
选项: -n:静默模式 例如:sed -n '1,3p' /etc/fstab 只显示fstab的1到3行 -i:直接修改源文件 -e:一次性处理多次 例如:sed -e 's/^[[:space:]]\{1,\}\([^[:space:]]\{1,\}\)/\1/' -e 's/default/DEFAULT/' /boot/grup/grub.conf -f /path/to/script_file 例如:sed -f sedscript /boot/grup/grup.conf (sedscript文件中存放-e后面的那两个编辑命令) -r:支持扩展正则表达式
awk命令: awk:是一种可以处理数据、产生格式化报表的语言,功能相当强大。awk的工作方式是读取数据文件,将每一行数据视为一条记录,每笔记录以字段分隔符分成若干字段,然后输出各个字段的值。 格式: awk [options' 'script' FILE1,FILE2…… awk [options] 'PATTERN {ACTION}' FILE1,FILE2…… 举例:awk '{print $1}' a.txt 模式: 1、Regexp:正则表达式,格式为/regular expression/ 2、expresssion:表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo或$1 == "magedu" ,用运算符~{匹配}和!~{不匹配} 3、Ranges:指定的匹配范围,格式为pat1,pat2 4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次货结束前运行一次 5、Empty{空模式}:匹配任意输入行 常见的ACTION: 1、Expressions 2、control statements 3、compound statements 4、Input statements 5、Output statements 一、print:
选项: -F 字段分隔符 例如:awk -F:'{print $1}' /etc/passwd -v 声明一个变量 例如:awk -v FS=: '{print $NF}' /etc/passwd 内置变量: NF 显示每行的最后一个字段 例如:awk '{print $NF}' /etc/passwd FS 指定读入时的分隔符 例如: awk -v FS=: '{print $NF}' /etc/passwd OFS 指定输出时的分隔符,则只能分隔本来以空白字符分隔的文本 例如:awk -v OFS=: '{print $1,$2}' /tmp/a.txt 二、printf 格式:printf format item1,item2,…… 要点: 1、其与print命令的最大不同时,printf需要指定format 2、format用于指定后面的每个item的输出格式 3、printf语句不会自动打印换行符\n format格式的指示符是以%开头,后跟一个字符,如下 %c 显示字符的ASCII码 %d,%i 十进制整数 %e,%E 科学计数法表示数值 %f 显示浮点数 %g,%G 以科学计数法的格式或浮点数的格式显示数值 %s 显示字符串 %u 无符号整数 %% 显示%自身 修饰符: N 显示宽度(数字) - 左对齐(默认右对齐) + 显示数值符号 举例:awk -F: '{printf "%-10s%s\n",$1,$2}' /etc/passwd awk -F: '{printf "%-15S %i\n,$1,$3" > "/dev/stderr"} /etc/passwd awk -F: '/bash/{print $1}' /etc/passwd awk -F: '$3>=500{print $1,$3}' /etc/passwd awk -F: 'BEGIN{print "Username UID"}{printf "%-15s%s\n",$1,$3}END{print "Over"}' /etc/passwd
练习一: 1、显示/proc/meminfo文件中以不区分大小的a开头的行 2、显示/etc/passwd中以nologin结尾的行 3、显示/etc/inittab中以#开头,且后面限一个或多个空白字符,而后又跟了任意非空白字符的行 4、显示/etc/inittab中包含了:一个数字:即两个 冒号中间一个数字的行 5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行 6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行 练习二: 1、找出某文件中的,1位数,或2位数:/proc/cupinfo,/proc/meminfo 2、找出ifconfig命令结果中的1-255之间的整数 3、查找当前系统上名字为student(必须出现在行首)的用户的账号的相关信息,文件为/etc/passwd 练习三: 分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现的数字必须相同),请写出可以精确找出类似两行的模式 11:1:wait:/etc/rc.d/rc 1 13:3:wait:/etc/rc.d/rc 3 11:1:wait:/etc/rc.d/rc 3 13:1:wait:/etc/rc.d/rc 3