Linux中 sed和awk 简单实用

sed:流处理编辑器---(相当于读文件的流,只对流进行每一行的处理,但是不对文本进行处理)
awk:文本处理工具
在fressh.log中查找所有报错的日期
$sed -n '/Error/p' | awk '{print $1}' fresh.log

单个字符的查找方式
    正向查找:[a-zA-Z],[0-9],[A-Z] 等等
        注意:[259]代表查找单个字符2,5,9,不是查找259这个
    反向查找:[^a-zA-Z],[^0-9],[^A-Z] 等等
    任意字符: .      
        但是要注意,[.]和\. 代表只查找.符号,
    边界字符头:^
    边界字符尾:$
    元字符(代表普通字符或者特殊字符)
    \w:匹配任何字类字符,包括下划线,[A-Za-z0-9]
    \W:匹配任何非字类,和\w相反,[^A-Za-z0-9]
    \b:代表单词的分隔,\bx\b:代表查找 :x:  规避 ixa

多个字符组合的查找方式 (符号前面的\是为了不被识别成我要匹配该符号,在LINUX中适用,根据实际情况使用)
    [0-9]*:零次或多次 匹配前面的字符或者表达式\{0,\}
    [0-9]\+:一次或多次 匹配前面的字符或者表达式\{1,\}
    [0-9]\?:零次或一次 匹配前面的字符或者表达式\{0,1\}
    [0-9]\{n,m\}:n次或m次 匹配前面的字符或者表达式
    
任意字符串的表达:.*   * 还可以替换成 +  ? {,}
    注意,正则的匹配是贪婪地,会尽可能长的去匹配
字符串逻辑的表示: |  或者x=\(a\|b\)匹配x=a或者x=b


sed [options] 'command(reg)' file(s)

command  :
    p (print,建议配合-n使用,因为会不用-n每行会打印两次) 
        ----sed -n 'p' test.txt       
        ----sed -n 'Np' test.txt          代表将第N行打印出来,查看对不对可用  nl test.txt |sed -n 'Np'
        ----sed -n '/value/p' test.txt     代表将匹配value的行都打印出来
        ----sed -n 'N,Mp'                  代表将第N行到第M行都打印出来
        ----sed -n '/value1,/value2/p'    代表将第一个符合value1的行 到 最后一个符合value2的行都打印出来
        ----sed -n 'N,M!p'              代表将除了第N行到第M行都打印出来,意为取反
        ----sed -n 'N~Mp'                代表从N行开始打印,间隔M行打印一次(1~2,打印的是1,3,5行),没有N,M~L的写法哟
        ----对行的选取操作,以下参数也适用
    a (sed 'Na CONTENT1'  在第N行后面append内容行CONTENT1)
    i (sed 'Ni CONTENT1'  在第N行后面insert内容行CONTENT1)
    c (sed 'Nc CONTENT1'  将第N行内容cover换成内容行CONTENT1 不同的是N,Mc 代表N到M行替换成一行CONTENT1)
    d (sed 'Nd CONTENT1'  将第N行delete删除)
        ----删除空行  sed /^$/d test.txt
    s (sed 's/CONTENT1/CONTENT2/' test.txt)                  将test.txt文件流中匹配到的第一个的CONTENT1替换成CONTENT2)  
        ----sed 's/CONTENT1/CONTENT2/g' test.txt              带上了g代表替换所有,global全局
        ----sed -n '/CONTENT1/p' test.txt |sed 's/reg1//'      显示一个被替换过的行,其实就是对获取的某一行进行修改
        ----sed '{N,Md;s/CONTENT1/CONTENT2/}'                  意思是将两个命令放到一块执行,不同命令用;分号分隔,依次执行
        ----sed '{n;command}' test.txt                         n的意思是跳行,所以这条命令是,先跳一行,然后在执行command
        ----sed 's/CONTENT1/&CONTENT2/' test.txt              将test.txt文件流中的CONTENT1后面加上CONTENT2
        ----ls | sed 's/^.\+/\U&/'                          将ls读取到的文件流中的所有字母都变成大写
            \u,\L,\l                                        首字母大写,小写,首字母小写
    -r 复制指定文件插入到匹配行
        ----sed '1r 123.txt' abc.txt                        将abc.txt中的数据插入到读取123.txt读取流的第一行
    -w 复制匹配行拷贝到指定文件
        ----sed '1w abc.txt' 123.txt                         将123.txt的第一行,写到abc.txt,覆盖原内容,重写

awk [options] 'command' files        
    command1:pattern{awk操作命令}
    操作命令:内置函数、控制指令
    $0:整个当前行,$1:每行的第一个字段,
    awk -F field-separator(默认为空格),用split(),例如awk -F 'test' == split(test)
    
    ~,!~   匹配正则表达式
    ==,!=,<,>  判断逻辑表达式
    awk -F 'test' '$1~/^a.*/{print $1}' test.txt  输出第一个字段是a开头的行
    
    awk -F 'test' 'BEGIN{print "begin"} {print "pattern"} END{print "end"}' 
    相当于开始执行一次BEGIN,然后执行中间函数,结束时候执行一次END,类似于junit的Before,After
    ls -l |awk 'BEGIN{size=0}{size+=$5}END{print "size is" size}'
    输出文件的的大小和
    
    netstat -anp|awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum )print i,sum[i]}'
    
    
    
    
    
    
    
    
    
    
    
    

猜你喜欢

转载自blog.csdn.net/xpf094/article/details/85762660
今日推荐