正则表达式及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