zoukankan      html  css  js  c++  java
  • shell脚本之grep,sed,awk

    一、grep

    强大的全局文本搜索命令,并能将匹配到的文本按行打印
    支持正则表达

    用法

    grep [OPTIONS] PATTERN [FILE]  
    
    或者
    cat FILE|grep [OPTIONS] PATTERN 

    1 常用的OPTIONS

    -c    统计匹配到的行数  
    -i    匹配时不区分大小写
    -n    显示匹配行所在行号
    -o    只显示匹配到的字符串
    -v    取反,方向匹配,不匹配关键字的行
    -E    开启扩展的正则表达式
    -A n  显示匹配的所在的行及其后n行
    -B n  显示匹配的所在的行及其前n行
    -C n  显示匹配的所在的行及其前后各n行

    2 PATTERN部分

    主要为基本正则表达式

    2.1 基本字符组

    .          匹配除换行符外的任意一个字符
    .*         匹配所有内容
    [abc]      匹配abc三个字符中的任意一个字符
    [^abc]     匹配不包含abc三个字符中的任意一个字符(与[abc]相反)

    2.2 特殊字符组

    [A-Za-z] 等价于 [[:alpha:]]       匹配任意字母字符,不管大小写
    [0-9] 等价于 [[:digit:]]          匹配任意数字字符
    [A-Za-z0-9] 等价于 [[:alnum:]]    匹配任意字母数字字符
    tab,space 等空白字符 [[:space:]]   匹配任意空格符
    [A-Z] 等价于 [[:upper:]]          匹配任意大写字目字符
    [a-z] 等价于 [[:lower:]]          匹配任意小写字母字符
    [[:punct:]]                      匹配标点符号

    2.3 出现次数

    *        前面的字符出现任意次,包括0次
    ?       前面的字符出现0次或1次,为转义符
    +       前面的字符至少出现一次
    {m}    前面的字符出现m次,为转义符
    {m,}   前面的字符至少出现m次,为转义符
    {m,n}  前面的字符至少出现m次,至多n次,为转义符

    2.4 位置锚定

    ^    锚定行首,即以什么开头
    $    锚定行尾,即以什么结尾
    ^$   空白行
       锚定词首或词尾,前面为词首,如"who"匹配到whoami,后面为词尾,如"who"会匹配到iswho
    <   锚定单词的词首
    >   锚定单词的词尾
    B   与作用相反

    2.5 ()分组引用

    (str)  用()将str作为一个整体方便后面引用,第一个()为$1,以此类推
    1          引用第1个左括号及其对应的右括号所匹配的内容
    
              引用第n个左括号及其对应的右括号所匹配的内容

    3 扩展的正则表达式 

    即OPTIONS的-E选项

    字符组和特殊字符组与基本正则表达式一样
    
    次数和位置锚定 没有转义符,其他的和基本正则表达式一样
    分组引用 (string)
    1

    二、sed 

    非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作
    支持正则表达式

    用法

    sed OPTIONS sed命令 FILE
    
    sed OPTIONS -f 包含sed命令的FILE FILE

    1 OPTIONS

    -e  用于进行多重编辑,即同时有多个sed命令时使用,即sed -e sed命令 -e sed命令 FILE
    -f  后接包含sed命令的FILE
    -i  直接修改FILE内容,不加-i时只是预览,不会修改FILE内容
    -n  取消默认的输出,只显示处理过的行,sed默认输出FILE的所有内容
    -r  使用扩展正则表达式,默认只识别基本正则表达式

    2 sed命令

    a   新增,指定行后方加入新行
    i   新增,指定行前方加入新行
    c   替换行,将指定行的内容全部替换
    d   删除
    p   将指定内容打印到终端上,通常与OPTIONS -n 一起用
    s   替换指定字符串

    3 基本使用

    3.1 显示

    若str包含变量,请使用双引号("")

    sed -n 'Np;Mp;Xp' FILE 显示行号为N,M,X的多行 sed -n '$p' FILE 显示最后一行 sed -n '/str/p'FILE 显示包括str的所有行 sed -n 'N,Mp' FILE 显示第N行到第M行

    3.2 删除

    以下命令只是预览,不会真正修改文件内容,若下行要修改文件内容,请使用sed -i 
    若str包含变量,请使用双引号("") sed
    'N,Md' FILE 显示删除第N行到第M行剩下的内容 sed '/str1/,/str2/d’ FILE 显示删除包含str1的行到包含str2的行剩下内容 sed '/str/,Nd' FILE 显示删除包含strt的行到第N行剩下的内容 sed '/str/d' FILE 显示删除包含str的行剩下的内容 sed '/^$/d' FILE 显示删除空白行剩下的内容

    3.3 增加

    以下命令会真正修改文件内容,请谨慎使用
    若str包含变量,请使用双引号("") sed
    -i 'Na str' FILE 第N行后增加一行字符 sed -i 'Na str1 str2' FILE 第N行后增加二行字符 sed -i 'N,Ma str' FILE 第N行到第M行的每行后都增加一行字符 sed -i 'Ni str' FILE 第N行前增加一行字符 sed -i 'Ni str1 str2' FILE 第N行前增加二行字符 sed -i 'N,Mi str' FILE 第N行到第M行的每行前都增加一行字符

    3.4 替换

    以下命令会真正修改文件内容,请谨慎使用
    若str包含变量,请使用双引号("")
    sed
    -i 'Nc str' FILE 将第N行的内容替换为str sed -i 'N,Mc str' FILE 将第N行到第M行的内容替换为str sed -i 's/str1/newstr/g' FILE 将所有的str1替换为newstr sed -i 's/str1/newstr2/gw FILE1' FILE2 将处理过的行另存到文件1 sed -i 's/str1/newstr/g' FILE2 >FILE1 将处理后的内容重定向至文件1

    三、awk
    文本处理工具,以字段为单位进行处理
    支持正则表达式

    用法

    awk [OPTIONS] '[pattern] {action}' FILE
    
    cat FILE |awk [OPTIONS] '[pattern] {action}'

    1 awk内置变量

    1.1 字段和分隔符变量

    $0  满足条件的所有文本内容
    $1  以FS分隔符隔开的第一列内容
    $2  以分隔符隔开的第二列内容
    $n  以分隔符隔开的第n列内容
    
    FS     指定字段(列)分隔符,默认空格 
    RS     指定处理时的行分隔符,遇到该符号就是一行,默认换行符
    OFS    指定输出的字段(列)分隔符,默认空格
    ORS    指定输出的行分隔符,行以该符号结尾,默认换行符

    1.2 数据变量

    ARGC  命令行的参数个数
    ARGV  命令行所有参数组成的数组
    ARGIND  被处理文件在ARGV中的位置
    
    NF    当前行的字段个数,即列数
    NR    当前行的行号
    FNR    处理多个文件时,当前行在本文件中的行号
    
    FIELNAME 被处理的文件名
    
    IGNORECASE    如果为真,则进行忽略大小写的匹配
    CONVFMT    数字转换格式 %.6g
    ENVIRON    UNIX环境变量
    ERRNO    UNIX系统错误消息
    FIELDWIDTHS    输入字段宽度的空白分隔字符串
    OFMT    数字的输出格式 %.6g
    RSTART    被匹配函数匹配的字符串首
    RLENGTH    被匹配函数匹配的字符串长度
    SUBSEP    034

    2 OPTIONS

    -F  指定分隔符,默认为空格,包括一个或多个空格键或tab键
    -v  定义变量和初始值,可以在 pattern {action}使用
    -f  后接包含pattern {action}的文件

    3 [pattern] {action}

    3.1 pattern

    1) BEGIN和END

    BEGIN    在awk尚未读取任何数据之前执行,只执行一次
    END        在awk处理完文本所有数据后执行,只执行一次
    
    其中
    BEGIN中定义的变量只能在当前的BEGIN中使用
    END中定义的变量只能在当前的END中使用
    
    
    示例 awk
    'BEGIN {print "ready start!"} /a/{print $0}' FILE 先输出ready start!,再输出包含字符'a'的整行内容 awk '/a/{print $0} END {print "ready start!"}' FILE 先输出包含字符'a'的整行内容,再输出ready start!

    2) 关系运算符

    >
    <
    >=
    <=
    ==
    !=
    
    示例
    awk 'NR>2 {print $0 }' FILE
    输出行号大于2的所有行
    
    awk 'NR<2 {print $0 }' FILE
    输出行号小于2的所有行
    
    awk 'NR>=2 {print $0 }' FILE
    输出行号大于等于2的所有行
    
    awk 'NR<=2 {print $0 }' FILE
    输出行号小于等于2的所有行
    
    awk 'NR==2 {print $0 }' FILE
    输出行号等于2的行
    
    awk 'NR!=2 {print $0 }' FILE
    输出行号不等于2得所有行
    
    awk -F ',' '$1==10 && $2==9 {print $0 }' FILE
    输出第一列为10,第二列为9的行的内容
    
    awk -F ',' '$1==10 || $2==9 {print $0 }' FILE
    输出第一列为10或者第二列为9的行的内容

    3) 匹配操作符

    匹配操作符
    str1 ~ /str2/ 
    str1 !~ /str2/
    
    其中
    str2可以是正则表达式
    
    示例 
    awk -F ',' '$1 ~ /^asd/ {print $0 }'  FILE
    输出第一列以asd开头的行的内容
    
    awk -F ',' '$1 !~ /^asd/ {print $0 }'  FILE
    排除第一列以asd开头的行
    

    4) 正则表达式

    /str/  匹配含有str的内容
    
    示例
    awk -F ',' '/^asd/ {print $0 }'  FILE
    输出以asd开头所有行的内容

    3.2 {action}

    1) 格式化输出printf

    基本很少使用,使用print频率极高
    
    c   以ASCII码显示
    d   以整数显示
    i   以整数显示
    e   以科学计数法显示
    f   以浮点数显示
    g   以科学计数法或浮点数显示
    o   以八进制显示
    s   以字符串显示
    x   以十六进制显示
    X   以十六进制显示,但用大写字母A~F
    
    awk -F ',' '$1 ~ /^[0-9][0-9]*/ {printf "%e,%f
    ",$1,$3 }'  FILE
    输出第一列全是数字的第一列,第三列,并以科学计数法显示第一列,浮点数显示第三列
    
    注意:
    prtinf必须有
    ,否则不会换行

    2) 结构化流程控制

    A if语句

    awk -F ',' '{if(NR==2 || $1 ~ /a/) print $0}' FILE
    输出第二行或者第一个字段包含字符a的行
    
    awk -F ',' '{if(NR==2 || $1 ~ /a/) print $0;else print NR,$1}' FILE
    输出第二行或者第一个字段包含字符a的行,以及不满足条件的行号和第一列

    B wihle语句

    awk -F ',' '{total=0;i=1; while (i<4){total+=$i;i++} avg=total/3;print avg }'  FILE
    输出前三列的平均值
    
    其中
    $i表示第几列数据

    C do-while语句

    awk -F ',' '{total=0;i=1; do {total+=$i;i++} while (i<5);print total }'  FILE
    输出前四列之和
    
    其中
    $i表示第几列数据

    D for语句

    awk -F ',' '{total=0; for(i=1;i<5;i++) {total+=$i};print total }'  FILE
    输出前四列之和
    
    其中
    $i表示第几列数据
  • 相关阅读:
    Ubuntu把在任事器范围起更次要的脚色
    linux下firefox 3.0 flash失效的治理法子
    Fedora的一些根蒂设置装备摆设(三、有关Firefox的放慢设置装备摆设)
    Linux操纵零碎下即时通讯软件
    QGtkStyle 让 KDE 法式拥有 Gnome 外不雅
    Ubuntu 8.04 告白登岸德国柏林的地铁零碎
    关于linux的一些重要日记文件
    linux下挂载U盘进程
    对Fedora9的一些心得领会(另附一些末尾设置装备安插)
    使用distinct在mysql中查询多条不重复记载值的处理责罚步调
  • 原文地址:https://www.cnblogs.com/gudanaimei/p/13194635.html
Copyright © 2011-2022 走看看