1. Grep
1.1 何为Grep
Grep表示Global search Regular Expression and Print out the line,是一种强大的文本搜索工具。它从若干个文件中搜索字符串模板,模板后的所有字符串被视为文件名,因此如果模板中有空格则需要被引用,并默认将搜索结果送到终端。
如果搜索成功,则返回0;如果无法匹配到模板,返回1;如果目标文件不存在,返回2
1.2 Grep选项
-数字 同时显示匹配行的上下若干行,如-2表示同时显示匹配行的上下2行;示例:#grep -2 “meet” test.txt
-b 在匹配行前面打印该行所在块;
-c 只打印匹配的行数;
-f File 从文件中提取要匹配的模板;
-h 搜索多个文件时,默认会在匹配行前面显示所在文件名,该参数取消此功能;示例:#grep –h “meet” test.txt 1.txt
-i 忽略大小写;
-q 不显示匹配行,只返回退出状态;
-l 显示匹配模板的文件列表;示例:grep –l “meet” *
-L -l的取反,显示不匹配模板的文件列表;
-n 在匹配行前显示行号;
-s 不显示错误信息;
-v 只显示不匹配的行;
-V 显示版本信息;
-w 结合/<和/>匹配单词;
1.3 基本正则
^ 匹配行开始
$ 匹配行末尾
. 匹配一个非换行字符
* 匹配任意个先前字符
[] 匹配指定范围内字符
[^] 匹配不属于指定范围的字符
/< 匹配单词开始
/> 匹配单词结束
/{m/} 重复m次先前字符
/{m,/} 重复至少m次先前字符
/{m,n/} 重复m到n次先前字符
/w 匹配文字和数字
/W/w的取反,匹配非文字和数字
/b 设置边界,即只匹配单词;如’/bschedule/b’不会匹配”scheduled”
1.4扩展正则egrep或者grep –E
+ 匹配至少一个先前字符
? 匹配0个或1个先前字符
| 匹配其中之一,如a|b|c
() 在字符串中插入RE,如abc(d|e)fg
{m}、{m,}、{m,n} 同上表示匹配m个、至少m个、m到n个
1.5 POSIX字符集
[:alnum:] 表示文字和数字
[:alpha:] 表示文字
[:digit:] 表示数字
[:xdigit:] 表示十六进制数字
[:graph:] 表示非空格、控制字符等的其它非空字符
[:lower:] 小写字符
[:upper:] 大写字符
[:cntrl:] 控制字符
[:print:] 可打印字符
[:punct:] 标点符号
[:space:] 空白字符,如空格、制表符、换行符
1.6 实例
①从一堆URL中提取出非IP类URL:# grep "^[^0-9]/{2,3/}/." final.result >final_no_ip.result
②取出不包含James的记录:#grep –n –v James datafile
③取出以K、k、A、a开头的记录:#grep –i –n ^[AaKk] datafile
2. Sed
2.1 何为Sed
Sed表示streams editor,它一次读入一行记录到缓冲区(称为“模式空间”),然后根据命令处理缓冲区中的内容,再送到终端显示。如此循环,直到文件结束。
2.2Sed选项
-e 表示允许多个命令执行,示例:sed –e ‘s/a/A’ –e ‘s/b/B’ data.txt
-f 后面指定sed脚本文件,如果没有-e或-f则第一个非选项参数视为sed命令
-n 取消自动打印模式空间
-r 在脚本中使用扩展正则表达式
-s 将输入文件视为独立文件,而非连续长输入
--help
--version
2.3 Sed命令
2.3.1 替换命令s
s 表示substitution,替换,是sed中最重要的命令。示例:echo today | sed ‘s/day/night/’,得到的输出结果为“tonight”。
替换命令中分隔符为“/”,所以如果要替换“/”就需要进行转义“//”,多个这样的正反斜线被称为“Picket Fence”。
& 在s命令中该符号表示匹配串。示例:echo today | sed ‘s/day/(&)/’,得到的输出结果为“to(day)”。
/1 sed可以记忆/1到/9,分别表示第1到第9个匹配串。
2.3.2 替换命令s的末尾标记
/g 表示全局搜索。示例:sed ‘s/day/night/g’。
/p 表示输出当前行。示例:sed ‘s/day/(&)/p’。
/w 将处理结果写到文件中。示例:sed ‘s/day/(&)/w day.txt’
2.3.3 指定sed操作范围
通过数字指定行范围:sed ‘1,100 s/a/A’。
通过模式指定行范围:sed ‘/start/,/stop/ s/a/A/’。
通过混合指定行范围:sed ‘1,/stop/ s/a/A/’。
2.3.4 删除命令d
删除指定行:sed ‘1, d’。
删除范围行:sed ‘1,$ d’,表示删除第一行到最后一行。
删除匹配行:sed ‘/^$/ d’,表示删除空行。
2.3.5 输出命令p
输出指定行:sed ‘1 p’。
输出范围行:sed ‘1,10 p’。
输出匹配行:sed ‘/^#/ p’。
2.3.6 取反命令!
不输出匹配行:sed ‘/^# !p’。
删除非指定行:sed ‘1,10 !d’,即删除11到最后一行。
2.3.7 使用{}组合命令
即可以在{}中放置多条命令。
2.3.8 文件读写与追加、插入、改变
添加a表示将行添加到匹配行后面,插入i则是插入到前面,命令c则是改变当前行。
读文件使用r命令,写文件使用w命令。
示例:sed ‘/meet/ r 2.txt’ < 1.txt,如果2.txt有1.txt的匹配行,则会在该匹配行后面显示2.txt的内容。
示例:echo abc123 | sed ‘/abc/ a hello’,得到结果为:
abc123
hello
示例:echo abc123 | sed ‘/abc/ i hello’,得到结果为:
hello
abc123
示例:echo abc123 | sed ‘/abc/ c hello’,则将匹配行换成hello。
2.3.9 获取下一行n
示例:sed ‘/meet/{n; s/meet/(&)/;}’ meet.txt,每次匹配到meet时,就读入下一行做处理,如示例中是对下一行的meet做添加括号的处理。
3.Awk
3.1 何为Awk
Awk取名于三个作者的姓氏。它是一种数据驱动的编程语言,用于在*nix下对文本和数据进行处理,它支持用户自定义函数和正则表达式,是一种强大的编程工具。
Awk逐行扫描文件,当该行匹配指定模式时,就对其执行指定操作,直到处理到输入文件末尾。其一般格式为:pattern {action}。
3.2 Awk选项
-Ffs 指定域分隔符,后跟字符串或RE
-fscriptfile 从文件中读取awk命令,后跟文件名
-vvar=val 变量赋值
-Whelp 显示帮助信息,使用该命令可以查询其它很多选项
3.3 模式
Awk的模式可以有:/正则表达式/、关系表达式、模式匹配表达式(~或者!~)、模式,模式(指定范围)、BEGIN、END。
3.4 操作
Awk的操作有:输出、变量或数组赋值、函数、逻辑控制。
3.5 主要环境变量
$0 当前记录
$n 当前记录的第n个域
FILENAME 当前文件名
FS 域分隔符,默认为任何空格
NF 当前记录的域数目
NR 当前记录数,即行号
FNR 同上,但相对于文件
3.6 基本正则和POSIX字符集
参考上述grep和sed。
3.7 实例
①<一个生成.csv文件的例子:
http://blog.csdn.net/jasonblog/archive/2010/08/10/5801961.aspx
②输出:#awk ‘{print $0}’ datafile
③只输出第一个域:#awk ‘{print $1}’ datafile
④显示以350结尾的行号:#awk ‘/350$/ {print NR}’datafile
⑤用if语句输出第一个域为Sir的行号:#awk ‘{if($1==”Sir”){print NR}}’datafile