1.通配符
* 匹配字符0个或多个
?匹配任意一个字符
[..] 匹配括号中出现的任意一个字符
[!..] 不匹配括号内出现的任意一个字符
2.基本正则表达式元字符
(1)字符匹配
. 匹配任意单个字符
[] 匹配指定范围内任意单个字符
[^] 匹配指定范围外的任意单个字符
[[:digit:]] 数字
[[:lower:]] 小写
[[:upper:]] 大写
[[:alpha:]] 字母
[[:alnum:]] 数字字母
[[:space:]] 空格
()和| re(a|b|c)d 等价于re[abc]d
(2)匹配次数
* 匹配前面的字符任意次
.* 任意长度任意字符
\? 匹配前面的字符串0次或1次
\+ 匹配前面的字符至少一次
\{m\} 匹配前面字符m次
\{m,n\} 匹配前面字符至少m,至多n次
(3)位置锚定
^ 行首锚定
$ 行尾锚定
^pattern$ 用于匹配整行
^$ 空行
\< 词首锚定
\> 词尾锚定
\<pattern\> 匹配整个单词
(4)分组
\(xy\) 将xy作为一组
后向引用:引用分组括号中匹配的字符串
\1 :从左侧起,第一个左括号与右括号之间的模式所匹配的字符
3.grep与正则表达式
-a 将binary文件以text文件的方式搜寻数据
-c 计算找到搜寻字符串的次数
-i 忽略大小写
-n 输出行号
-v 显示没有匹配的行
--color=auto 将找到的关键字部分加上颜色
例:grep ‘\(3\)\.[0-9].*\1 *\1’testfile
第一个字符3,接一个.任意一个数字,任意个任意字符,3,tab键,3
4.sed与正则表达式
一次处理一行内容,处理时把当前行放在缓冲区,不改变原文件内容
sed [options] ‘address command’file
(1) address
StartLine,Endline 1,100
/RegExp/ /^root/
/pattern1/,/pattern2/ 第一次被pattern1开始至第一次被pattern2匹配到的行结束
LineNumber 指定行
StartLine,+N 从StartLine开始,向后N行
(2)command
d 删除符合条件的行
p 显示符合条件的行
c 取代,可以取代n1,n2之间的行
a\“String” 在指定的行后追加新行,内容为String
i:\String 在指定的行前面追加新行,内容为String
r FILE 将指定的文件的内容添加至符合条件的行处
w FILE 将指定范围内的内容另存至指定的文件中
s/pattern/string/修饰符 (g:全局替换 i:忽略大小写 &:引用匹配到的串)
(3)options
-n 只有经过sed处理的行才会被列出来
-e [Script] –e [Script] 可以同时执行多个脚本
-f [filename] 可以执行filename内的sed
-r 支持延伸的正规表示法语法
-i 直接修改读取的档案内容,而不是由屏幕输出
例:
sed ‘1,2d’ab 删除第一行到第二行
sed –n ‘2,$p’ab 显示第二行到最后一行
sed –n ‘/ruby/p’ab 查询ruby所在的所有行
sed ‘1a drink tea’ab 第一行后面添加字符串“drink tea”
sed ‘1a drink tea\n or coffee’ab 第一行后添加两行
sed ‘1,2c Hi’ab 第一行到第二行代替为Hi
5.awk与正则表达式
(1)awk [option] ‘program’file
-F 指定分隔符
-v:var=value 自定义变量
-f scriptfile 从脚本文件中读取awk命令
(2)awk脚本
awk ‘BEGIN{commands}pattern{commands} END{commands}’
1> 执行BEGIN{commands}语句块中的语句
2> 从文件读取一行,执行pattern{commands}语句块,从第一行到最后一行直至文件全部读取完毕
3> 当读至输入流末尾时,执行END{commands}语句块
(3)awk内置变量
$n 当前记录的第n个字段
$0 包含执行过程中当前行的文本内容
FS 字段分隔符
NF 对应于当前的字段数 $NF表示最后一个字段
NR 表示记录数,在执行过程中对应当前的行号
OFS 输出字段分隔符(默认值是一个空格)
RS 输入时的换行符
ORS 输出记录分隔符(默认值是一个换行符)
例:
打印每一行的第二和第三个字段
awk ‘{print $2,$3}’filename
统计文件中的行数
awk ‘END{print NR}’filename
(4)将外部变量值传递给awk
var=100000
echo| awk –v VARIABLE=$var ‘{printVARIABLE}’
另一种传递外部变量的方法
var1=“aaa”
var2=“bbb”
echo|awk ‘{print v1,v2}’v1=$var1v2=$var2
(5)运算符
1> 算数运算符
+ - 加减
* / &
^ *** 求幂
++ -- 增加或减少 作为前缀或后缀
所有用作算数运算符进行操作,操作数自动转为数值,非数值都变为0
2> 逻辑运算符
|| 或
&& 与
3> 正则运算符
~ 匹配正则表达式
~!不匹配正则表达式
例:awk ‘BEGIN{a=“100testa”;if(a ~ /^100*/){print “ok”}}’ok
(6)awk输入输出
next 跳过当前行,处理下一行
awk ‘NR%2==1{next}{print NR,$0;}’text.txt
将结果输出到一个文件
awk ‘{printf(“hello word!n”)>“datafile”}’(或>>)
(7)输出
1> print item1,item2,…
逗号隔开
item可以省略,意思是print$0,显示整行
2> printfFORMAT,item1,item2…
FORMAT必须给出来
printf不会自动换行,需给出\n
FORMAT需为后面每个item指定一个格式化符号
%c 显示ASII码
%d 显示十进制整数
%e 科学计数法
%f 浮点数
%s 显示字符串
%u 显示无符号整数
%% 显示%自身
- 左对齐 + 显示字符的符号
awk –F :‘{printf“username:%-15suid:%d\n”,$!,$3}’/etc/passwd
(8)关联数组array[index-expression]
字符串要使用双引号
当数组元素不存在时,awk会自动创建此元素并初始化为空
数组中是否存在某元素,使用index in array 判断
例
awk‘BEGIN{weeks[“mon”]=“monday”;weeks[“tue”]=“tursday”;for(i in weeks) printweeks[i]}’
netstat –tan |awk ‘/^tcp/>/{state[$NF]++}END{for(I in state){print i ,state[i]}}’
(9)内置函数
1> rand() 0到1之间的随机数
2> length() 字符串长度
3> split(string,array,field separator)
将一个字符串分隔为单词并存储在数组中
time=“12:34:56”
out=`echo $time | awk‘{split($0,a,“:”);printa[1],a[2],a[3]}’`
echo $out
4> substr截取字符串
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
5>根据扩展名切分文件名
1> ${var%.*} 非贪婪
从${var}中删除位于%右侧的通配符所匹配的字符串,从右向左匹配
var=“sample.jpg”输出sample
2> ${var%%.*}贪婪
从右向左匹配最长的字符串
var=“hack.fun.book.txt”
echo ${var%.*} hack.fun.book
echo ${var%%.*} hack
3> 非贪婪,从左到右匹配
Var=“hack.fun.book.txt”
Echo ${var#*.} fun.book.txt
Echo ${var##*.} txt