linux

grep sed awk 使用基本指南

2009年3月3日 阅读(365)

基础知识:
grep:
grep实际来源自命令行编辑器,可以这样理解它的名称来源g/re/p:其中g代表global,re代表regex,p代表print;意思就是全局正则表达式匹配并打印。实际上gerp的命令格式是这样的:grep -c "patten" filename filename,其中patten是正则表达式。所有grep主要完成在输入中进行正则表达式匹配的,并输出相关信息的功能。

支持的正则表达式元字符:
^ 锚定行的开始 如:’^grep’匹配所有以grep开头的行。
$ 锚定行的结束 如:’grep$’匹配所有以grep结尾的行。
匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。
* 匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[] 匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。
[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\) 标记匹配字符,如’\(love\)’,love被标记为1。
\< 锚定单词的开始,如:’\
\> 锚定单词的结束,如’grep\>’匹配包含以grep结尾的单词的行。
x\{m\} 重复字符x,m次,如:’0\{5\}’匹配包含5个o的行。
x\{m,\} 重复字符x,至少m次,如:’o\{5,\}’匹配至少有5个o的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:’o\{5,10\}’匹配5–10个o的行。
\w 匹配文字和数字字符,也就是[A-Za-z0-9],如:’G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。
\W \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b 单词锁定符,如: ‘\bgrepb\’只匹配grep。
3. 用于egrep和 grep -E的元字符扩展集
+ 匹配一个或多个先前的字符。如:'[a-z]+able’,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
? 匹配零个或多个先前的字符。如:’gr?p’匹配gr后跟一个或没有字符,然后是p的行。
a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
() 分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
x{m},x{m,},x{m,n} 作用同x\{m\},x\{m,\},x\{m,n\}

grep有如下选项:-? 同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。
     -b,–byte-offset 打印匹配行前面打印该行所在的块号码。
     -c,–count 只打印匹配的行数,不显示匹配的内容。
     -f File,–file=File 从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
     -h,–no-filename 当搜索多个文件时,不显示匹配文件名前缀。
     -i,–ignore-case 忽略大小写差别。
     -q,–quiet 取消显示,只返回退出状态。0则表示找到了匹配的行。
     -l,–files-with-matches 打印匹配模板的文件清单。
     -L,–files-without-match 打印不匹配模板的文件清单。
     -n,–line-number 在匹配的行前面打印行号。
     -s,–silent 不显示关于不存在或者无法读取文件的错误信息。
     -v,–revert-match 反检索,只显示不匹配的行。
     -w,–word-regexp 如果被\<和\>引用,就把表达式做为一个单词搜索。
     -V,–version 显示软件版本信息。

命令格式为:grep ‘regex’ file1 file2 …
实例:grep ‘[a-z]\{5\}’ aa

sed:
sed实际上是stream editor 即流式编辑器,完成行编辑功能,比如行的删除,添加,文本替换。其的命令格式是这样的:sed -n ‘1,3s/patten/res/’ filename.其中-n是设置选项,‘command’,1,3代表范围,s代表命令名称,这里是文本替换,/ever/after/分别代表替换前后的文本

命令格式为:sed ‘command’ file
command格式:[address]s/old/new/flags 
address:可以分为行地址和模式地址。
     如1,10d  12d  10,$d  表示行地址
     如/^$/d  表示模式地址。
     用户在进行操作时,可以对行地址和模式地址一起结合进行操作。如1,/^$/d 表示删除第一行到第一个空行之间的所有内容。
flags:
 n:1~512之间的数字,表示对本模式中指定的匹配行中出现第n次的情况时进行替换,其它行不进行替换。
如sed ‘s/unix/UNIX/2’ sed.txt 替换每行中第个unix字符,将其转换成大写UNIX。
 g:表示对全局进行替换。
 p:打印模式空间的内容。即打印匹配行的内容。
 w file:表示匹配行的内容写到另一个文件中。

替换命令:[address]s/old/new/flags
删除命令:[address]d
追加命令:[line-address]a\text
插入命令:[line-address]i\text
更改命令:[address]c\text
转换命令:[address]y/old/OLD/
打印行号:[address]=
下一步:[address]n  next改变正常的流控制,执行完这一步时,不返回,而是执行下一步内容。
读/写文件:[line-address]r file  读文件。 [address]w file   写文件。

 如sed ‘/unix/r 1.txt’ sed-s.txt 在unix字符的后面,读入1.txt文件
 sed ‘2r 1.txt’ sed-s.txt 在第2行后面,读入1.txt文件
 sed ‘2,5w 2.txt’ sed-s.txt 将第2行到第5行的内容,写到2.txt文件中去。

退出:[address]q
  如sed ‘100q’ sed.txt  读到第100行时,退出。
  sed ‘/unix/q’ sed.txt  遇到第一个unix字符时退出。  

awk:
awk则是几个实现者的头文字组合,用来处理报本的,含有丰富的处理命令,尤其是{}包含了及其广泛的命令集合,格式如下:awk [ -F re] [parameter…] [‘prog’] [-f progfile][in_file…]
-F re:允许awk更改其字段分隔符。
parameter: 该参数帮助为不同的变量赋值。
‘prog’: awk的程序语句段。这个语句段必须用单拓号:’和’括起,以防被shell解释。
这个程序语句段的标准形式为:’pattern {action}’ 。其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed类似,你也可以使用","分开两样式以选择某个范围。关于匹配的细节,你可以参考附录,如果仍不懂的话,找本UNIX书学学grep和sed(本人是在学习ed时掌握匹配技术的)。 action参数总是被大括号包围,它由一系统awk语句组成,各语句之间用";"分隔。awk解释它们,并在pattern给定的样式匹配的记录上执行其操作。与shell类似,你也可以使用“#”作为注释符,它使“#”到行尾的内容成为注释,在解释执行时,它们将被忽略。你可以省略pattern和 action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。
-f progfile:允许awk调用并执行progfile指定有程序文件。progfile是一个文本文件,他必须符合awk的语法。
in_file:awk的输入文件,awk允许对多个输入文件进行处理。值得注意的是awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。

实例:
awk -F % ‘NR==7,NR==15 {printf $1 $3 $7}’
awk ‘/[Ss]un/,/[Mm]oon/ {print}’ myfile

待解决问题

1.从文件中读取命令文本,并用awk的{}执行这个命令
有个方法很简单,把awk的输出重定向到一个temp.sh文件,chmod +x temp.sh然后执行它就可以了

2.利用awk从文件中读取一些文本,并将这些文本,赋给一个自定义变量的值
方法1):将awk命令作为一个子命令执行,结果返回给shell中的一个变量
CONFIG_ARG=`awk ‘BEGIN{FS=":"}/^configure_arg/{print $2}’ intel_itc_conf`
方法2):在awk中引用shell中用户自定义的变量
1>使用双引号
text=’Thisisatext’
mytext=’abcd’
echo $text|awk "{print "$mytext"}"
2>调用awk的同时,在这里设置变量值为shell中用户自定义的变量的值
printf " 请输入局所号:"
read jsh
yyy=`awk ‘$2==jsh {print $1;}’ jsh="$jsh" zjk`
在zjk文件中查找$2=变量jsh的记录,然后把$1的值赋于变量yyy

3.如何将某个变量在文件中找到,并根据设置的新值取代这个变量的值,比如makefie里的CC=

转载请注明作者:phylips@bmy

出处:http://duanple.blog.163.com/blog/static/7097176720092384652230/

You Might Also Like