正则表达式和grep,sed,awk

正则表达式定义:它使用单个字符串来描述或匹配一系列符合某个句法规则的字符串。

“^”表示行的开始,“^#”表示以#开始的行。“$”表示行的结尾,“#$”表示以#结尾的行。“^$”表示空行。

“[ ]”中括号内为字符组合,代表字符组合中的任意一个,“[0-9a-zA-Z]”表示任一数字或大小写字母。“[^a-z]”表示不在a-z字符内的任一字符。

“.” 表示任意一个字符。“*”表示零个或多个前面的字符。“.*”表示零个或多个任意字符。“?”表示零个或一个前面的字符。“+”表示一个或多个前面的字符。

“{n }”表示n个前面的字符。“{n1,n2 }”表示n1到n2个前面的字符,其中n1<n2。“{n,}”表示至少n个前面的字符。使用时要在括号前加上脱意字符,如:“\{n\}”。

“( )”表示一个整体,“(aa)+”表示一个或多个aa。

“aaa|bbb”表示字符串aaa或者字符串bbb。


grep和egrep的用法:

egrep是grep的加强版,除了具有grep所有功能外,还可使用“+”,“?”,“|”,“( )”等字符,grep要使用这些字符要加脱意字符“\”。

-c:打印符合要求的行数。

-i:忽略大小写。

-n:输出符合要求的行及其行号。

-v:打印不符合要求的行。

-A:后面跟一个数字n,有无空格都可以,表示打印符合要求的行以及下面n行。

-B:后面跟一个数字n,有无空格都可以,表示打印符合要求的行以及上面n行。

-C:后面跟一个数字n,有无空格都可以,表示打印符合要求的行以及上下各n行。

例子:

grep -C2 'aaa' file:将文件file含字符串aaa的行及其上下各两行都打印出来。

grep -nv 'aaa' file:将文件file不含字符串aaa的行打印,并输出行号。

grep -v '^#' file | grep -v '^$':将文件file所有不以#开头的行且非空行打印输出。 

grep -v '[0-9]' file:将文件file所有不含数字的行打印。包括空行。

grep '[^0-9]' file:将文件file所有含非数字字符的行打印。空行不含字符,所以不包括空行。

grep '^[^a-zA-Z]' file:将文件file所有以非大小写字母开头的行打印。不包括空行。

grep '[^a-zA-Z]' file:将文件file所有含非大小写字母字符的行打印。不包括空行。

grep 'a..d' file:将文件file中含有a..d的行打印。a..d表示a和d中间有两个任意字符。

grep '.*' file:打印文件file所有行。包括空行。

grep 'a\{2\}' file:将文件file中含有字符串aa的行打印。

egrep 'a+' file:将文件file中含有一个或多个a的字符串的行打印。

egrep 'a?' file:将文件file中含有零个或一个a的字符串的行打印。

egrep 'aaa|bbb|ccc' file:将文件file中含字符串aaa或bbb或ccc的行打印。符合多个条件的只打印一次。

egrep '(aaa)+' file:将文件file中含有一个或多个aaa的字符串的行打印。


sed的用法:


-n:取消默认输出。

-e:实现多个编辑行为。

-i:直接修改原文件内容。

例子:

sed -n 'n1,n2'p file:打印文件file的第n1行到第n2行,其中p表示打印,最后一行用$表示。

sed -n '/aaa/'p file:打印文件file中包含字符串aaa的行。

sed -e 'n'p -e '/aaa/'p -n file:打印文件file的第n行,打印含有字符串aaa的行。执行顺序是依次扫描每一行,若该行符合第一个条件则打印一次,若其符合第二个条件则再打印一次。直至行末。

sed 'n1,n2s/aaa/bbb/g' file:将文件file第n1行至第n2行中所有的字符串aaa替换为字符串bbb。其中s表示替换,g表示本行全局替换,如果不加g则只替换本行出现的第一个。分隔符除了用“/”还可以用其他特殊字符,如“#”和“@”。

sed 'n1,n2s/[a-zA-Z]//g' file:将文件file第n1行至第n2行中所有的字母滤除。

sed 's/\(aaa\)\(.*\)\(bbb\)/\3\2\1/' file:将文件file中同一行内的字符串aaa和bbb调换位置。小括号在sed中属于特殊符号,需在前面加脱意字符“\”。用小括号把要替换的字符串括成一个整体,替换时分别用\1,\2,\3代表第1,第2,第3个字符串所放的位置。

