2.1-2.8 正则表达式三大命令

回复 收藏
2.1grep过滤1    正则表达式--通过制定格式的字符串显示制定行,其中制定格式的字符串就是正则表达式,基本包含 grep  egrep  sed  awk
================================================================
      grep是过滤的命令,经常使用,需要熟练掌握并灵活运用。
        grep --color 可以对过滤后内容字进行颜色标记,这是很常用的命令选项,可以对其进行别名,写入.bashrc并source .bashrc 使其生效,命令  alias gc='grep --color'
        gc -n    可以显示过滤出的内容的对应行号,方便辨认;
        gc -v    取反过滤,并且不会有标记颜色;
        gc -c    统计过滤后的行数,并不会显示内容;
        gc -A    直接跟数字,如 gc -A 2    显示过滤内容行及向下两行内容;
        gc -B    如上,显示过滤行及向上两行内容;
        gc -C    如上,显示过滤行及上下各两行内容;
        gc -r     遍历目标目录及子目录、文件所有内容并列出各行,如:gc -r 'root' /etc/*


2.2grep过滤2    grep还可以通过定义范围进行各种过滤,会涉及到不同的特殊符号,介绍如下:
    grep '[0-9]' t.txt    过滤出t.txt中带有数字的行,[]是区间的意思,会取区间中任意一个字符匹配过滤;
    grep '[a-zA-Z]' 1.txt    过滤出1.txt中带有字母的行;
    grep '^[0-9]' 1.txt     过滤出1.txt中以数字开头的行,^是指开头,$则是结尾;
    grep '^[^0-9]' 1.txt    过滤出1.txt中以非数字开头的行,grep '[^0-9]' 是匹配包含非数字字符的行
    grep '^$' 1.txt   过滤1.txt中的空行;
    grep 'r.o' 1.txt    .  表示任意一个字符,过滤出 r 和 o 之间有任何字符的行;
    grep 'r\?o' 1.txt = grep -E 'r?o' 1.txt = egrep 'r?o'1.txt
脱义掉?号,即去掉?为字符的情况,表示有0个或1个前面的字符r的过滤
    grep 'r*o' 1.txt    贪婪匹配,* 表示无限制,grep 'r.*o' 1.txt即过滤出前面有r后面有o的所有行

2.3 grep过滤3    egrep是grep命令的拓展,直接代表了grep脱义的表达,与 “grep -E”  或者  “grep后条件加\符号”意思是一样的。
    grep条件中有几个特殊符号是需要加脱义的:  ?   +   |   ()   {}        例如下:
    ?是指0个或1个前面的字符。egrep 'r?o' 1.txt
    +是指1个或多个+前面的字符。egrep 'r+o' 1.txt  ==  grep -E 'r+o' 1.txt  ==  grep 'r\+o' 1.txt
    |是或的意思,egrep 'root|nologin' 1.txt        包含了root或者nologin单词的行,没有直接表示并的特殊符号,可以通过管道符实现:grep 'root' 1.txt|grep 'nologin'
    ()定义一个字符段,{}定义执行条件,egrep '(ro){1,3}' 1.txt  == grep '\(ro\)\{1,3\}' 1.txt  == grep -E ....

2.4sed命令sed和下面的awk命令都是流式编辑器,是针对文档的行进行操作的。
    sed命令可以实现grep的所有功能(除了颜色标记),不过需要加上-n …… p 打印显示出来对应行(如果不加-n的话会将整个文档打印出来,符合要求的行会打印两边)
    如:grep "root;login" 1.txt    ==     sed -n '/root ; login/'p 1.txt
         -d可以删除目标行,例:  sed '/root/'d 1.txt   ||  sed '1,3'd 1.txt   ####  格式只是显示出来时会删掉,如果需要文档删除,则需要加上 -i选项,如   sed -i '/root/'d 1.txt ####  不建议这样删除,因为没有提示,容易误操作。
        -e可以实现多个行为写在一起,如  sed -e '/root/'p -e '/login/'p -n 1.txt
        sed -n '1,5{/test/p}' test.txt  ##  打印1-5行包含test的行
        sed -r 's/^..*$/& 99/' /etc/passwd  ##  在每一行最后加上数字99
        




2.5sed命令替换功能        sed可以实现替换要求,语法同vim的语法。需灵活运用各种特殊符号,如下多条
        sed -r '1,10s#^(.)(.*)(.&)#\3\2\1#g' 1.txt
###   第一到第十行,将首尾字符互换


        sed -r 's#^([a-zA-Z]*)([^a-zA-Z]*)([a-zA-Z]*)(.*$)#\3\2\1\4#g' 1.txt
###    首个单词和最后一个单词交换
   
        sed- -r 's#^.*$#123&321#g' 1.txt
###    在行首加上123,行末加上321,&表示前面 ^.*$ 的意思


        
2.6awk命令1    可以按照要求分段匹配显示,例子如下:
        awk -F ':' 'OFS="#" {print $1,$4}' 1.txt  ---  -F指定分隔符,OFS是指定显示出来的多列内容的分隔符(默认不加则以空格或者tab为分隔符),后跟单引号,内是分隔符;{}内定义打印出第一和第四列,$1  $2表示第一第二段,注意$0是表示整行;print是打印信息,必须要加{}定义,当然也可以直接定义自己想打印的格式:   awk -F ':' '{print $1"#"$3"#"$5"#"$7}' etc/passwd   ###自定义的内容,必须要用""双引号括起来!
        awk和其他grep、sed最大的区别就是后两者使用特殊符号(+   ?   |   *  等)时需要使用脱义(grep用-E或egrep,sed用-r),而前者可以直接使用,例如:
        awk '/r?o|(rr)+/' 2.txt  ---  直接匹配包含o和ro  或者 有多个rr的行
也可以指指定段,写要求
        awk -F ':' '$1~/r+o/;/(ro)+/' 2.txt  ---  执行两个命令,前一个命令是第一段中包含一个或多个r后跟o的条件,第二个是包含一个或多个ro的行,会执行两次,所以有重复满足条间的则重复答应两次
        awk -F ':' '/root/ {print $1 $3}  /nobody/ {print $1 $3}' /etc/passwd  ###多次匹配打印
        awk命令因为自带定义的{}符号,所以,无法直接识别{}指定执行次数,如需要使用,则必须加上选项  awk --posix
      例如:  awk -F ':' --posix '$1~/(oo){1}/{print $3}' 2.txt
        
2.7awk命令2
     可以通过比较来过滤,例如
        awk -F ':' '$1=="root"' 1.txt    ##  ==表示绝对等于,这里定义==后面的内容必须加上双引号
        awk -F ':' '$3>=500' 1.txt    ##  当和数字相比较时,不能够加上双引号,否则会按照ASCII进行比较
        awk -F ':' '$1=="nobody" && $7!~/nologin/' 2.txt   ##  &&是并且的意思,与之对应 || 是指或者,!~符号就是不满足后面要求的行,!=不等于的意思;
        awk -F':' 'BEGIN{OFS="#"} {if($3>100){$7=$3+$4;print $0}}' 2.txt
    ##        这条命令的解释是用#分割显示2.txt中以:分割的第三段大于100的行,并将第七段显示成第三、四段的和
    ##        BEGIN 是指在执行其他条件前先执行指定命令;if($3>100)需要满足第三段大于100的要求;{$7=$3+$4;print $0}将第七段写成第三、四段的和,打印整行,$0是指整行
        echo "this is a ' for test" |awk '{print "this is a '"'"'"}'
###   在awk中使用脱义字符\是起不到作用的,如果想打印特殊字符,只能使用'""' 这样的组合才可以。
这里自左至右为单引号 双引号 双引号 单引号其中两个单引号为一对,两个双引号为一对。想脱义$那就是'"$"' 脱义单引号那就是 '"'"'


2.8 awk命令3    awk中有很多变量,老师介绍的有   RF#段     RN#行    OFS#定义显示内容的分隔符
        awk -F  ':' 'NR==10' 2.txt       ##打印第十行
        awk -F ':' '{print NF}' 2.txt         ##显示文档每行总字段数
        awk -F ':' 'OFS="$" {print $NR,$NF}' 2.txt  ##打印第NR行第NF段,以$为分隔符
注意:    awk -F ':' '{sum=sum+$3};END {print sum}' 2.txt
  ##   求第三段的和,这里的END是awk特有的一种语法,表示所有行都已经执行完后。


    awk中的数学运算
    head -3 /etc/passwd|awk -F ':' '$1="root" {print $1,$4}'   ###  赋值内容需要加双引号;
   
详解可见  http://www.apelearn.com/study_v2/chapter14.html#awk

2016-08-05 08:47 举报
已邀请:
0

Ject1992he - linux学习

赞同来自:

收藏

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: