正则表达式定义:它使用单个字符串来描述或匹配一系列符合某个句法规则的字符串。
“^”表示行的开始,“^#”表示以#开始的行。“$”表示行的结尾,“#$”表示以#结尾的行。“^$”表示空行。
“[ ]”中括号内为字符组合,代表字符组合中的任意一个,“[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:实现多个编辑行为。
例子:
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的行打印。