sed 's/^.*$/aaa&/' file:将文件file所有行前面加上字符串aaa。&用来保存被搜索的字符串,如s/love/**&**/,love这成**love**。

sed 's/.*a$//;s/^b.*//' file:将文件file中以a结尾的行或者以b开头的行滤除。执行顺序是依次扫描每一行,对该行依次进行第一个替换动作和第二个替换动作。

错误用法:

sed 'n1,n2/aaa/'d file:定位行号和筛选字符串的功能不可共用。

sed -n 'n1,n2/aaa/'p file:定位行号和筛选字符串的功能不可共用。

sed '13;/aaa/'p -n file:目前已知“;”仅能用在两个替换动作之间。


awk的用法:

用分隔符隔开的叫做字段,$0表示整行,$n表示第n字段,n>0。分隔符后面要用单引号括起,里面是筛选条件和处理动作,动作要用“{ }”括起,print表示打印动作,动作后面可以跟$0或$n或自定义的内容,跟多个$n要用逗号隔开,自定义的内容要用双引号括起。被筛选的字符串要用“//”括起。不加“{ }”来指定打印的内容时,默认打印符合“{ }”外条件的行。

awk中可以用逻辑符号进行判断,逻辑符号有:==,!=,>,>=,<,<=。例如“==”表示等于,即精确匹配。“!=”表示不匹配。若逻辑符号右侧是数字,加双引号的数字表示字符串,不加双引号的数字表示数学中的数字。若右侧是字符串,则必须加双引号。可以用“&&”和“||”在同一个awk语句中连接两个逻辑符号表达式,分别表示“并且”和“或者”。

awk有内置变量,常用的有NF和NR。NF表示用分隔符分隔后一共有多少字段,NR表示行号。

awk中可以使用if判断和for循环。

-F:指定分隔符,分隔符用单引号括起来,例如:-F ':'。如果不加该选项,则默认以空格或tab键为分隔符。如果使用awk更改了内存中的内容,那么打印时会以默认的空格为分隔符打印,可以用OFS=“分隔符”来指定分隔符。

例子:

head -n2 file |awk -F ':' '{print $1}':打印文件file前两行的第一字段。

awk '/aaa/' file:将文件file中含有字符串aaa的行打印。

awk -F ':' '$1 ~/aaa/' file:将文件file中第一个字段含有字符串aaa的行打印。“~”表示模糊匹配,只要包含就行。

awk -F ':' '/aaa/ {print $1,$2} /bbb/ {print $3,$4}' file:将文件file中含有字符串aaa的行的第一二个字段打印,含有字符串bbb的行的第三四个字段打印。执行顺序是依次扫描每一行,若该行符合第一个条件则打印一次,若其符合第二个条件则再打印一次。直至行末。

awk -F ':' '$1>=5' file:将文件file中第一个字段在数学上大于5的行打印。例如:23>5。

awk -F ':' '$1>="5"' file:将文件file中第一个字段在字符上大于5的行打印。例如:23<5。

awk -F ':' '$1>$2' file:将文件file中第一个字段在数字上大于第二个字段的行打印。

awk -F ':' '$1>"5" && $1<"7"' file:将文件file中第一个字段在字符上大于5且小于7的行打印。

awk -F ':' '$1>"5" || $7=="/bin/bash"' file:将文件file中第一个字段在字符上大于5或第七个字段为“/bin/bash”的行打印。

awk -F ':' '{print $NF}':将文件file中每行最后一个字段打印。

awk 'NR>20' file:将文件file中第20行之后的行打印。

awk -F ':' 'NR>20 && $1 ~ /aaa/' file:将文件file第20行之后且第一个字段含有字符串“aaa”的行打印。

awk -F ':' '$1="aaa"' file:将文件file中每行的第一个字段改为aaa并打印。

awk -F ':' '$8=$1+$2' file:将文件file中每行的第八个字段改为第一二个字段的和并打印。

awk -F ':' '{$8=$1+$2}' file:将文件file中每行的第八个字段改为第一二个字段的和,改变只会存于电脑内存中,不会打印出来。

awk -F ':' '{$8=$1+$2;print $0}' file:将文件file中每行的第八个字段改为第一二个字段的和并打印。

awk -F ':' '{(sum=sum+$1); END {print sum}' file:将文件file中每行的第一个字段求和并打印。END表示所有的行都已经执行。

awk -F ':' '{if($1=="aaa") print $0}' file:将文件file中第一个字段为aaa的行打印。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值