第5章:文本处理工具

文本查看、文本处理

复制代码
cat、tac、rev
======================================================================
cat 用于连接文件并打印到标准输出设备上。
    -n 或 --number:由 1 开始对所有输出的行数编号。
    -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
    -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
    -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
    -E 或 --show-ends : 在每行结束处显示 $。
    -T 或 --show-tabs: 将 TAB 字符显示为 ^I。
    -A, --show-all:等价于 -vET。
    -e:等价于"-vE"选项;
    -t:等价于"-vT"选项;

tac 查看文件内容(按行翻转文件内容,即最后一行显示在第一行)
rev 左右岸字符翻转行的内容(示例:abc,使用rev查看,显示为cba)
cat、tac、rev
复制代码
复制代码
more、less、head、tail、tailf
======================================================================
more 分页查看文件内容
    ls -R /etc/ |more

--------------------------------------------------
less 分页查看文件内容(less命令是man命令使用的分页器)
    -N 显示行号

    less页面的操作方法
        向下翻屏:      空格键,^v;^f;^F    (^v=ctrl+v)
        向上翻屏:      b;^b
        向上翻半屏:    d;^d
        向下翻半屏:    u;^u;
        向下翻行:      ^N;e;^E;j;^J
        向上翻行:      y;^Y;^P;k;^K
        退出:          q
        跳转到指定行:  #
        回到文件首页:  1G
        翻至文件尾部:  G
        搜索关键字      /keyword
        下一个被搜索的关键字   n
        上一个被搜索的关键字   N
        搜索关键字      ?keyword (功能同/搜索,但方向相反)

--------------------------------------------------
head 默认查看文件前10行内容
    -n 查看前指定数量行,例如 -n 5;-n5;-5
    -c 查看前指定数量字节
    -number   查看指定前几行

--------------------------------------------------
tail 默认查看文件后10行内容
    -n 同head
    -c 同head
    -f 跟踪文件尾部的变化,常用于日志监控,相当于--follow=descriptor
    -F 跟踪文件名

--------------------------------------------------
tailf命令  类似tail -f
more、less、head、tail、tailf
复制代码
复制代码
cut、paste、wc、sort、uniq
======================================================================
按列抽取文本cut、合并文件paste

cut 按列切割
    -d 指定分隔符 
    -f 指定哪列,多列用逗号
    -c 按字符切割
    --output-delimiter=STRING  指定输出分隔符

    cut -d":" -f1,3,5 /etc/passwd   #指定分隔符,查看1,3,5列
    cut -d":" -f3-5 /etc/passwd     #指定分隔符,查看3-5列
    cut -d":" -f1,4 --output-delimiter="***" /etc/passwd   #切割时,指定分隔符":",输出时,显示分隔符"***"

--------------------------------------------------
paste 命令用于合并文件的列。把每个文件以列对列的方式,一列列地加以合并。
    -d<间隔字符>或--delimiters=<间隔字符>  用指定的间隔字符取代跳格字符。默认分隔符为tab
    -s或--serial  串列进行而非平行处理。
    --help  在线帮助。
    --version  显示帮助信息。

--------------------------------------------------
wc命令用于计算字数。wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
    -c或--bytes或--chars 只显示Bytes数。
    -l或--lines 显示行数。
    -w或--words 只显示字数。

    wc file         #默认显示行数,单词数,总bytes数,文件名
    wc -c f2        #显示总bytes数,文件名
    wc -l f2        #显示行数,文件名
    wc -w f2        #显示单词数,文件名

--------------------------------------------------
sort命令用于将文本文件内容加以排序。针对文本文件的内容,以行为单位来排序。
    -b 忽略每行前面开始出的空格字符。
    -c 检查文件是否已经按照顺序排序。
    -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
    -f 排序时,将小写字母视为大写字母。
    -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
    -m 将几个排序好的文件进行合并。
    -M 将前面3个字母依照月份的缩写进行排序。
    -n 依照数值的大小排序。
    -u 意味着是唯一的(unique),输出的结果是去完重了的。
    -o<输出文件> 将排序后的结果存入指定的文件。
    -r 以相反的顺序来排序。
    -R 随机排序
    -k numbet #-t指定的分隔符分割后,按照-k指定的列数进行排序
    -t<分隔字符> 指定排序时所用的栏位分隔字符。
    +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

    sort -t: -k3 /etc/passwd        #指定分隔符":",按照第3列进行排序,默认是按照首字符的ascii码表进行排序
    sort -t: -k3 -n /etc/passwd     #指定分隔符":",按照第3列进行排序,按照数值大小进行排序

--------------------------------------------------
uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
    -c或--count 在每列旁边显示该行重复出现的次数。
    -d或--repeated 仅显示重复出现的行列。
    -u或--unique 仅显示出一次的行列。
    -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
    -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
    -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。

    sort test.txt | uniq -c
    cat xxxx |cut -f1 |sort -n |uniq -c
