正则表达式及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次
锚定符:
单词锚定
\<:锚定词首,例如\<r..t,root
\>:锚定词尾,例如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
转载于:https://blog.51cto.com/wingkeung/1365924