美文网首页程序员成长园Linux/Unix知识点Unix/Linux服务器技术分享
awk(报告生成器),grep(文本过滤器),sed(流编辑器)

awk(报告生成器),grep(文本过滤器),sed(流编辑器)

作者: 若与 | 来源:发表于2017-09-19 23:37 被阅读110次
    三剑客

    linux下的文本三剑客

    grep

    egrep,grep,fgrep 
    文本查找的需要
    grep:根据模式搜索文本,并将符合模式的文本行显示出来。
    pattern:文本符和正则表达式的元字符组合而成的匹配条件
    
    grep [option] "pattern" file 
    grep root /etc/passwd
    
    -i:忽略大小写 
    --color:匹配的字符高亮显示  alias
    alias  grep='grep --color'
    -v:反向查找 
    -o:只显示被模式匹配的字符串(不显示行)
    

    globbing

    *:任意长度的任意字符
    ?:任意单个字符
    []:任意一个字符
    [^]:其中任意一个非 
    

    正则表达式:Regular ExPression,REGEXP

    元字符:
    .:匹配任意单个字符
    []:匹配指定范围内的任意字符
    [^]:匹配指定范围内的任意单个字符
    [:digit:][:lower:][:upper:] []
    
    字符匹配次数:
    *:表示匹配前面的字符任意次(0-inf)
       a*b 
       a.*b
    .*:表示任意长度的,任意字符
    工作在贪婪模式 
    \?:匹配其前面的字符一个或0次。
        部分匹配 
      a?b 
    \{m,n\}:匹配其前的字符至少m,至多n次。
       \{1,\}
      \{0,3\}
      a\{1,3\}
      a.\{1,3\}
    

    位置锚定:

    ^:锚定行首,此字符后面的任意内容必须出现在行首。
    grep "^root" /etc/passwd 
    
    $:锚定行尾,此字符前面的任意内容必须出现在行尾。
    
    grep "bash$" /etc/passwd 
    ^$:空白行 
    grep '^$' /etc/passwd 
    

    数字:

    [0-9]:
    
    grep "[[:space:]][[:digit:]]$" 
    
    r555t 
    

    锚定单词:

    \<或\b:其后面的任意字符必须出现在行首
    \>或\b:其前面的任意字符必须出现在行尾。
    
    This is root.
    The user is mroot
    rooter is dogs name.
    chroot is a command.
    grep "root\>" test.txt 
    grep "\<root" test.txt 
    grep "\<root\>" test.txt  
    

    分组:

    \(\)
    \(ab\)* :ab一个整体 
      
      后向引用
      
    He love his lover.
    She like her liker.
    He  love his liker.
    She like her lover.
    
    grep 'l..e*l..e*' text.txt 
    grep "l..e.*\1" text.txt
    grep "\(l..e\)" 
    
    \1:调用第一个左括号以及与之对应的右括号之间的内容。
    \2:
    \3:
    
    /etc/inittab 
    grep '\([0-90]\).*\1$'  /etc/inittab 
    

    REGEXP:regular Expresssion

    pattern:文本的过滤条件

    正则表达式:
    basic REGEXP:基本正则表达式
    Extent REGEXP :扩展正则表达式

    基本正则表达式

    .
    []
    [^]
    
    次数匹配:
    *:
    \?:0或1次
    \{m,n\}:至少m次,至多n次
    
    .*:
    
    锚定:
    ^:
    $:
    \<,\b: 
    \>,\b:
    
    \(\)
    \1,\2....
    

    grep:使用基本的正则表达式定义的模式来过滤文本的命令:

    -i:忽略大小写 
    -v 
    -o 
    --color 
    
    -E 支持扩展的正则表达式 
    -A  # :显示匹配行及以后多少行也显示 
      after 
    -B:显示匹配行以及前面的n行
       before 
    -C:显示匹配行以及前后的n行
       contest 
    grep -A 2 ""  file 
    
    
    扩展正则表达式:
       贪婪模式
    
    字符匹配:
    .
    []
    [^]
    
    次数匹配:
    *:
    ?:
    +:匹配其前面的字符至少一次
    {m,n}
    
    位置锚定:
    ^
    $
    \<
    \>
    
    分组:
    ():分组
    \1,\2,\3.....
    
    或者:
    a|b  or 
    
    C|cat: 
    (C|c)at: 
    
    grep --color -E '^[[:space:]]+' /boot/grub/grub.conf 
    
    grep -E = egrep 
    
    egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-9]|25[0-5])\>' 
    
    (\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-9]|25[0-5])\>\.){3}'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-9]|25[0-5])\>\.'
    
    IPV4:
    5类:
    A B C D E 
    A:1-127 
    B:128-191 
    C: 192--223 
    
    \<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-30]\>
    

    sed(流编辑器)

    sed基本用法:

    sed:stream Editor 
    行编辑器 
       文本编辑器 
       逐行处理文本 
      
    全屏编辑器:vim 
     
    内存空间:模式空间 
    sed 模式空间 
    匹配模式空间后,进行操作,将结果输出。仅对模式空间中的数据进行处理,而后,处理结束,将模式空间打印至屏幕;
    
    默认sed不编辑原文件,仅对模式空间中的数据进行处理。
    

    sed [option] [sed-scripts]

    option:
    -n:静默模式 
    -i:直接修改原文件
    -e scripts -e script:可以同时执行多个脚本。
    -f /path/to/sed_scripts  命令和脚本保存在文件里调用。
      sed -f /path/to/scripts  file 
    -r:表示使用扩展的正则表达式。
       只是进行操作,不显示默认模式空间的数据。
    

    comamnd:

    address:指定处理的行范围
    
    sed 'addressCommand' file ... 
    对符合地址范围进行操作。
    Address: 
    1.startline,endline 
     比如1,100
       $:最后一行
    2./RegExp/ 
      /^root/
    3./pattern1/,/pattern2/ 
      第一次被pattern匹配到的行开始,至第一次pattern2匹配到的行结束,这中间的所有行。
    4.LineNumber 
       指定行 
    5.startline,+N 
     从startline开始,向后的N行。
     
    Command:
     d:删除符合条件的行。
         sed '3,$d' /etc/fstab
         sed '/oot/d' /etc/fstab 
    注意:模式匹配,要使用 // 
        sed '1d' file 
    p:显示符合条件的行 
     sed '/^\//d' /etc/fstab 
     sed '/^\//p' /etc/fstab 
       会显示两次
        先显示P匹配,再显示所有模式空间的数据。
    a \string:在指定的行后面追加新行,内容为"string"
    sed '/^\//a \# hello world' /etc/fstab 
    添加两行:
    sed '/^\//a \#hello world \n #hi' /etc/fstab 
    
    i \sting:在指定行的前面添加新行,内容为string。
    
    r file:将指定的文件的内容添加在指定行后面。
      sed '2r /etc/issue'   /etc/fstab 
      sed '$r /etc/issue' /etc/fstab 
    
    w file:将地址指定的范围的内容另存至另一文件中。
     sed '/oot/w /tmp/oot.txt' /etc/fstab 
     
    s/pattern/string/:查找并替换 
         sed  's/oot/OOT/'  /etc/fstab 
    sed 's/^\//#/' /etc/fstab 
    sed 's/\//#/'/etc/fstab 仅替换每一行第一次被模式匹配的串。
      加修饰符 
       g:全局替换 
       i:忽略大小写 
     sed 's/\//#/g'/etc/fstab
     
     s///:s###
     s@@@
     
    sed 's#+##' 
    
    后向引用
    
    l..e:like----->liker 
         love----->lover 
         
    sed 's#l..e#&r#' file
    &:表示模式匹配的引用 
    
    sed 's#l..e#\1r#' file 
    
    like---->Like
    love---->Love 
    sed 's#l\(..e\)#L\1#g' file 
    
    
    history |sed 's#[[:space:]]##g'
    history | sed 's#^[[:space:]]##g'
    
    sed ''dirname
    

    例子🌰

     1.删除/etc/grub.conf文件中行首的空白符;
     sed  's/^[[:space:]]+//g' /etc/grub.conf 
     2.替换/etc/inittab文件中"id:3:initdefault:"一行中的3
     sed 's#id:3:init#id:5:initd#'
     sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab 
     3.删除/etc/inittab文件中的空白行。
      sed '/^$/d' /etc/inittab
    4.删除/etc/inittab文件中开头的#号
    sed 's/^#//'  
    5.删除莫文件中开头的#号以及空白行。
    sed 's/^[[:space:]]+//g' 
    6.删除某文件中以空白字符后面跟#类的行中开头的空白字符以及#
    sed -r 's/^[[:space:]]+#//g' 
    7.取出一个文件路径的目录名称
    echo '/etc/rc.d'|sed -r 's@^(/.*/)[^/]+/?@\1@g'
    

    awk(报告生成器)

    grep :文本过滤器
    sed:流编辑器 
    
    
    grep option pattern file 
    sed addresscommmand file 
    sed 'comand/pattern/' file 
    

    awk(报告生成器)

    根据定义好的格式,显示出来。
    nawk 
    gawk
    gnu awk 
    
    awk option 'script' file file2 
    awk [option] 'pattern {action}' file file2 
    
    print 
    printf 自定义显示格式
    
    
    awk一次抽取一行,然后对每一行进行切割分片,每一片可以使用变量进行引用。
    $0:表示引用一整行
    $1:第一个切片
    $2:第二个切片 
    
    awk '{print $1}' text.txt 
    awk '{print $1,$2}' text.txt
    

    选项:

    -F  指定分隔符
    awk -F ''
    
    awk 'BEGIN{OPS="#"}{print $1,$2}' test.txt
    BEGIN{OPS=""} 输出分隔符
    
    输出特定字符
    awk '{print $1,"hello",$2,$3,$4,$5}' file 
    
    awk 'BEGIN{print "line one\nline two\nline tree"}'
    
    print的格式:
    print item1,item2...
    
    awk -F: 输入分隔符 
    OFS="#"   输出分隔符
    

    awk变量

    awk内置变量
    FS: filed separator,读取文本时,所用字段分隔符
    RS:recordsepartor,输入文本信息所使用的换行符。
    OFS:OUT filed separator 
    ORS:Output ROw separator 
    
    awk -F:
    OFS="#"
    FS=":"
    

    awk内置变量之数据变量

    NR: the number of input record ,awk命令所处理的记录,如果有多个文件,这个数据是所有处理的行数。
    FNR:当前文件所处理的行是本文件第多少行。
    NF:当前所处理的行有多少个字段。
    
    
    awk '{print NF}' file 
    awk '{print $NF}' file 
    awk '{print NR}' file 
    

    -v 定义变量

    awk -v test="hello awk" '{print test}' 
    awk -v test="hell awk" 'BEGIN{print test}'
    
    
    awk  'BEGIN{test='hello awk',print test}'
    

    printf 格式化显示

    printf  format,item1,item2...
    
    awk 'BEGIN{printf %c,}'
    注意:printf不换行  
    
    %d 
    %e 
    %f 
    %g 
    
    修饰符
    -:左对齐 
    %nd:显示宽度 
    awk '{printf %-10s%-10s\n,$1,$2}' file
    

    awk的操作符
    算术操作符
    字符串操作符
    布尔表达式

    x < y 
    x <= y 
    x > y 
    x != y 
    x ~ y 匹配 
    x !~ y 
    

    表达式间的逻辑关系符

    && 
    || 
    

    条件表达式

    select?if-true-exp:if-false-exp 
    a>b?a=1:b=2 
    

    awk模式

    1.正则表达式 /pattern/
    2.表达式 
    3.REGEXP 指定匹配范围 
    4.BEGIN/END 
    5Empty  
    
    
    awk -F : '/^r/ {print $1}' /etc/passwd 
    awk -F : '$3>=500{printf $1,$3}' /etc/passwd 
    awk -F: '$3+1>=500{print $1,$3}' /etc/passwd
    
    awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd 
    进行匹配测试
    awk -F: '$7!~"bash$"{print $1,$7}' /etc/passwd 
    
    awk -F: '/^r/,/^m/{print $1,$7}' /etc/passwd 
    
    awk -F: '$3==0,$7~"bash"{print $1,$3,$7}' /etc/passwd 
    
    awk -F '{printf "%-10s%-10s%-20s\n",$1,$2,$3}' /etc/passwd 
    
    BEGIN ,END 
    
    awk -F: '$3==0,$7~"nologin"BEGIN{print "Username       ID    shell"}{printf "%-10s%-10s%-20s\n"$1,$3,$7} END{print "ending"}' /etc/passwd 
    

    action

    1.ExPression 
    2.control statements 
    3.compound statements 
    4.INput statment 
    5 output statements 
    

    控制语句

    if-else
    
    if(condition) {then-body} else {[else-body]}
    eg:
    awk -F:
    
    while
    while (condition){statement1;statement2;...}
    循环每一字段 
    length([string])
    
    awk -F: '{i=1; while (1<=NF) if {(length($i)>4) {print $i}; i++}}'
    
    df -hP |awk '{if($4 >=) Print $0}'
    
    
    do while 
    do{statement1,statement2,...} while(condition)
    
    for 
    for( ; ; ){statement1;statement2....}
    
    awk -F: '{for(i=1:i<=NF;i++){if(length($i)>=4){print $i}}}'  /etc/passwd 
    
    case 
    switch (exprssion) {case value or /regexp/:statement1,statement2,...default:statement,....}
     
    break和continue 
    contine是遍历字段的 
    
    next 
    提前结束对本行文本的处理,并接着处理下一行,
    

    数组

    数组下表是从1开始的
    awk[mon]=1 
    awk[tus]=2 
    
    
    for (var in arrary){statement,....}
    
    awk -F: '{shell[$NF]++}END {for(A in shell) {print A,shell[A]}}' /etc/passwd 
    
    nestat -tan 
    
    netstat -tan |awk '/^tcp/{STATE[$NF]++}END{for (S in STATE){print S,STATE[S]}}'
    
    awk '{count[$1]++}END{for ip in count}{printf "%-20s:%d\n",ip,count[ip]}}'  access_log 
    

    相关文章

      网友评论

      本文标题:awk(报告生成器),grep(文本过滤器),sed(流编辑器)

      本文链接:https://www.haomeiwen.com/subject/vgfnsxtx.html