cut、paste、wc、sort、uniq
复制代码
复制代码
diff、patch
======================================================================
diff命令用于比较文件的差异。
diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
    -u,-U<列数>或--unified=<列数>  以合并的方式来显示文件内容的不同。

--------------------------------------------------
patch命令用于修补文件。
patch让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。

    diff -u f1 f2 > diff.log      #比较f1 f2文件的不同点,保存到diff.log中
    rm -f f1                      #文件f1丢失
    patch -b f2 diff.log          #根据diff.log进行文件修补,找回丢失的f1文件;命令结束后,f2文件为原f1文件,f2.orig文件为原f2文件
diff、patch
复制代码

 

复制代码
hexdump主要用来查看“二进制”文件的十六进制编码。*注意:它能够查看任何文件,不限于与二进制文件。*
    -n length:格式化输出文件的前length个字节
    -C:输出规范的十六进制和ASCII码
    -b:单字节八进制显示
    -c:单字节字符显示
    -d:双字节十进制显示
    -o:双字节八进制显示
    -x:双字节十六进制显示
    -s:从偏移量开始输出

    hexdump -C file             #cat是不能查看数据文件的,可以查看ASCII text;可以用file命令判断文件的类型
hexdump
复制代码

 

文本编辑器:vi/vim命令

其他编辑器(了解):nano;图形界面编辑器:gedit,gvim

复制代码
vim命令
==========================================================================================
vim [options] [file ..]
    +[num]      #打开文件后,光标移动到指定行行首;+默认行尾
    +/{pat}     #打开文件后,光标移动到第一个被pat匹配到的行的行首
    -b          #二进制方式打开文件
    -d          #比较多个文件
    -m          #只读方式打开文件

    示例: vim filename       #当文件不存在时,会自动创建该文件
vim命令
复制代码

vim的三种模式:普通模式、扩展命令模式、编辑模式

复制代码
vim普通模式:文本查看、编辑操作(复制、粘贴、删除等)、退出vim界面
==========================================================================================
以vi打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或删除整行来处理文件内容, 也可以使用复制、粘贴来处理你的文件数据。

返回普通模式:ESC
------------------------------------------------------------------------------------------
移动光标:
    按单词移动光标:
    w          光标移动到下一个单词的词首
    e          光标移动到当前or下一个单词的词尾
    b          光标移动到当前or下一个单词的词首
    当前页跳转:
    H          光标移动到页首
    M          光标移动到页中间行
    L          光标移动到页底
    行首行尾跳转:
    0           光标移动到当前行首
    ^           光标移动到行首第一个非空白字符
    $           光标移动到当前行尾(windows shift会切换输入法,不好用!)
    行间移动:
    G(shift+g)  光标移动到文件尾行
    gg          光标移动到文件首行(等价于1gg)
    数字gg      光标移动到指定行
    句间移动
    (、)
    段落间移动
    {、}
    翻屏操作:
    ctrl+f      向尾部翻一屏
    ctrl+b      向首部翻一屏
    ctrl+d      向尾部翻半屏
    ctrl+u      向首部翻半屏
    拓展:数字+动作
    例如5右箭头:光标往右移动5个字符;5w:光标往右移动到第5个词语的词首

------------------------------------------------------------------------------------------
编辑操作(复制、粘贴、删除等):
   yy       复制光标所在的当前行内容
   nyy      复制光标所在行往下的n行内容
   p        将已复制的内容粘贴到光标的下一行
   P        将已复制的内容粘贴到光标的上一行(视觉效果:复制内容挤占了当前行,光标以下的内容全部下移一行)
   dd       剪切光标所在的当前行内容
   ndd      剪切多行内容(往下剪切)
   u        回滚操作
   ctrl+r   撤销上一个回滚操作,即向前回滚
   .        重复执行上一个动作(不是向前回滚操作!)
   x        向后删除字符(其实是剪切)
   X        向前删除字符
   d1G      删除当前行至第一行
   dG       删除当前行至最后一行
   d0       删除文本,当前光标到行首
   d$       删除文本,当前光标到行尾
   ~        转换大小写
   J        删除当前行后的换行符
   r        替换一个字符
   R        切换到repalce模式

------------------------------------------------------------------------------------------
ZZ 保存并退出
ZQ 不保存退出
vim普通模式:文本查看、编辑操作(复制、粘贴、删除等)、退出vim界面
复制代码
复制代码
vim编辑模式
==========================================================================================
在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R】等任何一个字母之后才会进入编辑模式。这时候屏幕的左下方会出现【INSERT或 REPLACE】的字样,此时才可以进行编辑。而如果要回到一般模式时, 则必须要按下【Esc】即可退出编辑模式。

