码迷,mamicode.com
首页 > 系统相关 > 详细

7.vim文本编辑及文件查找应用

时间:2019-08-01 23:58:24      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:脚本   指定   输出   模式   关系   其他   操作   pattern   模式匹配   

7.1vim编辑器深入讲解

vim编辑器
    
    文本编辑器:
        文本:纯文本,ASCII text,Unicode

    文本编辑器种类:
        行编辑器:sed
        全屏编辑器: nano,vi

        vi: visual Interface
        vim: VI IMproved

    vim:
        模式化的编辑器

            基本模式:
                编辑模式,命令模式
                输入模式
                末行模式:
                    内置的命令行接口

        打开文件:
            # vim [options][file...]
                +#:打开文件,直接让光标处于第#行的行首
                +PATTERN:打开文件后,直接让光标处于被PATTERN匹配到的行的行首

        模式转换:默认模式
            编辑模式-->输入模式
                i:insert在当前光标所在处输入
                a:append在当前光标所在处后方输入
                o:在光标所在处的下方打开一个新行
                I:在光标所在行的行首输入
                A:在光标所在行的行尾输入
                O:在光标所在处的上方打开一个新行

            输入模式-->编辑模式
                ESC

            编辑模式-->末行模式
                :

            末行模式-->编辑模式
                ESC

        关闭文件:
            ZZ:保存并退出
            :q 退出
            :q!强制退出,不保存此前的编辑操作
            :wq保存并退出
            :w /PATH/TO/SOMEFILE

        光标跳转:
            字符间跳转
                h,l
                j,k

                #COMMAND:跳转由#指定的个数的字符

            单词间跳转
                w:下一个单词的词首
                e:当前或后一个单词的词尾
                b:当前或前一个单词的词首

                #COMMAND:跳转由#指定的个数的字符

            行首行尾跳转
                ^:跳转至行首的非空白字符
                0:跳转至行首
                $:跳转至行尾

            行间跳转
                #G:跳转至由#指定的行
                1G,gg:第一行
                G:最后一行

            句间跳转
                (
                )

            段间跳转
                {
                }

        翻屏:
            Ctrl+f:向文件尾翻一屏
            Ctrl+b:向文件首部翻一屏
            Crtl+d:向文件尾部翻半屏
            Ctrl+u:向文件首部翻半屏
            Enter:按行向后翻

        vim的编辑命令:

            字符编辑
                x:删除光标所在处的字符
                #x:删除光标所在处的起始处#个字符

                xp:交换光标所在处的字符与其后面的字符的位置

            替换命令(replace)
                r:替换光标所在处的字符
                    rCHAR

            删除命令
                d:删除命令,可结合光标跳转字符,实现范围删除
                    d$:
                    d^:
                    dw:
                    de:
                    db:
                        #COMMAND:跳转由#指定的个数的字符

                    dd:删除光标所在处的行
                        #dd:删除光标所处的行起始的共#行

            粘贴命令
                p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在处的后方
                P:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至当前光标所在处的前方

            复制命令
                y:复制,工作行为相似于d命令
                    y$,y^,y0,ye,yw,yb
                        #COMMAND

                    yy:复制一整行
                        #yy:复制#行

            改变命令:
                编辑模式-->输入模式,实现删除操作
                    c$,c^,c0,ce,cw,cb
                        #COMMAND

                    cc:删除光标所在行,并转换为输出模式
                        #cc:

        可视化模式:
            v:按字符选定
            V:按行选定

            结合编辑命令使用:d,c,y

        撤销操作:
            u:撤销此前的操作
                #u:撤销此前的#个操作

        撤销此前的撤销:
            Ctrl+r

        重复执行前一个编辑操作:
            .

    vim自带的教程vimtutor

7.2vim编辑器高效用法进阶

