SHELL学习笔记--grep,awk,sed
时间:2009-02-24 来源:gezn
Grep家族
grep时使用最广泛的命令之一,用来对文本文件内荣按行进行模式匹配查找。啊如果找到匹配模式的行,grep将打印包含模式的行。
Grep有三种变形:
1. Grep:标准grep命令主要讨论此格式。
2. Egrep: 扩展grep,支持基本及扩展的正则表达式
3. Fgrep:快速grep,允许查找字符串而不是一个模式。这里的快速并不是值速度快
Grep的用法
1) grep Usage: grep [OPTION] regular_expressions [filename1 …]
regular_expressions:是正则表达式,一般用单引号吧正则表达式括起来。当然,也可以不使用正则表达式而使用字符串,使用字符串时一般用双引号把字符串括起来。
Filename1…:文件名列表,grep将对这些路指定的而文件的内容进行匹配查找,如果文件名列表省略,grep将从标准化输入读取要匹配查找的内容。
2)grep的常用选项
-c 只输出匹配的行的总数(count)
-i 不区分大小写(只是用与单字符)。
-h 查询多个文件时,不显示文件名。
-l 显示匹配的行及行号
-s 不显示不存在或无匹配文件等错误信息(silence)。
-v 直线式不包含匹配模式的行。,
grep应用举例:
1) 查询多个文件,可以使用*。比如:
grep“sort”*.doc //在所有以doc为后缀的文件中查找字符串“sort”;
grep “linux” * //在当前目录下的所有文件中查找字符串“linux”
2) 精确匹配,可以在要匹配的字符串后加\>。
grep “48\>” data.f //可以匹配48,1248,c48this等不能匹配481,c480
3) 反转匹配
ps aux|grep “httpd”|grep –v “grep”//查看正在运行的httpd进程
4) 匹配空行
grep –n ‘^$’ myfile //打印文件中空行的行号
grep –v ‘^$’ myfile //去除文件中空行的行号
grep可以使用或匹配模式的类名形式
1) 常见的匹配模式的类名形式
[[:upper:]]等价于[A-Z]
[[:lower:]]等价于[a-z]
[[:digit:]]等价于[0-9]
[[:alnum:]]等价于[0-9a-zA-Z]
[[:space:]]等价于空格或tab键
[[:alpha:]]等价于[a-zA-Z]
2) 举例: grep ‘5[[:upper:]][[:upper:]]’ data.f //可以匹配包括5AP196,5DF540的行
可以把要匹配的模式写到一个文件中,然后使用-f选项,将该未能传给grep
Eg:egrep –f grappats data.f //要匹配的模式存放在温江grappats中
可以在grep的模式字符串中使用(|),意即“|”符号两边之一或全部,可以使用人一多“|”,可以同时使用^符号排除字符串
Eg: who|grep ‘(zqf|zqc|zqx)’ //查看是否zqf zqc zqx 三者中是否有在线的
如果传递给grep的文件名参数是不是一个普通文件而不是一个目录的话,要使用”-d”选项。
1) Usage:grep –d [ACTION] directory_name
2) ACTION:ACTION 用来指定作为输入文件的目录文件的处理方式,AXTION有3个可选项:read:把目录文件当作普通文件来读取,是选项省略时的默认方式;skip:目录将被忽略而跳过;recurse:grep以递归的方式读取命令下的每一个文件。等同于选项“-r”。
3) 举例grep –r|”etho” /etc //查看/etc目录中于“eth0”有关的文件的文件名
第九章
Awk介绍
0. Awk 有三个不同的版本awk,nawk 和gawk,未作特别说明,一般指 gawk。
1. Awk语言的最基本功能是在文件或字符串中基于指定的规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。
2. 三种方式调用awk
1) awk [option] ‘awk_script’ input_file1 [input_file2…]
awk的常用选项option有:
-F fs:使用fs作为出入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值
-f filename:从文件filename中读取awk_script
-v var=value:为awk_script设置变量
2)将awk_script放入脚本文件并以#!/bin/awk –f为首行,给予该脚本可执行权限,然后再shell下通过键入该脚本的脚本名调用之。
3. awk的运行过程
1)awk_script的组成
Awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔
Awk_cmd由两部分组成:awk_pattern{actions}
Awk_script 可以被分成多行书写,必须确保整个awk_script被单引号括起来
2) awk的一般命令形式
awk ‘BEGIN{actions} \
awk_pattern1{actions} \
>awk script
Awk_patternN{actions} /
END{actions} /
‘inputfile
其中,BEGIN{actions}和END{actions}是可选的。
3) awk的运行过程:
①如果BEGIN区块存在,awk执行它指定的actions。
②Awk从输入文件中读取一行,成为一条输入记录。(如果输入文件省略,将从标准输入读取);
③Awk将读入的纪录分隔成字段,将第1个字段放入变量 $1,第二个字段放入$2,依次类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。
④把当前输入记录一次与每一个awk_cmd中的awk_pattern比较,看是否匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直掉比较完所有的awk_cmd。
⑤当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③④,这个过程持续,直掉awk读取到 文件尾。
⑥当awk读完所有的输入行后,如果存在END,就执行相应的actions。
4) input_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
5) 一条awk_cmd的awk_pattern可以省略,省略时部队输入记录进行匹配比较执行相应的acitons。一条awk_cmd的actions也可以省略,省略时默认的动作作为打印当前输入记录(print$0)。一条awk_cmd中的awk_pattern和actions不能同时省略。
6) BEGIN区块和END区块分别位于awk_script的开头和结尾。Awk_script中的只有END区块或者只有BEGIN区块是被允许的。如果awk_script中只有BEGIN{actions},awk不会读取input_file。
7) Awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。
8) Awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。
3. Awk_pattern
Awk_pattern模式部分 决定actions动作部分合式触发及触发acitions。Awk_pattern可以是以下几种类型
1) 正则表达式用作awk_pattern:/regexp/
① awk中则正则表达式匹配操作中经常用到的字符:\ ^ $ . [] | () *//通用的regexp元字符;+:匹配其前的单个字符一次以上,使awk自有的元字符,不适用于grep或sed等;?:匹配其前的单字符1次或0次,使awk自有的元字符,不适用于grep或sed等
② 举例:awk’/*\$0\.[0-9][0-9].*/’ input_file
1) 布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。
① 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/
② 布尔表达式的操作符:
关系操作符:< > <= >= = = !=
匹配操作符: value ~/regexp/ 如果value匹配/regexp/,则返回真
value !~ /regexp/ 如果value不匹配/regexp/,则返回真
举例:awk ‘$2>10{print “ok”}’ input_file
awk ‘$3~ /^d/{print “ok”}’ input_file
③ &&(与)和||(或)可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非)可以用于布尔表达式或者/regexp/之前。举例awk ‘/^d/||/x$/{print “ok” input_file
③ 其他表达式用作awd_script如 赋值表达式等
Awk ‘(tot+=$6);END{print “total points:”tot”} input_file //分号不能省略
Awk ‘tot+=$6{print $0}END{print “total points:”tot}’ input_file //与上面等效
2. actions
\actions就是对awk读取的记录数据进行的操作。Actions由一条或者多条命令。参数列表要用分号号(;)分隔。 Actions中还可已使用流程控制结构的语句。
1) awk的命令:
① print参数列表: print可以打印字符串(加双引号),变量和表达式,是awk最基本的命令。参数列表要用逗号(,)分隔,打印出时参数值之间不会有空格。
② printf([格式控制符],参数):格式化打印命令(函数),语法与C语言的printf函数类似
③ next: 强迫awk立刻停止处理当前的记录,而开始读取和处理下一条记录。
④ nextfile:强迫awk立刻停止处理当前的输入文件而处理输入文件列表中的下一个文件
⑤ exit: 使awk停止执行而跳出。如果END存在,awk回去执行END的actions。
2) awk的语句: awk的语句只要是赋值语句,用来给变量赋值。
① 把直接值或一个变量值赋值给变量。如果直接值是字符串要加双引号。
举例:awk’BEGIN{x=1;y=3;x=y;print”x=”;y=”y}’
② 把一个表达式的值赋值给变量。表达式一般式数值表达式,也可是其他表达式。
数值表达式:num1 operator num2
Operator可以是+(加)-(减)*(乘)%(取余)^(求幂)
当num1或者num2是字符串而逝不是数组时,无论是否加有双引号,awk都视其值为0
条件选择表达式A?B:C(A为不二表达式,B和C可以是表达式或者直接值)
当布尔表达式A的值为真时,整个表达式的值为B,A的值为假是,整个表达式的值为C
Awk ‘BEGIN{x=3;y=x>4?”ok”:4;print”x=”;y=”y}’
③为了书写方便,awk也支持c语言语法的赋值操作符:+= -= *= /= ^= ++ - -
2) 流程控制结构(基本上是使用c语言的语法)
其中condition一般为布尔表达式,body和else-body是awk语句块。
① if(condition){then-body}[else{else-body}]
② while(condition){body}
③ do{body}while(condition)
④ for(initialization;condition; increment) {body}与c语言的for结构相同。
⑤ break和continue
3. Awk的变量
第十章 sed用法
1 sed是一个非交互性文本流编辑器
1) sed编辑文件或标准输入到处的文本拷贝。标准输入可能来自键盘、文件重定向或变量,或者是一个管道的文本。可以在命令行输入sed命令,也可以在一个文件两种写入命令,然后调用sed。
2)sed操作的只是一个输入文件在内存内的一个副本,对副本内容进行编辑改动,如果没有重定向到一个文件,将编辑修改的结果输出到屏幕。和awk一样,sed不会修改输入文件的内容。
3)因为sed是一个非交互性编辑器,sed使用一种行定位模式来定位哪些文本行将要被编辑修改。
4)sed从输入数据中读取一行,将之拷贝到一个编辑缓冲区,然后读命令或脚本的第一条命令,并使这些命令中指定的定位模式来确定是否编辑和如何编辑它。重复次过程直到命令结束。
2. 调用sed的三种方式
1)sed命令的格式:sed [options] ‘sed_cmd’ input_file
2) sed_cmd的格式:‘[address]sed_edit_cmd’(一般用单引号括起来)
Address:sed 的行定位模式,用于指示将要被sed编辑的行。如果省略,sed将编辑所有行。
Sed_edit_cmd:sed对被编辑行将要进行的编辑操作。
3) inputfile指定sed的输入文件
4) 将sed命令插入脚本文件,然后调用sed [options] –f sed_script_file input_file
5) 将sed命令插入脚本文件,是sed脚本文件可执行,在控制台下通过直接键入脚本文件名来执行
Sed脚本文件格式:
#!/bin/sed –f
Sed_cmd1
Sed_cmd2
…
3 sed_cmd的address用于定位要编辑的行
x :x为一行号。如5
x,y :表示行号范围从x到y。如2,5表示从第2行到第5行
/pattern/ :查询包含模式的行如/disk/或/[a-z]/。
/pattern/ pattern/ :查询包含两个模式的行。例如/disk/disks/
/pattern/,x:在给定行号上查询包含模式的行/ribbon/,3
x,/pattern/:通过行号和模式查询匹配行。如3,/vdu/
x,y! :查询不包含指定行号x和y的行。如1,2!
4.常见的sed_edit_cmd(sed的行编辑命令)
1)p:sed –n ‘1,3p’ quote.ctxt //只打印文件quote.txt的第1-3行
Sed –n ‘$p’ quotel.txt //只打印文件quote.txt的最后一行
2)=:显示文件匹配行行号
Eg:sed –n ‘/music/=’ quote.txt //打印文件quote.txt中包含”music”字符串的行的行号
1) a\:在指定行(不能是多行范围)后附加N行新文本并显示新文本,多用于脚本。
格式如[address]a\ //符号”\”是必须的。
2) i\: 在指定的行前插入新文本并显示新文本,格式通a\
3) d: 删除被定位的行
4) c\: 用刑文本替换被定位文本行并显示新文本,格式通a\
5) s: 勇猛模式replacement替换被顶问行汇总的oldpattern
6) r: 从另一个文件中读文本附加到指定的杭侯,并显示读入的文本内容。
Eg:sed ‘/company/r sedex.ext’ quote.txt //在显示quote.txt的内容中间显示sedex.txt的内容
sed-n ‘/company/r sedex.ext’ quote.txt //只显示sedex.txt的内容
7) w:写文本到一个文件中
8) q:读取到被[address]定位的行后后退出sed,以便执行其他处理脚本。
9) l:显示被定位行中所有字符,包括控制字符(非打印字符)
sed ‘1,$l’ quote.txt // 显示文件quote.txt 中所有字符。可以在每行行尾看到一个$字符
13){}:在背地恭维的行赏执行的命令组
eg:sed –n ‘{s/night/Night/;p} quote.txt与sed ‘{s/night/Night/}’ quote.txt等效
14)n: 从另一个文件中读取文本下一行,并附加在下一行
4. 一些sed一行命令集。([] 表示空行,[]表示tab键)
‘s^.$//d’ 删除以句点结尾行
‘/abcd/d’ 删除包含abcd的行