关于取路径名与基名的探讨和扩展-20160806

                      关于取路径名与基名的探讨和扩展

    这两天学习grep  ,   egrep  ,  sed   ,有一个问题一直在纠结,就是关于取基名和路径名的问题,虽然对于有的伙伴来说很简单,但有时候有的问题就是有点想不通,研究学习了两天,终于有点眉目,写写心得免得以后忘记了。

    由于一个练习题引发的纠结:(我一直没有搞懂如何通过识别分隔符或特使字段使得可以把任何基名曲出来,只知道一大堆符号就完成了,奇怪啊,奇怪啊……一天没吃饭的,智商问题?年纪大了?)

练习题一 :取出/etc/rc.d/init.d/functions中其基名?取出上面路径的目录名?分别使用grep  , egrep ,sed 给出解决办法?

    其实小伙伴都知道其基名就是 functions,路径名为/etc/rc.d/init.d/,:

§ grep解决办法

·grep取基名:(通过公式)

        [root@wCentos7 Packages]# echo "/etc/rc.d/init.d/functions" | grep  -o  ‘[^/]\+/\?$'
        functions

※详解:

             分析语句:我们需要的functions,我们可以想到在行尾一定会用$,匹配是从前面想后面匹配,到匹配到functions 前面的 / 时,我们就让为我们已经可以得到我们需要的基名了,但是我们不确定 functions到底有多少字符, 所以我们就可以使用  [^/]\+ 表示,后面的  /\? 表示最后面的 /可有可无 ,结束为 $.

 '[^/]\+/\?$'  : 起始位非 / 开始([^/]限定functions前面),并且后面可以由很多个非 / 的字符(\+/通用显示functions的字符数量),尾部有没有 /都无所谓(/\?$) ,限定尾部即可($)。

·grep取路径名名:(貌似取路径名没有通用的公式)

        [root@wCentos7 Packages]#echo "/etc/rc.d/init.d/functions/system" | grep  -o  '^.*/'
        /etc/rc.d/init.d/

§ egrep解决办法:

·egrep取基名:(通过公式)

        [root@wCentos7 Packages]#echo '/etc/rc.d/init.d/functions' |  egrep -o '[^/]+/?$'
        functions

·egrep取路径名名:(貌似取路径名没有通用的公式)

        [root@wCentos7 Packages]#echo "/etc/rc.d/init.d/functions/system" | grep  -o  '^.*/'        
        /etc/rc.d/init.d/

§ sed解决办法:

(sed的功能比较强大,有一点得注意,sed是一行一行数据的处理,当某个模式被匹配了,有删除的动作时删除整个行,不是匹配的模式;所以我们只能想办法替换调匹配的模式达到我们取出基明或路径名。)

·sed取基名:(通过公式)

        [root@wCentos7 Packages]# echo '/etc/rc.d/init.d/functions' |  sed  's@[^/]\+/\?$@12356 @'   #替换内容
        /etc/rc.d/init.d/12356

        #我们上面其实找出来我们需要的字段了functions被替换成为 123456,我们想办法让我们得到的结果成为我们的模式即可,

        在正则表达式中我们学习了分组和引用,所以我们就可以使用以下的命令即可:

        [root@wCentos7 Packages]# echo '/etc/rc.d/init.d/functions' |  sed  's@.*/\([^/]\+/\?$\)@\1@'
        functions

※详解:s@.*/\([^/]\+/\?$\)@\1@  :这个语句已经是匹配了整个语句,可以通过grep来查询实验

        [root@wCentos7 Packages]# echo "/etc/rc.d/init.d/functions" | grep '.*/\([^/]\+/\?$\)'
        /etc/rc.d/init.d/functions

        #.*/\([^/]\+/\?$\) 通过grep查询时匹配整个语句的;

        [root@wCentos7 Packages]# echo "/etc/rc.d/init.d/functions"  | grep -o '[^/]\+/\?$'
        functions

    #分组里面的[^/]\+/\?$ 通过测试时匹配基名的。 

    所以我们把分组内的数据 覆盖整个行即可显示我们需要的基名:

     s@.*/\([^/]\+/\?$\)@\1@  : 把分组1的数据替换调前面的数据;

    分组1的数据为: ([^/]\+/\?$\) 就是 基名 functions

    路径名: .*/\   /etc/rc.d/init.d/

    合成就是:functions替换掉 /etc/rc.d/init.d/functions

·sed取路径名名:(通过公式)

        [root@wCentos7 Packages]# echo '/etc/rc.d/init.d/functions/' |  sed  's@\([^/]\+/\?$\)@@'
        /etc/rc.d/init.d/

        #这个应该好理解的,就是把基名替换为空白就得到我们的路径名了,一定记得不是删除的。

§ ·扩展:理解以上的概念我们来做下面的题目,并写出通用的公式吧!

练习题:统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数?

我们通过关盘可以看到Package的文件名大概都为:

    [root@wCentos7 Packages]# ls  #不一一列举 名称.版本.架构;平台.名称,我们就需要获得平台的数据统计
    yum-plugin-protectbase-1.1.31-34.el7.noarch.rpm
    yum-plugin-remove-with-leaves-1.1.31-34.el7.noarch.rpm
    yum-utils-1.1.31-34.el7.noarch.rpm
    zenity-3.8.0-5.el7.x86_64.rpm
    zip-3.0-10.el7.x86_64.rpm
    zlib-1.2.7-15.el7.i686.rpm
    zlib-1.2.7-15.el7.x86_64.rpm
    zziplib-utils-0.13.62-5.el7.x86_64.rpm

