zoukankan      html  css  js  c++  java
  • Linux文本处理工具和正则表达式

    文本处理工具和正则表达式
    1.vi和vim
    vi:Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大
    vim:VIsual editor iMproved ,和 vi 使用方法一致,但功能更为强大,不是必备软件

    vim命令格式:
    vim [OPTION]... FILE...
    +# 打开文件后,让光标处于第#行的行首,+默认行尾
    +/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
    -b file 二进制方式打开文件
    -d file1 file2… 比较多个文件,相当于 vimdiff
    -m file 只读打开文件
    -e file   直接进入ex模式,相当于执行ex file
    如果该文件存在,文件被打开并显示内容
    如果该文件不存在,当编辑后第一次存盘时创建它

    vim三种主要模式转换:
    命令模式 插入模式 扩展插入模式
    命令模式到插入模式:
    i insert, 在光标所在处输入
    I 在当前光标所在行的行首输入
    a append, 在光标所在处后面输入
    A 在当前光标所在行的行尾输入
    o 在当前光标所在行的下方打开一个新行
    O 在当前光标所在行的上方打开一个新行
    插入模式 --- ESC-----> 命令模式
    命令模式 ---- : ----> 扩展命令模式
    扩展命令模式 ----ESC,enter----> 命令模式

    扩展命令模式
    按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧
    扩展命令模式基本命令:
    w 写(存)磁盘文件
    wq 写入并退出
    x 写入并退出
    X  加密
    q 退出
    q! 不存盘退出,即使更改都将丢失
    r   filename 读文件内容到当前文件中
    w   filename 将当前文件内容写入另一个文件
    !command 执行命令
    r!command 读入命令的输出

    地址定界:
    格式:start_pos,end_pos cmd
    # 具体第#行,例如2表示第2行
    #,# 从左侧#表示起始行,到右侧#表示结尾行
    #,+# 从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
    .   当前行
    $ 最后一行
    .,$-1 当前行到倒数第二行
    % 全文, 相当于1,$
    地址定界后跟一个编辑命令:
    d       删除
    y 复制
    w file: 将范围内的行另存至指定文件中
    r file:在指定位置插入指定文件中的所有内容

    查找并替换:
    格式: s/要查找的内容/替换为的内容/修饰符

    vim配置特性:
    配置文件:永久有效
    全局: /etc/vimrc
    个人: ~/.vimrc
    扩展命令模式:当前vim进程有效


    行号:
    显示: set number, 简写 set nu
    取消显示:set nonumber, 简写 set nonu
    忽略字符的大小写
    启用:set ignorecase, 简写 set ic
    不忽略:set noic
    自动缩进
    启用:set autoindent, 简写 set ai
    禁用:set noai
    复制保留格式
    启用:set paste
    禁用:set nopaste
    显示Tab和换行符 ^I 和$显示
    启用:set list
    禁用:set nolist
    高亮搜索
    启用:set hlsearch
    禁用:set nohlsearch
    语法高亮
    启用:syntax on
    禁用:syntax off
    文件格式
    启用windows格式:set fileformat=dos
    启用unix格式: set fileformat=unix
    简写 set ff=dos|unix
    设置文本宽度
    set textwidth=65 (vim only)
    set wrapmargin=15
    设置光标所在行的标识线
    启用:set cursorline,简写 set cul
    禁用:set nocursorline
    加密
    启用: set key=password
    禁用: set key=
    了解更多
    set 帮助
    :help option-list
    :set or :set all

    命令模式:(Normal模式)
    命令模式功能强大,只是按键时,看不到输入,所以需要大量的记忆才能更好的使用。
    退出VIM:
    ZZ 保存退出
    ZQ 不保存退出

    光标跳转:
    字符间跳转:
    h: 左 L: 右 j: 下 k: 上
    #COMMAND:跳转由#指定的个数的字符
    单词间跳转:
    w:下一个单词的词首
    e:当前或下一单词的词尾
    b:当前或前一个单词的词首
    #COMMAND:由#指定一次跳转的单词数
    当前页跳转:
    H:页首 M:页中间行 L:页底
    zt:将光标所在当前行移到屏幕顶端
    zz:将光标所在当前行移到屏幕中间
    zb:将光标所在当前行移到屏幕底端
    行首行尾跳转:
    ^ 跳转至行首的第一个非空白字符
    0 跳转至行首
    $ 跳转至行尾
    行间移动:
    #G 或者扩展命令模式下:# 跳转至由第#行
    G 最后一行
    1G, gg 第一行
    句间移动:(有逗号为一句)
    ) 下一句 ( 上一句
    段落间移动:(有空行为一段落)
    } 下一段 { 上一段
    命令模式翻屏操作
    Ctrl+f 向文件尾部翻一屏
    Ctrl+b 向文件首部翻一屏
    Ctrl+d 向文件尾部翻半屏
    Ctrl+u 向文件首部翻半屏

    字符编辑
    x 删除光标处的字符(相当于剪切,只剪切最后一个字符)
    #x 删除光标处起始的#个字符
    xp 交换光标所在处的字符及其后面字符的位置(p为粘贴)
    ~ 转换大小写
    J 删除当前行后的换行符

    替换命令(replace)
    r 只替换光标所在处的一个字符
    R 切换成REPLACE模式,按ESC回到命令模式

    删除命令(delete)(相当于剪切命令)
    d 删除命令,可结合光标跳转字符,实现范围删除
    d$ 删除到行尾
    d^ 删除到非空行首
    d0 删除到行首
    dw
    de
    db
    #COMMAND
    dd: 删除光标所在的行
    #dd 多行删除
    D: 从当前光标位置一直删除到行尾,等同于d$

    复制命令(yank)
    y 复制,行为相似于d命令
    y$
    y0
    y^
    ye
    yw
    yb
    #COMMAND
    yy:复制行
    #yy 复制多行
    Y: 复制整行

    粘贴命令(paste)
    p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
    P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面

    改变命令(change) 模式会切换
    c: 删除后切换成插入模式
    c$
    c^
    c0
    cb
    ce
    cw
    #COMMAND
    cc:删除当前行并输入新内容,相当于S
    #cc
    C: 删除当前光标到行尾,并切换成插入模式,相当于c$

    查找
    /PATTERN:从当前光标所在处向文件尾部查找
    ?PATTERN:从当前光标所在处向文件首部查找
    n: 与命令同方向
    N: 与命令反方向

    撤消更改
    u 撤销最近的更改,相当于windows中Ctrl+z
    #u 撤销之前多次更改
    U 撤消光标落在这行后所有此行的更改
    Ctrl - r 重做最后的“撤消”更改,相当于windows中Ctrl+y
    . 重复前一个操作
    #. 重复前一个操作#次
    100 i wang wang粘贴100次(i进出插入模式)

    高级用法:<start position><command><end position>
    常见Command:y 复制、d 删除、gU 变大写、gu 变小写
    0y$ 命令
    0 → 先到行头
    y → 从这里开始拷贝
    $ → 拷贝到本行最后一个字符

    di" 光标在”“之间,则删除”“之间的内容
    yi( 光标在()之间,则复制()之间的内容
    vi[ 光标在[]之间,则选中[]之间的内容
    dtx 删除字符直到遇见光标之后的第一个 x 字符
    ytx 复制字符直到遇见光标之后的第一个 x 字符

    可视化模式
    在末行“--VISUAL--”指示,表示可视化模式
    v 面向字符(可选中光标字符)
    V 面向整行(可选中光标所在整行)
    ctrl-v 面向块 (可选中光标所在的矩形)
    可视化键可用于与移动键结合使用
    w ) } 箭头等
    突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

    多文件模式
    vim FILE1 FILE2 FILE3 ...
    :next 下一个
    :prev 前一个
    :first 第一个
    :last 最后一个
    :wall 保存所有
    :qall 不保存退出所有
    :wqall保存退出所有

    多窗口模式
    多文件分割:
    vim -o|-O FILE1 FILE2 ...
    -o: 水平或上下分割
    -O: 垂直或左右分割(vim only)
    在窗口间切换:Ctrl+w, Arrow
    单文件窗口分割
    Ctrl+w,s:split, 水平分割
    Ctrl+w,v:vertical, 垂直分割
    ctrl+w,q:取消相邻窗口
    ctrl+w,o:取消全部窗口
    :wqall 退出

    vim的寄存器:
    有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享
    寄存器名称a,b,…,z,格式:“寄存器 放在数字和命令之间
    3"tyy 表示复制3行到t寄存器中
    "tp 表示将t寄存器内容粘贴
    10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更
    和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享

    标记和宏:(记录操作执行录制操作)
    ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
    'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
    qa 录制宏 a,a为宏的名称
    q 停止录制宏
    @a 执行宏 a
    @@ 重新执行上次执行的宏

    编辑二进制文件:
    #以二进制方式打开文件
    vim -b binaryfile
    #扩展命令模式下,利用xxd命令转换为可读的十六进制
    :%!xxd
    #插入模式下,编辑二进制文件
    #扩展命令模式下,利用xxd命令转换回二进制
    :%!xxd -r
    #保存退出

    帮助:
    :help
    :help topic
    Use :q to exit help

    文本常见处理工具:

    查看文本文件内容
    cat 可以查看文本内容
    -E:显示行结束符$
    -A:显示所有控制符
    -n:对显示出的每一行进行编号
    -b:非空行编号
    -s:压缩连续的空行成一行
    cat [OPTION]... [FILE]...

    tac 逆向显示文本内容
    nl 显示行号,相当于cat -b
    rev 将同一行的内容逆向显示
    (都支持标准输入)

    查看非文本文件内容:
    hexdump -C
    od -t x
    xxd

    分页查看文件内容
    more 可以实现分页查看文件,可以配合管道实现输出信息的分页
    -d: 显示翻页及退出提示
    less 也可以实现分页查看文件或STDIN输出
    /文本 搜索 文本
    n/N 跳到下一个 或 上一个匹配
    less 命令是man命令使用的分页器

    显示文本前或后行内容
    head 可以显示文件或标准输入的前面行(默认前十行)
    -c # 指定获取前#字节
    -n # 指定获取前#行
    -# 同上
    tail 和head 相反,查看文件或标准输入的倒数行
    -c # 指定获取后#字节
    -n # 指定获取后#行
    -# 同上
    -f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文
    件,将无法继续跟踪文件
    -F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

    tail -f /var/log/messages
    logger 生成日志
    dmesg 监控事件

    按列抽取文本
    cut 命令可以提取文本文件或STDIN数据的指定列
    -d DELIMITER: 指明分隔符,默认tab
    -f FILEDS:
    #: 第#个字段,例如:3
    #,#[,#]:离散的多个字段,例如:1,3,6
    #-#:连续的多个字段, 例如:1-6
    混合使用:1-3,7
    -c 按字符切割
    --output-delimiter=STRING指定输出分隔符

    合并多个文件:
    paste 合并多个文件同行号的列到一行
    -d 分隔符:指定分隔符,默认用TAB
    -s : 所有行合成一行显示

    分析文本的工具
    收集文本统计数据
    wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数
    可以对文件或STDIN中的数据统计
    -l 只计数行数
    -w 只计数单词总数
    -c 只计数字节总数
    -m 只计数字符总数
    -L 显示文件中最长行的长度

    文本排序sort
    把整理过的文本显示在STDOUT,不改变原始文件
    -r 执行反方向(由上至下)整理
    -R 随机排序
    -n 执行按数字大小整理
    -f 选项忽略(fold)字符串中的字符大小写
    -u 选项(独特,unique)删除输出中的重复行
    -t c 选项使用c做为字段界定符
    -k # 选项按照使用c字符分隔的 # 列来整理能够使用多次

    去重uniq
    uniq命令从输入中删除前后相接的重复的行(必须是连续的)
    -c: 显示每行重复出现的次数
    -d: 仅显示重复过的行
    -u: 仅显示不曾重复的行

    比较文件
    diff 命令比较两个文件之间的区别
    -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
    patch 复制在其它文件中进行的改变(要谨慎使用)
    适用 -b 选项来自动备份改变了的文件(原文件文件名会加.orig 后缀)
    cmp 命令查看二进制文件的不同

    正则表达式
    REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
    不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,与通配符不通,通配符用来处理文件名,正则表达式用来处理文本文件内容中的字符
    正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
    正则表达式分两类:
    基本正则表达式:BRE
    扩展正则表达式:ERE
    正则表达式引擎:
    采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
    Expressions)
    正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
    帮助:man 7 regex
    字符匹配
    .   匹配任意单个字符
    []   匹配指定范围内的任意单个字符,示例:[wang]   [0-9]   [a-z]   [a-zA-Z]
    [^] 匹配指定范围外的任意单个字符,示例:[^wang]
    [:alnum:] 字母和数字
    [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
    [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
    [:upper:] 大写字母
    [:blank:] 空白字符(空格和制表符)
    [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
    [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
    [:digit:] 十进制数字
    [:xdigit:]十六进制数字
    [:graph:] 可打印的非空白字符
    [:print:] 可打印字符
    [:punct:] 标点符号

    次数匹配
    * 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
    .* 任意长度的任意字符
    \? 匹配其前面的字符0或1次,即:可有可无
    \+ 匹配其前面的字符至少1次,即:肯定有,>=1
    \{n\} 匹配前面的字符n次
    \{m,n\} 匹配前面的字符至少m次,至多n次
    \{,n\} 匹配前面的字符至多n次,<=n
    \{n,\} 匹配前面的字符至少n次

    位置锚定
    位置锚定可以用于定位出现的位置
    ^ 行首锚定,用于模式的最左侧
    $ 行尾锚定,用于模式的最右侧
    ^PATTERN$ 用于模式匹配整行
    ^$ 空行
    ^[[:space:]]*$ 空白行
    \< 或 \b 词首锚定,用于单词模式的左侧
    \> 或 \b 词尾锚定,用于单词模式的右侧
    \<PATTERN\> 匹配整个单词

    单词边界:除了字母数字下划线都是单词边界

    分组其它
    \( \) 分组
    后向引用:\1, \2, ...
    \| 或者
    a\|b #a或b
    C\|cat #C或cat
    \(C|\c)at #Cat或cat

    扩展正则表达式
    . 任意单个字符
    [wang] 指定范围的字符
    [^wang] 不在指定范围的字符
    [:alnum:] 字母和数字
    [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
    [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
    [:upper:] 大写字母
    [:blank:] 空白字符(空格和制表符)
    [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
    [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
    [:digit:] 十进制数字
    [:xdigit:]十六进制数字
    [:graph:] 可打印的非空白字符
    [:print:] 可打印字符
    [:punct:] 标点符号

    次数匹配
    *   匹配前面字符任意次
    ? 0或1次
    + 1次或多次
    {n} 匹配n次
    {m,n} 至少m,至多n次

    位置锚定
    ^ 行首
    $ 行尾
    \<, \b 语首
    \>, \b 语尾

    分组其它
    () 分组
    后向引用:\1, \2, ...
    | 或者
    a|b #a或b
    C|cat #C或cat
    (C|c)at #Cat或cat

    文本处理三剑客之 grep
    grep [OPTIONS] PATTERN [FILE...]
    作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
    模式:由正则表达式字符及文本字符所编写的过滤条件
    egrep 默认扩展正则表达式
    grep 默认正则表达式
    --color=auto 对匹配到的文本着色显示
    -m # 匹配#次后停止
    -v 显示不被pattern匹配到的行
    -i 忽略字符大小写
    -n 显示匹配的行号
    -c 统计匹配的行数
    -o 仅显示匹配到的字符串
    -q 静默模式,不输出任何信息
    -A # after, 后#行
    -B # before, 前#行
    -C # context, 前后各#行
    -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file
    -w 匹配整个单词
    -E 使用ERE,相当于egrep
    -F 相当于fgrep,不支持正则表达式
    -f file 根据模式文件处理
    -r 递归目录,但不处理软链接
    -R 递归目录,但处理软链接

    文本处理三剑客之 sed
    sed 工作原理:sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
    Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到
    最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern
    Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下
    一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时
    不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为
    vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,
    打开速度非常快,执行速度也很快

    sed 基本用法
    格式:
    sed [option]... 'script;script;...' inputfile...

    常用选项:
    -n 不输出模式空间内容到屏幕,即不自动打印
    -e 多点编辑
    -f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
    -r, -E 使用扩展正则表达式
    -i.bak 备份文件并原处编辑

    script格式:
    '地址命令'

    地址格式:
    1. 不给地址:对全文进行处理
    2. 单地址:
      #:指定的行,$:最后一行
      /pattern/:被此处模式所能够匹配到的每一行
    3. 地址范围:
      #,#     #从#行到第#行,3,6 从第3行到第6行
      #,+#   #从#行到+#行,3,+4 表示从3行到第7行
      /pat1/,/pat2/
      #,/pat/
    4. 步进:~
      1~2 奇数行
      2~2 偶数行

    命令:
    p 打印当前模式空间内容,追加到默认输出之后
    Ip 忽略大小写输出
    d 删除模式空间匹配的行,并立即启用下一轮循环
    a [\\]text 在指定行后面追加文本,支持使用\n实现多行追加
    i [\\]text 在行前面插入文本
    c [\\]text 替换行为单行或多行文本
    w /path/file 保存模式匹配的行至指定文件
    r /path/file 读取指定文件的文本至模式空间中匹配到的行后
    = 为模式空间中的行打印行号
    ! 模式空间中匹配行取反处理
    s/pattern/string/ 修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###替换修饰符:
    g 行内全局替换
    p 显示替换成功的行
    w   /PATH/FILE 将替换成功的行保存至文件中
    I,i  忽略大小写

  • 相关阅读:
    异常详细信息: System.InvalidCastException: 对象不能从 DBNull 转换为其他类型——的解决方法
    .net显示今天农历的代码!
    在GridView中设置日期格式
    安装VS 2008 SP1后,智能提示变为英文的补丁发布
    SQL server无法执行查询,因为一些文件丢失或未注册等问题的解决
    SQL Server 2000企业管理器中MMC无法创建管理单元的解决方法
    FILTER:progid:DXImageTransform.Microsoft.Gradient使用
    [jQuery] event.stopPropagation()报错
    得到系统当前的dpi设置值
    VS2008 当前不会命中断点,还没有为该文档加载任何符号
  • 原文地址:https://www.cnblogs.com/llliuhuiii/p/12728420.html
Copyright © 2011-2022 走看看