1 grep的使用

相信grep是UNIX和LINUX中使用最广泛的命令之一。 grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。grep有三种变形,即: 、Grep:标准grep命令,本章大部分篇幅集中讨论此格式。
Egrep:扩展grep,支持基本及扩展的正则表达式,但不支持 \ q模式范围的应用,与之相对应的一些更加规范的模式,这里也不予讨论。
Fgrep:快速grep。允许查找字符串而不是一个模式。不要误解单词 fast,实际上它与grep 速度相当。
grep一般格式为:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。
常用的grep选项有:

-c   只输出匹配行的计数。 
-i   不区分大小写(只适用于单字符)。 
-h   查询多文件时不显示文件名。 
-l   查询多文件时只输出包含匹配字符的文件名。 
-n   显示匹配行及行号。 
-s   不显示不存在或无匹配文本的错误信息。
-v   显示不包含匹配文本的所有行。
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。

正则表达式时最好用单引号括起来,这样可以防止 grep中使用的专有模式与一些 shell命令的特殊方式相混淆。
grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为 219或216,方法如下:

grep -E '219|216' filename.txt

2、awk的学习

如果要格式化报文或从一个大的文本文件中抽取数据包,那么 awk可以完成这些任务。它 在文本浏览和数据的熟练使用上性能优异。
因为awk使用空格作为缺省的域分隔符,因此如果 要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如 passwd文件,此文件各域以冒号作为分隔符,则必须指明- F选项。
模式包括两个特殊字段 BEGIN和 END。使用BEGIN语句设置计数和打印头。B EGIN语句使用在任何文本浏览动作之前,之后 文本浏览动作依据输入文件开始执行。 END语句用来在awk完成文本浏览动作后打印输出文 本总数和结尾状态标志。如果不特别指明模式,awk总是匹配或打印行数。 实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如 if和循环 (looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录。
awk执行时,其浏览域标记为$1,$2 . . . $n。这种方法称为域标识。使用这些域标识将更容 易对域进行进一步处理。
如果希望打印一个有 5个域的记录的所有域,不必指明 $1 , $2 , $3 , $4 , $5,可使用$0,意即所有域。
当第一次使用awk时,可能被错误信息搅得不知所措,但通过长时间和不断的学习,可总结出以下规则。在碰到awk错误时,可相应查找:
• 确保整个awk命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
• 可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。
为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用 if语句。awk中if后面的条件用()括起来。
表达式{if($4~/brown/) print }意即如果field-4包含brown,打印它。如果条件满足,则打印匹配记录行。
在awk中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。 一般的变量名设置方式为name = $n,这里name为调用的域变量名,n为实际域号。例如设置学生域名为name,级别域名为belt,操作为name = $1 ; belts = $4。注意分号的使用,它分隔 awk命令。下面例子中,重新赋值学生名域为 name,级别域为belts。查询级别为Yellow的记录,并最终打印名称和级别

awk '{name=$1;belt=$2;if(belt~/Yellow/)print name;"is belt" belt}' filename.txt
gsub(r,s) 在整个$0中用s替代r 
gsub(r,s,t) 在整个t中用s替代r 
index(s,t) 返回s中字符串t的第一位置 
length(s) 返回s长度 
match(s,r) 测试s是否包含匹配r的字符串 
split(s,a,fs ) 在fs上将s分成序列a s
print(fmt,exp) 返回经fmt格式化后的exp 
sub(r,s) 用$0中最左边最长的子串代替s 
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分

使用管道将字符串stand-by传入awk,返回其长度。

echo 'stand-by' | awk '{print $0}'

设置文件名为一变量,管道输出到 awk,返回不带扩展名的文件名

str="wydoc.txt"
echo $str | awk'{print substr($str,7)}'