zoukankan      html  css  js  c++  java
  • vim/sed/awk/grep等文件批处理总结

    Vim相关操作

    1.基础

    • * 和 # 对对当前光标所在的单词进行搜索
    • %匹配括号移动,包括 (, {, [
    • K 查看man手册
    • ga 查看ascii值
    • CTRL-G 统计字数,使用Visual模式选取统计部分
    • q: 打开历史记录窗口
    • :marks 打开编辑标记窗口, `0 准确回到上一次退出vim的位置
    • gf 打开光标下的指定文件, CTRL-W f 在新窗口中打开
    • 格式转换: :set fileformat=unix
    • 增加/减少缩进: >>/<<
    • 块编辑: :set virtualedit=all , 退出 :set virtualedit= 。特别适用于表格编辑
    • gv 再次选定上次选择的Visual区域
    • CTRL-A , CTRL-X 对数字加/减
    • ls vim - 从标准输入读取要编辑的内容
    • c, C 忽略/不忽略大小写匹配
    • / 重复前一次搜索
    • zM 关闭所有折行, zR 打开所有折行, zo, zc 打开,关闭某个折行
    • 剪切版: "xy 复制到x缓冲区, "xp 粘贴x缓冲区, "+y 复制到系统剪贴板, "+p 从系统剪切板粘贴

    2.光标移动

    • 0 到行头
    • ^ 到本行的第一个非blank字符
    • $ 到行尾
    • g_ 到本行最后一个不是blank字符的位置
    • fa 到下一个为a的字符位置
    • ta 到a前一个字符处
    • 3fa 在当前行查找第三个出现的a
    • F和T 和f和t一样,只不过方向向反

    3.可视化选择

    • v(单个字符) V(单行) CTRL+v(单列)
    • J 把所有的选择连接起来(变成一行)
    • < 或 > 左右缩进
    • = 自动缩进

    4.替换

    • :20,100s/bc/a&d/g                          # 表示把bc替换为abcd(& 是一个特殊字符,表示被替换的内容。)
    • :%s/((d+))/="(".(submatch(1)+1).")"/g     # % 表示全文搜索,s表示替换,(d+
    • :%s/^/=line('.')."	"/      # 在每行的行首添加行号数字和tab
    • :10,20s/^/=line('.')."	"/  # 从10到20行的行首添加数字和tab
    • :let counter=0|10,20g//let counter=counter+1|s/^/=counter."	"  # 从0开始添加数字

    5.匹配与搜索

    • /ab* “*”匹配任意个(零个或多个)b
    • /(ab)* “ab”作为整体
    • /ab+ “+”至少一次
    • /folders= “=”一次或零次
    • /ab{m,n} 匹配至少m次,至多n次
    • /foo|bar “|”模式中的或操作
    d 数字 [0-9]
    D 非数字 [^0-9]
    x 十六进制数 [0-9a-fA-F]
    X 非十六进制数 [^0-9a-fA-F]
    s 空白字符 [ ] (<Tab> 和<Space>)
    S 非空白字符 [^ ] (除 <Tab> 和 <Space>之外)
    l 小写字母 [a-z]
    L 非小写字母 [^a-z]
    u 大写字母 [A-Z]
    U 非大写字母 [^A-Z]

    Sed相关操作

    1.指令

    a 在当前行下面插入文本。
    i 在当前行上面插入文本。
    c 把选定的行改为新的文本。
    d 删除,删除选择的行。
    D 删除模板块的第一行。
    s 替换指定字符
    h 拷贝模板块的内容到内存中的缓冲区。
    H 追加模板块的内容到内存中的缓冲区。
    g 获得内存缓冲区的内容,并替代当前模板块中的文本。
    G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
    l 列表不能打印字符的清单。
    n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
    N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
    p 打印模板块的行。
    P(大写) 打印模板块的第一行。
    q 退出Sed。
    b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
    r file 从file中读行。
    t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
    T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
    w file 写并追加模板块到file末尾。  
    W file 写并追加模板块的第一行到file末尾。  
    ! 表示后面的命令对所有没有被选定的行发生作用。  
    = 打印当前行号码。  
    # 把注释扩展到下一个换行符以前。  

    2.替换标记

    g 表示行内全面替换。  
    p 表示打印行。  
    w 表示把行写入一个文件。  
    x 表示互换模板块中的文本和缓冲区中的文本。  
    y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
    1 子串匹配标记
    & 已匹配字符串标记

    3.元字符集

    ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
    $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
    . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
    * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。  
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
    (..) 匹配子串,保存匹配的字符,如s/(love)able/1rs,loveable被替换成lovers。
    & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
    < 匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
    > 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
    x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
    x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
    x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

    4.示例

    sed 's/book/books/' file    # 字符串替换

    sed -n 's/test/TEST/p' file                    # 只打印那些发生替换的行

    sed -i 's/book/books/g' file # 替换源文件
    sed 's/book/books/g' file   # 全局替换
    echo sksksksksksk | sed 's/sk/SK/3g' # 从第三个开始替换
    sed '/^$/d' file    # 删除空行
    sed '2d' file   # 删除第2行
    sed '2,$d' file   # 删除第2行至文件末尾
    sed '$d' file  # 删除最后一行
    sed '/^test/d' file   # 删除以test开头的行
    echo this is a test line | sed 's/w+/[&]/g'  # 匹配单词,替换成[单词]的形式
    sed 's/^192.168.0.1/&localhost/' file  # 把以192.168.0.1开头的行替换为192.168.0.1localhost
    echo this is digit 7 in a number | sed 's/digit ([0-9])/1/' # 把digit 7替换为7
    echo aaa BBB | sed 's/([a-z]+) ([A-Z]+)/2 1/'  # 交换aaa和BBB的位置
    sed -n 's/(love)able/1rs/p' file   # 匹配loveable,替换为lovers,并打印出来这些替换的行
    sed '表达式' | sed '表达式'   # 多个sed通过管道连接
    sed -n '/test/,/check/p' file  # 打印test到check直接的行
    sed -n '5,/^test/p' file # 打印从第5行开始,到第一个以test开始之间的所有行
    sed '/test/,/west/s/$/aaa bbb/' file # 把test到west之间的行的末尾替换成aaa bbb
    sed -e '1,5d' -e 's/test/check/' file  # 先删除第1行到第5行,再把test替换为check

    awk相关操作

    1. 内建变量

    $0 当前记录(这个变量中存放着整个行的内容)
    $1~$n 当前记录的第n个字段,字段间由FS分隔
    FS 输入字段分隔符 默认是空格或Tab
    NF 当前记录中的字段个数,就是有多少列
    NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
    FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
    RS 输入的记录分隔符, 默认为换行符
    OFS 输出字段分隔符, 默认也是空格
    ORS 输出的记录分隔符,默认为换行符
    FILENAME 当前输入文件的名字

    2.示例

    awk'BEGIN{FS=":"} {print $1,$3,$6}'OFS=" " /etc/passwd    # 在处理前设置使用:作为分隔符,对/etc/passwd打印第1、3、6列

    awk'$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'OFS=" "netstat.txt     # 匹配第6列不包含WAIT的行,并打印行号、第4、5、6列

    awk'NR!=1{print > $6}'netstat.txt   # 按第6列的名字进行文件拆分

    ls-l  *.py | awk'{sum+=$5} END {print sum}'  # 统计python文件的总大小

    psaux | awk'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}'  # 统计每个用户进程占用内存的大小

    awk'length>80'file  # 获取长度大于80的行
    netstat-ntu | awk'{print $5}'cut-d: -f1 | sortuniq-c | sort-nr    # 按连接数查看客户端IP

    grep相关操作

    grep 'nos_client' -nr .     # n表示打印行号,r表示递归查找

    grep -noE 'gm_client.[a-zA-Z_]+' vhttpservice.py     # E表示使用正则表达式匹配,o表示仅打印匹配结果

    $grep -C 5 'parttern' inputfile //打印匹配行的前后5行
     
    $grep -A 5 'parttern' inputfile //打印匹配行的后5行
     
    $grep -B 5 'parttern' inputfile //打印匹配行的前5行
  • 相关阅读:
    yii2之依赖注入与依赖注入容器
    MySQL查询性能优化
    MySQL索引(2)
    go es
    es数据操作入门
    es环境搭建
    gRPC接入etcd
    etcd简单介绍
    Go调用NSQ简单实践
    NSQ快速入门实践
  • 原文地址:https://www.cnblogs.com/cangqiongbingchen/p/9760544.html
Copyright © 2011-2022 走看看