进入编辑模式:
   i 插入*****
   A 追加 行尾插入
   o 下一行开头插入
   O 上一行开头插入
   a 光标下一个字符插入

vim内容输出时携带颜色
达到类似echo -e "\e[1;31mred\e[0m"的效果
在编辑模式下 输入^[[1;31mred^[[0m,其中“^[”的输入手法:ctrl+v然后再按ctrl+[]
    vim中的^[ 相当于echo中的\e,也相当于\033
vim编辑模式
复制代码
复制代码
vim扩展命令模式:查找、读取、存盘、替换字符、离开vi、显示行号等的动作
==========================================================================================

输入【 : / ? 】三个中的任何一个,就可以将光标移动到最底下那一行。在这个模式中, 可以提供查找、读取、存盘、替换字符、离开vi、显示行号等的动作则是在此模式中完成的!

vim界面执行shell命令行命令
   :!command  示例:(:!cat test.txt)
------------------------------------------------------------------------------------------
保存与退出vim
   :wq    退出并保存
   :wq!    退出并强制保存,“!”为强制的意思
   :q!    强制退出,不保存
------------------------------------------------------------------------------------------
显示行号与取消显示行号
   :set nu    显示行号
   :set nonu    与set nu相反,取消行号
------------------------------------------------------------------------------------------
搜索操作:
   /word      从光标位置开始,向下搜索指定word;示例:/3306 继续搜 按n,反向搜N
   ?word      向上搜索(与/word功能相同,但搜索方向相反);示例:?80 继续搜 按n,反向搜N
   n          执行上一次的搜索操作;上次为/搜索,那么n=/搜索;上次为?搜索,那么n=?搜索
   N          与n相反
------------------------------------------------------------------------------------------
地址定界
    num1            第num1行
    num1,num2       从第num1行开始,到num2行接收
    num1,+num2      从第num1行开始,包含之后的num2行
    .               当前行
    $               最后一行
    .,$-1           当前行到倒数第二行
    1,$             全文
    %               全文,相当于1,$
    /pat1/,/pat2/   从第一个被pat1匹配到的行开始,到第一个被pat2匹配到的行为止
    num1,/pat2/ 
    /pat1/,num2
    /pat1/,$

替换操作:(s是替换 g表示全局(所有))
   :%s/A/B/g        把符合A的内容替换为B。(/为分隔符,可以用@、#等替代)
      示例:(:%s/world/oldgirl/g)(:%s#world#oldgirl#g)
      :g/A/s//B/g 这个也是将A替换为B
   :n1,n2s/A/B/g    把符合A的内容替换为B(不是全文替换,而是指定n1,n2行之间内容进行替换)。
      :n1,n2s/A/B/gc  添加c之后需要逐个进行确认后才进行替换
      :%s/A/B/    不加g也能全局替换嘛,那么g到底什么用的呢?
    引用符号:\1、\2、...、&
    修饰符:i(忽略大小写);g(全局替换);gc(全局替换,每次替换前询问)
------------------------------------------------------------------------------------------
移动or保存文件部分内容
   :n1,n2 w filename     将指定行内容保存为filename这个文件
   :n1,n2 co n3          将指定行内容拷贝到n3位置下
   :n1,n2 m n3           将制定行内容移动到n3位置下
------------------------------------------------------------------------------------------
分屏显示
   :vs filename      垂直分屏显示(左右2块屏幕)
   :sp filename      水平分屏显示(上下2块屏幕)
vim扩展命令模式:查找、读取、存盘、替换字符、离开vi、显示行号等的动作
复制代码
复制代码
vim的寄存器
    有26个命名寄存器和1个无命名寄存器,长存放不同的剪切板内容,可以在不同会话间共享(即跨越不同终端进行复制粘贴)
    寄存器名称abc..z,格式: "寄存器  放在数字和命令之间
        例如:3"tyy 表示复制3行到t寄存器中;"tp 表示将t寄存器的内容进行粘贴
    未指定则使用无命名寄存器
    有10个数字寄存器,用0123456789表示,0存放最近复制的内容,1存放最近删除的内容。
    当心的文本变更和删除时,1转存到2,2转存到3,一次类推。数字寄存器不能在不同会话间共享
vim的寄存器
复制代码
复制代码
定制vim的工作特性与.vimrc文件

配置文件:
    全局:/etc/vimrc
    个人:~/.vimrc


Vim 启动时,会根据配置文件(.vimrc)来设置 Vim
Vim 配置文件分为系统配置文件和用户配置文件:
    系统配置文件位于 Vim 的安装目录(默认路径为 /etc/.vimrc);
    用户配置文件位于主目录 ~/.vimrc,即通过执行 vim ~/.vimrc 命令即可对此配置文件进行合理修改。通常情况下,Vim 用户配置文件需要自己手动创建。
 
https://www.cnblogs.com/xnqc1314/p/8692993.html
定制vim的工作特性与.vimrc文件
复制代码
复制代码
[root@yefeng ~]# cat .vimrc
""=========================================================================
"
""CRiption: 适合自己使用的vimrc文件,for Linux/Windows, GUI/Console
"
""=========================================================================
syntax on "自动语法高亮
"winpos 5 5          " 设定窗口位置  
"set lines=40 columns=155    " 设定窗口大小  
"set nu              " 显示行号  
set go=             " 不要图形按钮  
"color asmanian2     " 设置背景主题  
set guifont=Courier_New:h10:cANSI   " 设置字体  
"syntax on           " 语法高亮  
"autocmd InsertLeave * se nocul  " 用浅色高亮当前行  
"autocmd InsertEnter * se cul    " 用浅色高亮当前行  
"set ruler           " 显示标尺  
set showcmd         " 输入的命令显示出来,看的清楚些  
"set cmdheight=1     " 命令行(在状态行下)的高度,设置为1  
"set whichwrap+=<,>,h,l   " 允许backspace和光标键跨越行边界(不建议)  
"set scrolloff=3     " 光标移动到buffer的顶部和底部时保持3行距离  
set novisualbell    " 不要闪烁(不明白)  
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}   "状态行显示的内容  
"set laststatus=1    " 启动显示状态行(1),总是显示状态行(2)  
set foldenable      " 允许折叠  
set foldmethod=manual   " 手动折叠  
"set background=dark "背景使用黑色 
set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限  
" 显示中文帮助
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif
" 设置配色方案
"colorscheme murphy
"字体 
"if (has("gui_running")) 
"   set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 
"endif 


 
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
""定义函数SetTitle,自动插入文件头 
func SetTitle() 
    "如果文件类型为.sh文件 
    if &filetype == 'sh' 
        call setline(1,"\#!/bin/bash") 
        call append(line("."), "\#########################################################################") 
        call append(line(".")+1, "\# File Name: ".expand("%")) 
        call append(line(".")+2, "\# Author: yefeng") 
        call append(line(".")+3, "\# mail: 185932437@qq.com") 
        call append(line(".")+4, "\# Created Time: ".strftime("%c")) 
        call append(line(".")+5, "\#########################################################################") 
        call append(line(".")+6, "") 
    else 
        call setline(1,"\#!/bin/bash") 
        call append(line("."), "\*************************************************************************") 
        call append(line("."), "    > File Name: ".expand("%")) 
        call append(line(".")+1, "    > Author: yefeng") 
        call append(line(".")+2, "    > Mail: 185932437@qq.com ") 
        call append(line(".")+3, "    > Created Time: ".strftime("%c")) 
        call append(line(".")+4, " ************************************************************************/") 
        call append(line(".")+5, "")
    endif
 "   if &filetype == 'cpp'
 "       call append(line(".")+6, "#include<iostream>")
 "       call append(line(".")+7, "using namespace std;")
 "       call append(line(".")+8, "")
 "   endif
 "   if &filetype == 'c'
 "       call append(line(".")+6, "#include<stdio.h>")
 "       call append(line(".")+7, "")
 "   endif
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc 
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>


" 映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y
"去空行  
nnoremap <F2> :g/^\s*$/d<CR> 
"比较文件  
nnoremap <C-F2> :vert diffsplit 
"新建标签  
map <M-F2> :tabnew<CR>  
"列出当前目录文件  
map <F3> :tabnew .<CR>  
"打开树状文件目录  
map <C-F3> \be  
"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'java' 
        exec "!javac %" 
        exec "!java %<"
    elseif &filetype == 'sh'
        :!./%
    endif
endfunc
"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"代码补全 
set completeopt=preview,menu 
"允许插件  
filetype plugin on
"共享剪贴板  
set clipboard+=unnamed 
"从不备份  
set nobackup
"make 运行
:set makeprg=g++\ -Wall\ \ %
"自动保存
set autowrite
"set ruler                   " 打开状态栏标尺
set cursorline              " 突出显示当前行
set magic                   " 设置魔术
set guioptions-=T           " 隐藏工具栏
set guioptions-=m           " 隐藏菜单栏
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent 
set foldlevel=3 
set foldenable              " 开始折叠
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 不要用空格代替制表符
set noexpandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的状态行显示的内容(包括文件类型和解码)
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 总是显示状态行
"set laststatus=2
" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
set smartindent
" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile *  setfiletype txt
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction
filetype plugin indent on 
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CTags的设定  
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let Tlist_Sort_Type = "name"    " 按照名称排序  
let Tlist_Use_Right_Window = 1  " 在右侧显示窗口  
let Tlist_Compart_Format = 1    " 压缩方式  
let Tlist_Exist_OnlyWindow = 1  " 如果只有一个buffer,kill窗口也kill掉buffer  
let Tlist_File_Fold_Auto_Close = 0  " 不要关闭其他文件的tags  
let Tlist_Enable_Fold_Column = 0    " 不要显示折叠树  
autocmd FileType java set tags+=D:\tools\java\tags  
"autocmd FileType h,cpp,cc,c set tags+=D:\tools\cpp\tags  
"let Tlist_Show_One_File=1            "不同时显示多个文件的tag,只显示当前文件的
"设置tags  
set tags=tags  
"set autochdir 


""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"默认打开Taglist 
let Tlist_Auto_Open=1 
"""""""""""""""""""""""""""""" 
" Tag list (ctags) 
"""""""""""""""""""""""""""""""" 
let Tlist_Ctags_Cmd = '/usr/bin/ctags' 
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim 
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口
" minibufexpl插件的一般设置
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1 
let g:miniBufExplModSelTarget = 1
.vimrc
复制代码

set paste 之后进行插入操作,vim提示变为: -- INSERT (粘贴) -- 这时就不再有自动换行。
之后,如果要恢复,:set nopaste

 正则表达式BRE/ERE

复制代码
linux正则与通配符的区别、linux正则说明
----------------------------------------------------------------------------------------------------------
正则表达式与通配符的区别:
    最常应用正则表达式的命令是grep(egrep),sed,awk。
    正则表达式和通配符有本质区别:正则匹配的是文件内容;通配符匹配的是文件名
    环境准备:
    export LC_ALL=C   #为了去除所有本地化的设置,让命令能正确执行。

POSIX规范将正则表达式的分为了两种
    基本正则表达式(BRE,basic regular expression)
    扩展正则表达式(ERE,extended regular expression)

BRE和ERE的区别仅仅是元字符的不同
  BRE(基础正则表达式)只承认的元字符有^$.[]*  其他字符识别为普通字符:
  ERE(扩展正则表达式)则添加了(){}?+|等
    只有在用反斜杠“\”进行转义的情况下,字符(){}才会在BRE被当作元字符处理,而BRE中,任何元符号前面加上反斜杠反而会使其被当作普通字符来处理。
linux正则与通配符的区别、linux正则说明
复制代码
复制代码
基础正则表达式BRE
    ^         ^word: 搜索以word开头的内容
    $         word$: 搜索以word结尾的内容
    ^$        表示空行,不是空格
    .         代表且只能代表任意一个字符(不匹配空行)
    \         转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
    *         重复之前的字符或文本0个或多个,之前的文本或字符连续0次或多次
    .*        任意多个字符
    ^.*       以任意多个字符串开头,.*尽可能多,有多少算多少,贪婪性
    [abc]     匹配任意字符a或b或c
    [^abc]    匹配不包含^后的任意字符a或b或c,是对[abc]的取反,且与^含义不同
    a\{n,m\}  重复前面a字符n到m次(如果用egrep或sed -r可去掉斜线)
    \+;\?;等等
    \<或\b      词首锚定,类似^,但用于锁定词首
    \>或\b      词尾锚定,类似$,但用于锁定词尾
    \<pattern\>或\bpattern\b    锁定整个单词
    分组:\(\)将一个或多个字符当做一个整理进行处理
    分组括号中的模式匹配到的内容被正则引擎记录与内部的变量中,这些变量命名为\1、\2、\3、\4、...
        注意:这些变量储存的是匹配到的内容,而不是pattern本身;多级的分组,以左边第一个括号来判断
        示例:echo rootrbbt |grep "\(r..t\)\1"   #此处\1为root,所以匹配无结果
基础正则表达式BRE
复制代码
复制代码
扩展正则表达式ERE
    +            重复前一个字符一次或一次以上,前一个字符连续一个或多个,把连续的文本/字符取出
    ?            重复前面一个字符0次或1次(.是有且只有1个)
    管道符|       表示或者同时过滤多个字符
    ()          分组过滤被括起来的东西表示一个整体(一个字符)
    a{n,m}    匹配前一个字符最少n次,最多m次
    a{n,}    匹配前一个字符最少n次
    a{n}    匹配前一个字符正好n次
    a{,m}    匹配前一个字符最多m次
    \<或\b      词首锚定,类似^,但用于锁定词首
    \>或\b      词尾锚定,类似$,但用于锁定词尾
    \<pattern\>或\bpattern\b    锁定整个单词
    分组:\(\)将一个或多个字符当做一个整理进行处理
    分组括号中的模式匹配到的内容被正则引擎记录与内部的变量中,这些变量命名为\1、\2、\3、\4、...
        注意:这些变量储存的是匹配到的内容,而不是pattern本身;多级的分组,以左边第一个括号来判断
        示例:echo rootrbbt |grep "\(r..t\)\1"   #此处\1为root,所以匹配无结果
扩展正则表达式ERE
复制代码
复制代码
元字符(grep -P可用)
[root@yefeng ~]# echo 1234567abcdefg |grep  \d
    \b        单词边界    \bcool\b匹配cool,不匹配coolant
    \B        非单词边界    cool\B匹配coolant不匹配cool
    \d        单个数字字符    b\db匹配b2b,不匹配bcb
    \D        单个非数字字符    b\Db匹配bcb不匹配b2b
    \w        单个单词字符(字母,数字与_)    \w匹配1或a,不匹配&
    \W        单个非单词字符    \W匹配&,不匹配1或a
    \n        换行符    \n匹配一个新行
    \s        单个空白字符    x\sx匹配xx,不匹配xx
    \S        单个非空白字符    x\S\x匹配xkx,不匹配xx
    \r        回车    \r匹配回车
    \t        横向制表符    \t匹配一个横向制表符
    \v        垂直制表符    \v匹配一个垂直制表符
    \f        换页符    \f匹配一个换页符
元字符(grep -P可用)
复制代码
复制代码
预定义的正则表达式
    [:alnum:]          [a-zA-Z0-9]匹配任意一个字母或数字字符    [[:alnum:]]+
    [:alpha:]          匹配任意一个字母字符(包括大小写字母)    [[:alpha:]]{4}
    [:blank:]          空格与制表符(横向纵向)    [[:blank:]]*
    [:digit:]          匹配任意一个数字字符    [[:digit:]]?
    [:lower:]          匹配小写字母    [[:lower:]]{5,}
    [:upper:]          匹配大写字母    ([[:upper:]]+)?
    [:punct:]          匹配标点符号    [[:punct:]]
    [:space:]          匹配一个包括换行符,回车等在内的所有空白符    [[:space:]]+
    [:graph:]          匹配任何一个可以看得见的且可以打印的字符    [[:graph:]]
    [:xdigit:]        任何一个十六进制数    [[:xdigit:]]+
    [:cntrl:]          任何一个控制字符(ASCII字符集中的前32个字符)    [[:cntrl:]]
    [:print:]          任何一个可以打印的字符    [[:print:]]

    通配符似乎也支持这种预定义的格式
预定义的正则表达式
复制代码

linux中的正则没有python中的小括号那种灵活的用法,若想取出python小括号匹配的内容,那么在linux则是多次使用grep进行过滤

 三剑客:grep[egrep]、sed、awk

grep 文本搜索工具,根据用户指定的'模式'对目标文本逐行进行匹配。
sed 行编辑器:取行,替换,删除,追加
awk 取列

 

复制代码
grep[egrep]命令
============================================================
grep只能使用基础正则表达式BRE。egrep可以使用扩展正则表达式ERE
grep 
    -E extend扩展的grep,即egrep
    -F 相当于fgrep,不支持正则表达式
    -P  Perl正则(python正则和这个很像,-P模式下才能用\d匹配数字)

    -A after显示过滤的字符串和它之后的多少行
    -B before显示过滤的字符串和它之前的多少行
    -C context显示过滤的字符串和它前后的多少行

    --color=auto  过滤的内容加色
    -v invert取反,显示不被pattern匹配到的行
    -i ignore不区分大小写
    -n number对输出的内容显示在源文件中的行号
    -w word按单词为单位过滤
    -o 只显示匹配的内容
    -q 静默模式,不输出任何信息
    -e 同时匹配多个pattern,pattern之间逻辑或关系
    -f 多个pattern存放在文本中,grep使用文件中的多个pattern进行匹配


示例:
    grep old test1.txt
    grep -o  old test1.txt
    grep -E 'aaa|bbb' test1.txt     #匹配aaa或bbb
    grep -f pattern.txt test1.txt
    grep -A4 old test1.txt
        能不用管道就不用管道,因为效率相对较低

    egrep -o "(e)(s)\1\2" oldboy.txt ===== egrep -o "eses" oldboy.txt 
        \1第一个括号     \2 第二个括号
grep[egrep]命令
复制代码

 

复制代码
sed命令与用法
===========================================================================================
Sed stream editor行编辑器,主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
    常用功能有对文件实现快速增删改查(增加、删除、修改、查询),
    其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。

    普通循环:读取一行,执行script,最后清除模式空间;读取下一行,开始下一个循环...
    特殊'D'循环:读取第一行,执行script,直到script中的D,然后根据D删除第一行内容,进入下一个script循环...

    模式空间(pattern space)和保持空间(hold space)
    模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
    保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。
    
sed [-hnV][-e<script>][-f<script文件>][文本文件]
    参数说明:
        -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
            -e 执行多次,例如sed -e 's#oldboy#oldgirl#g' -e 's#112233#445566#g' test.txt
        -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
        -h或--help 显示帮助。
        -n或--quiet或--silent 仅显示script处理后的结果。
        -V或--version 显示版本信息。
        -i 直接修改文件的内容
        -i.xx 备份文件后缀为.xx,同时修改原文件的内容
        -r 支持扩展正则

------------------------------------------------------------------------------
示例:sed -n 1p test.txt                #打印第一行的内容
    '2,5d'                              动作d:将第 2~5 行删除!
    '3,$d'                              动作d:删除第3行到最后一样
    '2!d'                               动作d:取反,除第2行外都删除
    '2aword'                            动作a:在第2行之后插入新的一行,a后为插入的内容
    '$a # This is a test'               动作a:在最后1行之后插入新的一行,a后为插入的内容
    '2i drink tea'                      动作i:在第2行插入内容;原内容(包括第2行)下移一行
    '2,5c No 2-5 number'                动作c:将第2-5行的内容替换为新内容
    '/root/p'                           动作p:搜索包含指定内容的行,并打印
    '/root/d'                           动作d:搜索包含指定内容的行,并删除
    's/要被取代的字串/新的字串/'          动作s:替换(无g,默认每行只替换第一个匹配到的,即只替换一次)
    's/要被取代的字串/新的字串/g'         动作s:替换(匹配的全部替换)
    进阶:
    搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
    nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}' 
sed命令与用法
复制代码
复制代码
sed script说明
    即script的内容写入到''中,分为2部分Address+Command:
        Address:指定处理范围,不指定address则对全文进行处理
        Command:对行内容的处理动作,详见动作说明
--------------------------------------------------------------
    其中script可以表示为'AddressCommand'
        Address说明:
            0.无指定行则默认对全文进行处理
            1.指定行,例如:2
                特殊行:$最后一行;$-1倒数第二行
            2.指定多行,
                例如:2,5指定第2-5行
                2,+3 指定第2行开始,以及之后的3行
            4./RegExp/
            5./RegExp1/,/RegExp2/
                指定多行:从第一次匹配到RegExp1开始,到第一次匹配到RegExp2为止,之间的所有行
            6.~步进
                1~2 奇数行
                2~2 偶数行
--------------------------------------------------------------
        动作说明(Command说明):
            a:插入内容,在指定行后新增一行,并插入内容(若插入的首字符为空格,在空格前添加'\'即可)
            i:插入内容,在指定行插入内容;同时将原指定行以及之后的所有内容下移一行(若插入的首字符为空格,在空格前添加'\'即可)
            s/RegExp/string/修饰符:替换字符串,通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
                修饰符:g全局替换;i忽略字符大小写
                特殊:()----\1,\2;&==正则匹配到的所有
                    s###g
                    's#o\(ot\)#\1#g'        #oot替换为ot
                    's#oot#&OOT#g'          #oot后追加OOT
            c:替换行内容; c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!(若插入的首字符为空格,在空格前添加'\'即可)
            p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
            !:模式空间中匹配行取反处理
            w /path/file  保存模式匹配的行至指定文件
            r /path/file  读取指定文件的文本至模式空间中
            =:为模式空间中的行打印行号

        高级编辑命令(高级动作)(涉及保持空间的操作):
            d         删除模式空间的内容,开始下一个循环.
            h、 H     复制/追加模式空间的内容到保持空间.
            g、 G     复制/追加保持空间的内容到模式空间.
            x         交换保持空间和模式空间的内容.
            n、N      读取下一行,覆盖/追加至模式空间

            D    如果模式空间不包含换行符,请像发出d命令一样开始正常的新循环。
                否则,删除模式空间中的文本,直到第一行换行,然后使用结果模式空间重新开始循环,而无需读取新的输入行。
                例如:sed 'N;p;D' 111.txt
                        0.sed读入第一行
                        1.执行N动作,读入第2行;此时模式空间有第1,2行内容
                        2.执行p动作,打印了模块空间的内容,即第1,2行内容
                        3.执行D动作,因为模式空间内有2行内容,删除内容知道第一行换行,即删除了第1行内容;模式空间只有第2行内容;同时直接开始循环,即开始下一轮'N;p;D'。(所以在有D的sed命令行语句中,-n没有意义)
                        4.指定N动作,读入下一行,即读入第3行;此时模式空间有第2,3行内容
                        5.执行p动作...
                        6.执行D动作...
sed script说明
复制代码

 

复制代码
awk用法与示例
======================================================================
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

awk [选项参数] 'script' var=value file(s)
awk [选项参数] -f scriptfile var=value file(s)

awk命令选项参数说明:
    -F fs or --field-separator fs                       指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
    -v var=value or --asign var=value                   赋值一个用户定义变量。
    -f scripfile or --file scriptfile                   从脚本文件中读取awk命令。
    -mf nnn and -mr nnn                                 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
    -W compact or --compat, -W traditional or --traditional     在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
    -W copyleft or --copyleft, -W copyright or --copyright      打印简短的版权信息。
    -W help or --help, -W usage or --usage                      打印全部awk选项和每个选项的简短说明。
    -W lint or --lint                                           打印不能向传统unix平台移植的结构的警告。
    -W lint-old or --lint-old                                   打印关于不能向传统unix平台移植的结构的警告。
    -W posix                                                    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
    -W re-interval or --re-inerval                              允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
    -W source program-text or --source program-text             使用program-text作为源代码,可与-f命令混用。
    -W version or --version                                     打印bug报告信息的版本。

---------------------------------------------------------------------
示例:
    awk '{print $1}' /etc/passwd                #默认分隔符为' ',打印第一个变量
    awk -F: '{print $1,$4}' /etc/passwd         #指定分隔符为':',打印第1、4个变量
    awk '-F:' '{print $1,$4}' /etc/passwd       #功能同上,注意-F的变化
    awk -F':' '{print $1,$4}' /etc/passwd       #功能同上,注意-F的变化
    awk -F ':' '{print $1,$4}' /etc/passwd      #功能同上,注意-F的变化

    awk '-F:' '{print $1,$NF}' /etc/passwd      #指定分隔符为':',打印第1个变量和最后一个变量
    awk '-F[:/]' '{print $1,$NF}' /etc/passwd   #功能同上,但区别在于指定了2种分隔符,所以最后一个变量的值不同!

    awk -F: '-va=100' '{print $3,$3+a}' /etc/passwd                     #设置变量a=100,然后输出变量
    awk -F: '-va=100' -vb=200  '{print $3,$3+a,$3+b}' /etc/passwd       #设置多个变量

    awk -f {awk脚本} {文件名}

    awk -F:  '/root/{print $1,$3}' /etc/passwd         #获取行内容中含有root的行,同时指定分隔符,打印第1、3个变量
    awk -F:    '$6 ~/root/{print $1,$3}' /etc/passwd   #获取第6列内容含有root的行,同时指定分隔符,打印第1、3个变量
            ~ 表示模式开始。// 中是模式。不理解。。。

    awk 'NR>1&&NR<4' oldboyedu.txt                      #取test.txt文件的第2行到第3行的内容。
    awk '/root/' oldboyedu.txt                          #过滤出含有root字符串的行※。
    awk '/^[^r]/' oldboyedu.txt                         #删除含有root字符串的行※。其实这个只是通过正则进行匹配而已,匹配非r开头而已,并不是删除。。。
        [^r]  非r
        ^[^r] 以非r字符卡头
    awk -F ":" '{print NR,$1,$3,$NF}' oldboyedu.txt     #取文件的第一列、第三列和最后一列内容,并打印行号※。
awk用法与示例
复制代码
复制代码
awk命令支持的运算符、awk命令常用内建变量
======================================================================
awk命令支持的运算符                   描述
    = += -= *= /= %= ^= **=         赋值
    ?:                              C条件表达式
    ||                              逻辑或
    &&                              逻辑与
    ~ 和 !~                         匹配正则表达式和不匹配正则表达式
    < <= > >= != ==                 关系运算符
    空格                            连接
    + -                             加,减
    * / %                           乘,除与求余
    + - !                           一元加,减和逻辑非
    ^ ***                           求幂
    ++ --                           增加或减少,作为前缀或后缀
    $                               字段引用
    in                              数组成员

---------------------------------------------------------------------
awk命令常用内建变量
    $0  整行
    $NF 最后一列 倒数第一列
    $(NF-1) 倒数第二列

    内建变量                        描述
    $n                            当前记录的第n个字段,字段间由FS分隔
    $0                            完整的输入记录
    NF                            一条记录的字段的数目
    NR                            已经读出的记录数,就是行号,从1开始
    ARGC                        命令行参数的数目
    ARGIND                        命令行中当前文件的位置(从0开始算)
    ARGV                        包含命令行参数的数组
    CONVFMT                        数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
    ERRNO                        最后一个系统错误的描述
    FIELDWIDTHS                    字段宽度列表(用空格键分隔)
    FILENAME                    当前文件名
    FNR                            各文件分别计数的行号
    FS                            字段分隔符(默认是任何空格)
    IGNORECASE                    如果为真,则进行忽略大小写的匹配
    OFMT                        数字的输出格式(默认值是%.6g)
    OFS                            输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
    ORS                            输出记录分隔符(默认值是一个换行符)
    RLENGTH                        由match函数所匹配的字符串的长度
    RS                            记录分隔符(默认是一个换行符)
    RSTART                        由match函数所匹配的字符串的第一个位置
    SUBSEP                        数组下标分隔符(默认值是/034)
awk命令支持的运算符、awk命令常用内建变量
复制代码

 

posted @   雲淡風輕333  阅读(57)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示