我们借鉴上面的思路,我们需要取出 noarch  x86_64  i686的字样,其实我们可以发现,我们取出两个小数点的数据统计就可以的,和去基名是不是一样的啊,思路有了我们就可以直接想办法取出倒数两个小数点的数据统计排序就行的。

我得到的命令如下:

    [root@wCentos7 Packages]# ls | sed   's@.*\.\([^.]\+\.rpm$\)@\1@'  | sort  | uniq -c
       2000 i686.rpm
       2938 noarch.rpm
          1 TRANS.TBL
       4069 x86_64.rpm

※详解: sed   's@.*\.\([^.]\+\.rpm$\)@\1@'

        s@ @ @ : 替换命令;分组1数据替换文件名称的完整名称

        ([^.]\+\.rpm$\) : 匹配 倒数2个小数点的数据 如:x86_64.rpm  noarch.rpm  i686.rpm;

        .*\.\([^.]\+\.rpm$\) :匹配文件名称的完整名称 如:zziplib-utils-0.13.62-5.el7.x86_64.rpm;

        \1    :即为x86_64.rpm  noarch.rpm  i686.rpm的数据。 

※通用公式:

    [root@wCentos7 Packages]# ls | sed  's@.*\.\([^.]\+\.[^.]\+$\)@\1@' | sort | uniq -c
       2000 i686.rpm
       2938 noarch.rpm
      1 TRANS.TBL
       4069 x86_64.rpm

    #把 .rpm 这一节换成 \.[^.]\+ 即可得到上面的表达式

 

    [root@wCentos7 Packages]# ls | sed  's@.*\(\.[^.]\+\.[^.]\+$\)@\1@' | sort | uniq -c
       2000 .i686.rpm
       2938 .noarch.rpm
          1 TRANS.TBL
       4069 .x86_64.rpm
    #把括号外面的 \. 移动括号

 

    [root@wCentos7 Packages]# ls | sed   's@.*\(\(\.[^.]\+\)\{2\}$\)@\1@'  | sort | uniq -c
       2000 .i686.rpm
       2938 .noarch.rpm
          1 TRANS.TBL
       4069 .x86_64.rpm

    #把两个 \.[^.]\+ 换成  \(\.[^.]\+\)\{2\} 即可得到上面的表达式

 

总结:

    grep   ,  egrep   , sed  等等命令实现复杂的功能都需要配合 正则表达式和扩展正则表达式,深入的理解正则表达式和扩展正则表达式对以后我们对工具的理解和使用有很好的帮助,个人感觉还可以提供我们对于程序的脚本编程有一定的理解。

    个人一直认为,理解其工作原理对于使用工具有很好的帮助,不能一味的按照教程上上敲,记住顺序还是会很快遗忘的,不过理解了其简单原理,还是需要多多的敲命令的,不让命令参数都忘记了如何是好。(笔者也是很多命令参数记不住啊,希望老师多出些练习题,实际实用的练习题的,呵呵)

 

 

 

原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/30328

(0)
linux_rootlinux_root
上一篇 2016-08-07 22:06
下一篇 2016-08-07 22:06

相关推荐

  • linux文件基本权限讲解

    linux文件基本权限讲解 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 Linux系统中一切都是文件,文件和目录的所属与权限——来分别规定所有者、所有组、其余人的读,写,执行权限。 在Linux中我们可以使用ll或者ls –…

    Linux干货 2016-09-05
  • lamp部署及编译安装

    lamp 资源类型: 静态资源:原始形式与响应给客户端的结果一致; 动态资源:原始形式通常为程序文件(为某种编程语言开发),需要运行后将生成的结果展示给客户端;如果请求的资源不存在那么结果就会重定向至指定的文件中 客户端技术:javascript 服务端技术:php, jsp, … CGI:Common Gateway Interfa…

    Linux干货 2016-10-19
  • mysql备份与恢复

    1、mysqldump进行mysqll数据库的备份与还原 命令说明: Schema和数据存储一起、巨大的SQL语句、单个巨大的备份文件 mysqldump: 客户端,通过mysql协议连接至mysqld; mysqldump [options] [db_name [tbl_name …]] shell> mysqldump [options] db…

    Linux干货 2017-03-27
  • 第十二周作业

    1、请描述一次完整的http请求处理过程;     1)建立或处理连接:接收请求或拒绝请求;     2)接收请求:接收来自于网络的请求报文中对某资源的一次请求的过程;接收请求的方式通常是并发访问响应模型;     3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息,解析后的报文…

    2017-03-27
  • Linux网络相关概念及bash脚本编程练习

    马哥教育网络班第23期+第八周课堂练习 Linux网络相关概念及bash脚本编程练习 习题: 1.请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别 (1)网桥: 橋接器(英语:network bridge),又称网桥,一種網路裝置,負責網路橋接(network bridging)之用。 橋接器将网络的多个网段在数据链路层(O…

    Linux干货 2016-11-15
  • 第一周作业

    1、描述计算机的组成及其功能。
    2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。
    4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echou、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相应的示例来阐述。
    5、如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的。
    6、请罗列Linux发行版的基础目录名称命名法则及共用规定。

    Linux干货 2017-12-03