vim末行模式:
    内建的命令接口

    (1)地址定界
        :start_post[,end_post]
            #:特定的第#行,例如5即第5行
            #,#指定行范围,左侧为起始行,右侧为结束行
            #,+#:指定行范围,左侧为起始行绝对编号,右侧为相对左侧行号的偏移量.例:3,+7
                .,$-1
                1,$
            % 全文
            /pattern/:从光标所在处起始向文件尾部第一次被模式匹配到的行
                /first/,$

            /pat1/,/pat2/:从光标所在处起始,第一由由part1匹配到的行开始,至第一次由pat2匹配到的行结束之间的所有行

        可同编辑命令一同使用,实现编辑操作
            d,y,c

        w /PATH/TO/SOMEFILE:将范围内的文本保存至指定的文件中
        r /PATH/FROM/SOMEFILE:将指定的文件中的文本读取并插入至指定位置

    (2)查找
        /PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配到的所有字符串
        ?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串
            n:下一个,与命令方向相同
            N:上一个,与命令方向相反

    (3)查找并替换
        s:末行模式的命令:使用格式 
            s/要查找的内容/替换为的内容/修饰符
                要查找的内容:可使用正则表达式
                替换为的内容:不能使用正则表达式,但可以引用
                    如果"要查找的内容"部分在模式中使用分组符号:在"替换为的内容"中使用后向引用
                    直接引用查找模式匹配到的全部文本,使用&符号
                修饰符:
                    i:忽略大小写
                    g:全局替换,意味着一行中如果匹配到多次,则均替换

            可把分隔符替换为其他非常用字符
                s@@@
                s###
        示例:
            %s@\<t\([[:alpha:]]\+\)\>@T\1@g
            %s@\<t\([[:alpha:]]\+\)\>@&er@g

        练习:
            1、复制/etc/grub2.cfg、文件至/tmp目录中,用查找替换命令删除/tmp/grub1.cfg文件中以空白字符开头的行的行首的空白字符
                %s@^[[:space:]]\+@@
            2、复制/etc/rc.d/init.d/runctions文件至/tmp目录中,用查找替换命令为/tmp/functions文件的每个以空白字符开头的行的行首加上#
                %@^[[:space:]]\+[^[:space:]]@#&@g
            3、为/tmp/grub2.cfg文件的前三行的行首加上#号

            4、将/etc/yum.repos.d/CentOS-Base.repo文件中所有的enable=0替换为enable=1,所有gpgcheck=0替换为gpgcheck=1
                %s@\(enabled\|gpgcheck\)=0@1=1@g


vim的多文件功能:
    多文件:
        vim FILE1 FILE2...
            大文件间切换:
                :next 下一个
                :prev 上一个
                :first 第一个
                :last 最后一个
            退出所有文件
                wqall:
                qall:
                wall:

    多窗口:
        -o:水平分割窗口
        -O:垂直分割窗口

        在窗口间切换:Ctrl+w,ARROW

        注意:单个文件也可以分割为多个窗口进行查看
            Ctrl+w,s:水平分割窗口
            Ctrl+w,v:垂直分割窗口

定制vim的工作特性:
    注意:在末行模式下的设定,仅对当前vim进程有效
    永久有效:
        全局:
            /etc/vimrc
        用户个人:
            ~/.vimrc

    1、行号
        显示:set nu
        取消显示:set nonu
    2、自动缩进
        启动:set ai
        禁用:set noai
    3、高亮搜索
        启用:set hlsearch
        禁用:set nohlsearch
    4、语法高亮
        启用:syntax on
        禁用:syntax off
    5、忽略字符大小写
        启用:set ic
        禁用:set noic

    获取帮助:
        :help
        :help subject

    课外作业:如何设置tab键缩进4个字符


bash脚本编程之算术运算
    
    +,-,*,/,**,%

    算术运算格式:
        (1)let VAR=算术运算表达式
        (2)VAR=$[运算表达式]
        (3)VAR=$((运算表达式))
        (4)VAR=$(expr EXPRESSION)

        注意:乘法符号在有些场景中需要使用转义符

    练习:写一个脚本,完成如下功能:
            添加三个用户
            求此三个用户的UID之和

7.3文件查找命令企业级应用

