Grep Sed Awk 笔记和实例

来源:互联网 发布:费用分析软件 编辑:程序博客网 时间:2024/05/05 16:16


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/} 重复mn次先前字符

/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个、mn

1.5 POSIX字符集

[:alnum:]       表示文字和数字

[:alpha:]       表示文字

[:digit:]        表示数字

[:xdigit:]      表示十六进制数字

[:graph:]             表示非空格、控制字符等的其它非空字符

[:lower:]       小写字符

[:upper:]             大写字符

[:cntrl:]        控制字符

[:print:]       可打印字符

[:punct:]       标点符号

[:space:]             空白字符,如空格、制表符、换行符

1.6 实例

       从一堆URL中提取出非IPURL# grep "^[^0-9]/{2,3/}/." final.result >final_no_ip.result

       取出不包含James的记录:#grep –n –v James datafile

       取出以KkAa开头的记录:#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.txt1.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做添加括号的处理。

 

 

3Awk

3.1 何为Awk

       Awk取名于三个作者的姓氏。它是一种数据驱动的编程语言,用于在*nix下对文本和数据进行处理,它支持用户自定义函数和正则表达式,是一种强大的编程工具。

       Awk逐行扫描文件,当该行匹配指定模式时,就对其执行指定操作,直到处理到输入文件末尾。其一般格式为:pattern {action}

3.2 Awk选项

       -Ffs      指定域分隔符,后跟字符串或RE

       -fscriptfile 从文件中读取awk命令,后跟文件名

       -vvar=val     变量赋值

       -Whelp 显示帮助信息,使用该命令可以查询其它很多选项

3.3 模式

       Awk的模式可以有:/正则表达式/、关系表达式、模式匹配表达式(~或者!~)、模式,模式(指定范围)、BEGINEND

3.4 操作

       Awk的操作有:输出、变量或数组赋值、函数、逻辑控制。

3.5 主要环境变量

       $0  当前记录

       $n   当前记录的第n个域

       FILENAME  当前文件名

       FS  域分隔符,默认为任何空格

       NF  当前记录的域数目

       NR  当前记录数,即行号

       FNR       同上,但相对于文件

3.6 基本正则和POSIX字符集

       参考上述grepsed

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

      

原创粉丝点击