正则表达式是通过一些特殊符号的辅助,让用户轻易的达到查找、删除、替换某些特定字符串的处理程序。
正则表达式:分为基础正则表达式 和扩展正则表达式。
基础正则表达式:
1 语系对正则表达式的影响,建议使用下面特殊符号。
[:alnum:] 代表英文字母和数字
[:alpha:] 英文字母
[:blank:] 空格键和Tab键
[:cntrl:] 代表控制按键
[:digit:] 代表数字
[:graph:] 代表处空格(空格和tab)外的其他按键
[:lower:] 代表小写字母
[:print:] 代表任何可以被打印的字符
[:punct:] 代表标点符号(punctuation symbol)
[:upper:] 代表大写字母
[:space:] 任何产生空白的字符 tab CR
[:xdigit:] 十六进制的整数类型0-9 a-f A-F
2 grep的高级参数
grep [-A] [-B] [--color=auto] '搜索字符串' filename
-A:后面接数字,为after的意思,除该行外,后续n行也列出
-B:后面接数字,为before的意思,除该行外,前面n行也列出来
例:dmesg | grep 'eth' #用dmesg列出内核信息,再用grep找出eth相关的行
dmesg | grep -n --color=auto 'eth' #-n显示行号
dmesg | grep -n -A3 -B3 'eth' #显示eth行以及前三行后三行
grep在数据查找一个字符串是以整行为单位进行数据选取的。
3 正则表达式练习
查找特定字符串
grep -n 'the' filename #在filename中查找the
grep -vn 'the' filename #在filename中查找不含the的行
grep -in 'the' filename #在filename中查找含the的行,不区分大小写
利用[]查找集合字符
grep -n 't[ae]st' filename #查找含有tast 或test的行
grep -n '[^g]oo' filename #查找不要oo前面有g的行
grep -n '[^a-z]oo' filename #查找oo前不要有小写字母的行
grep -n '[0-9]' filename #查找有数字的行
grep -n '[^[:lower:]]oo' filename #查找oo前非小写字母的行
grep -n '[[:digit:]]' filename #查找数字的行
行首与行尾字符 ^ $
grep -n '^the' filename #查找行首有the的行
grep -n '^[a-z]' filename #查找行首以小写字母的行
grep -n '^[[:lower:]]' filename #同上
grep -n '^[^[:alpha:]]' filaname #查找行首非字母的行
grep -n '\.$' filename #查找行尾以.结束的行。
grep -n '^$' filename #查找空行
grep -n '^#' filename #查找#开头的行
任意一个字符.与重复字符*
.:代表任意一个字符
*:代表重复前一个0或无穷多个字符
grep -n 'g..d' filename
grep -n 'ooo*' filename #o*代表空字符或者1个o以上的字符
grep -n 'g.*g' filename #代表gg之间有0个或者多个任意字符
限定连续RE字符范围{}
grep -n 'o\{2\}' filename #必须用转移字符\让{失去shell中的特殊意义
grep -n 'o\{2,5\}' filename #查找出有2-5个o的字符
grep -n 'o\{2,\}' filename #查找出2到无穷多个字符
4 基础正则表达式
^word 查找开头为word的行
word$ 查找word在行尾
. 指代一定有一个任意字符
\ 转义字符
* 重复0个或多个前一个字符
[list] 从字符集合list中找出要选取的字符
[n1-n2]
[^list]
\{n,m\} 连续n到m个前一个RE字符
5 sed工具
sed用来将数据替换、删除、新增、选取特定行功能
sed [-nefr] [动作]
-n:使用安静模式silent。 一般sed用法中,所有stdin的数据都会显示在屏幕中,-n后只有经过sed处理的行才显示。
-e:直接在命令行模式进行sed动作编辑
-f:直接将sed动作卸载一个文件中,-f filename执行sed动作。
-r:sed动作支持扩展的正则表达式
-i:直接修改读取的文件内容,而不是由屏幕输出。
动作说明:[n1[,n2]] function
c:替换,c后接字符串,替换n1-n2之间的行
d:删除,
i: 插入,i后接字符串,在下当前行上一行出现
p:打印,
s: 替换,如:1,20s/old/new/g
nl /etc/passwd |sed '2,5d' #删除2-5行
nl /etc/passwd |sed '2a drink tea' #在2行增加一行
nl /etc/passwd |sed '2a drink tea.....\ #在2行增加多行 \是必须要的
>dreann bea'
nl /etc/passwd |sed '2,5d no 2-5 number' #替换2-5行数据
nl /etc/passwd |sed -n '5,7p'
6 扩展正则表达式
egrep 或者 grep -E命令
egrep -v '^$|^#' filename #or的关系
egrep -n 'go+d' filename # +重复一个及以上前一个RE字符
egrep -n 'go?d' filename #0个或一个前一个RE字符
egrep -n 'g(la|oo)d' filename #
egrep -n 'A(xyz)+C' filename #()+重复一个以上xyz的字符串
egrep -n '[!>]' filename #查找含!>的字符 注:!非特殊字符
7 格式打印 printf
8 awk:好用的数据处理工具,
awk倾向于把一行数据分成多个字段来处理
awk '条件类型{动作1} 条件类型{动作2}...' filename
9文件比较工具diff、cmp、patch
10 文件打印准备pr