文件查找

    在文件系统上查找符合条件的文件

        实现工具:locatefind

    locate:
        依赖于事先构建好的索引库
            系统自动实现(周期性任务)
            手动更新数据库(updatedb)

        工作特性:
            查找速度快
            模糊查找
            非实时查找

        locate [OPTION]... PATTERN...
            -b:只匹配出路径中的基名
            -c:统计出共有多少个符合条件的文件
            -r:BRE

        注意:索引构建过程需要遍历整个报文系统,极消耗资源

    find:
        实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找

        工作特性:
            查找速度略慢
            精确查找
            实时查找

        用法:
             find [OPTIONS] [查找起始路径][查找条件][处理动作]

                 查找起始路径:指定具体搜索目标起始路径:默认为当前目录
                 查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行,默认为找出指定路径下的所有文件
                 处理动作:对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出

             查找条件:
                 表达式:选项和测试

                 测试:通常结果为布尔型("true","false")

                     根据文件名查找
                         -name "pattern"
                         -iname "pattern"
                             支持glob风格的通配符
                                 *,?,[],[^]

                     根据文件从属关系查找
                         -user USERNAME:查找属主指定用户的所有文件
                         -group GROUPNAME:查找属组指定组的所有文件
                         -uid UID:查找属主指定的UID的所有文件
                         -gid GID:查找属组指定的GID的所有文件

                         -nouser:
                         -nogroup:

                     根据文件的类型查找
                         -type TYPE:
                             f,d,l,b,c,p,s

                     组合测试:
                         与:-a 默认组合逻辑
                         或:-o
                         非:-not,!

                     练习:
                         1、找出/tmp目录下属主为非root的所有文件
                             find /tmp -not -user root -ls
                         2、找出/tmp目录下文件名中不包含fstab字符串的文字
                             find /tmp -iname "*fstab*" -ls
                         3、找出/tmp目录下属主为非root,而且文件名不包括fstab字符串的文字
                             find /tmp -not -user -root -a -not -iname "*fstab*" -ls

                     根据文件的大小查找
                         -size[+|-]#UNIT
                             常用单位: k,m,g

                             #UNIT:(#-1,#]
                             -#UNIT:[0,#-1]
                             +#UNIT:(#,OO)

                     根据时间戳查找:
                         以""为单位:

                             -atime[+|-]#
                                 #:[#,#-1)
                                 -#:(#,0)
                                 +#:(oo,#-1]
                             -mtime:
                             -ctime:

                         以"分钟"为单位
                             -amin
                             -mmin
                             -cmin

                     根据权限查找:
                         -perm [/|-] mode
                             mode:精确权限匹配
                             /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件和满足
                                 9位权限之间存在""关系
                             -mode:每一类彷(u,g,o)的权限中的每一位(r,w,x)同时符合条件和满足

             处理动作:
                 -print:输出至标准输出;默认的动作
                 -ls: 类似于对查找到的文件执行"ls -l"命令,输出文件的详细信息
                 -delete:删除查找到的文件
                 -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中
                 -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND表示的命令,每次操作都由用户进行确认
                 -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND表示的命令

                 注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令:
                     但是有些命令不能接受过长的参数,此时命令执行会失败


                 课外作业,学习xargs命令的用法:

             练习:
                 1、查找/var目录下属主为root,且属组为mail的所有文件或目录 
                      find /var -user root -a -group mail -ls
                 2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录 
                     find /usr -not -user root -a -not -user bin -a -not -user hadoop 
                     find /usr -not \(-user root -o -user bin -o -user hadoop\)
                 3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录 
                     find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
                 4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录 
                     find / \(-nouser -o -nogroup\)  -atime -7
                 5、查找/etc目录下大于1M且类型为普通文件的所有文件
                     find /etc -size +1M -type f -exec ls -lh {} \;
                 6、查找/etc目录下所有用户都没有执行权限的文件
                     find /etc -not -perm /222 -type f -ls
                 7、查找/etc目录至少一类用户没有执行权限的文件
                     find /etc -not -perm -111 -type f -ls
                 8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
                     find /etc/init.d -perm -111 -a -perm -002
                     find /etc/init.d -perm -113 -type f

        博客作用:find详解 

7.4Linux特殊权限及facl扩展

Linux系统上的特殊权限
    特殊权限:SUID,SGID,STICKY

    安全上下文:
        1、进程以某用户的身份运行,进程是发起此进程用户的代表,因此以此用户的身份和权限完成所有操作
        2、权限匹配模型:
            (1)判断进程的属主,是否为被访问的文件属主,如果是,则应用属主的权限,否则进入第2步
            (2)判断进程的属主,是否属于被访问的文件属组:如果是,则应用属组的权限,否则进入第3步
            (3)应用other的权限

    SUID:
        默认情况下,用户发起的进程,进程的属主是其发起者,因此,其以发起者的身份运行

        SUID的功用:用户运行某程序时,如果此程序拥有此SUID权限,那么程序运行为进程时,进程的属主不是发起者,而程序文件自己的属主

        管理文件的SUID权限:
             chmod u+|-s FILE...

             展示位置: 属主的执行权限们
                 如果属主原本有执行权限,显示为小写s
                 否则,显示为大写S

    SGID:
        功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的ntxe

        管理文件的SGD权限:
             chmod g+|-s FILE...

             展示位置: 属组的执行权限位
                 如果属组原本的执行权限 ,显示为小写s
                 否则,显示为大写S

    Sticky:
        功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的文件;如果此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己的文件

        管理文件的Sticky权限 
            chmod o+|- FILE...

            展示位置:其它用户的执行权限位
                如果其它用户原本有执行权限,显示为小写t
                否则,显示为大写T

        系统上的/tmp和/var/tmp目录默认均有Sticky权限 

    管理特殊权限的另一方式:
        suid sgid sticky /8进制权限
        0 0 0            0
        0 0 1             1
        0 1 0              2
        0 1 1            3
        1 0 0            4
        1 0 1            5
        1 1 0            6
        1 1 1            7

facl: file access control lists
    文件的额外赋权机制
        在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制:

    getfacl命令:
        getfacl FILE...
            user:USERNAME:MODE
            group:GROUNAME:MODE

    setfacl命令:
        赋权给用户:
            setfacl -m u:USERNAME:MODE FILE...
        赋权给组:
            setfacl -m g:GROUPNAME:MODE FILE...

        撤销赋权:
            setfacl -x u:USERNAME FILE...
            setfacl -x g:GROUPNAME FILE...

 

7.vim文本编辑及文件查找应用

标签:脚本   指定   输出   模式   关系   其他   操作   pattern   模式匹配   

原文地址:https://www.cnblogs.com/43945616b/p/11286093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!