• 20135306-信息安全系统设计基础第一周学习总结


    第二周(9.14-9.20):

     

    学习计时:共14小时

    读书:2h

    代码:4h

    作业:4h

    博客:4h

    一、学习目标

    1. 能够独立安装Linux操作系统    

    2. 能够熟练使用Linux系统的基本命令    

    3. 熟练使用Linux中用户管理命令/系统相关命令/文件目录相关命令/打包压缩相关命令/比较合并相关命令/网络相关命令等

    4. 熟练应用“搜索”进行举一反三的学习

     

    二、学习资源

    1. 课程资料:https://www.shiyanlou.com/courses/413   实验一,课程邀请码:W7FQKW4Y

    2. Linux   基础入门:https://www.shiyanlou.com/courses/1(重点,第一次课考核内容全部从这里面出)

    3.  Linux命令:en     cn

    三、学习方法

    1.  进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。

    2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/

    3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习

    4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第一周学习总结”

    四、学习任务

     

     

    1. 重点学习 cheat/find/locate/grep/man/whereis/which/apt-get
     
     

     

         查找帮助文档、各种示例多多练习,这几个命令会贯穿我们整个学习的学习,掌握这几个命令就可以很好学习其他命令了。

     

    2. 这学期需要掌握的命令有ac,apt-get,bzip2,cat,chgrp,chmod,chown,clear,compress,cp,dd,df,diff,du,dump,evn,find,finger,free,grep,gzip,head,kill,less,ln,locate,l,gout,ls,man,mkdir,more,mount,mt,mv,netstat,nslookup,od,passwd,patch,ps,pstop,pwd,rm,shell,sort,ssh,stty,tail,tar,telnet,touch,tree,uname,unzip,vi,vim,whereis,which,who,write

     

    3. 测试示例:

     

    •   请在虚拟机中安装DDD软件(其他软件)
    •   请演示怎么判断DDD软件能不能安装
    •   请查找系统中50M以上的文件
    •   请查找系统中两天前修改过的且小于5M的文件
    •   请问如何查找操作系统的信息
    •   请查找当前目录下所有*.c文件中哪个文件中包含main函数
    •   请建立一个目录,里面建立两个子文目录,如何一条命令删除三个目录?
    •   如何把一个目录及子目录拷贝到自己的主目录中
    •   ...

     

     

    第1节

     

    Linux 系统简介

     

    第2节

     

    基本概念及操作

     

    第3节

     

    用户及文件权限管理

     

    第4节

     

    Linux 目录结构及文件基本操作

    1、Linux 的文件组织目录结构。 2、相对路径和绝对路径。 3、对文件的移动、复制、重命名、编辑等操作。

     

    第5节

     

    环境变量与文件查找

     

    第6节

     

    文件打包与解压缩

     

    第7节

     

    文件系统操作与磁盘管理

     

    第8节

     

    命令执行顺序控制与管道

     

    第9节

     

    简单的文本处理

     

    第10节

     

    数据流重定向

     

    第11节

     

    正则表达式基础

     

    第12节

     

    Linux下软件安装

     

     

    五、后续学习预告(可选):

    Linux下C语言编程基础:

    VIM进行编辑

    GCC进行编译

    GDB进行调试

    Make进行自动化

    、学习过程

    (提示:此处由学生填写,学习过程,学习笔记,代码编译,运行结果,思考等)

    1. 重要知识点总结梳理:

    2. 教材代码编译运行

    3. 课后作业

    4.   ......

     

    参考资料:(参考论文、图书、网站、同学的内容一定要进行标注,否则以作弊论处,本次作业判0,三次以上的以课程考试作作弊论,并在立此存照(http://www.cnblogs.com/rocedu/p/4795939.html)中曝光)

     

    第一节 Linux系统简介

    一、Linux——操作系统

    1、使多个用户从不同的终端同时操作主机(分时操作系统);

    2、MINIX是一个功能有限的类似于UNIX的操作系统(UNIX 实现了 TCP/IP 协议栈);

    3、Linux 本身只是操作系统的内核。

    4、内核是使其他程序能够运行的基础。它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序实际上都运行在内核之上。

    5、一些必需的程序:命令行解释器(shell)——用于用户交互和编写 shell 脚本(.bat文件)。

    6、平台大都为开源软件。对于一些应用程序没有自己开发,更快捷的改写内核,使得程序更容易在Linux上运行。

    7、兼具图形界面操作。

    二、学习路径

    1、初级:Linux系统安装、图形界面使用、常用命令。

    2、中级:Linux用户和文件系统管理、软件安装配置、网络管理、系统维护、Shell编程初步。

    3、高级:(1)Linux服务器领域:数据库、防火墙、DNS服务器、VPN服务器、Web服务器、MALL服务器、FTP服务器、Samba服务器、NFS服务器、集群服务器......

         (2)Linux程序开发:Shell高级编程、Linux C/C++程序开发、Linux内核基础、嵌入式开发、Linux驱动开发.....

    4、Linux内核研究和操作系统开发......

    三.Linux和Windows的区别

    Linux&Windows
    Linux:免费,但软件质量好,需要经常更新维护杀毒,系统通俗易懂,可定制性强
    windows:昂贵,软件质量一般,不需要经常更新,新手使用困难,可定制性差

    第二节 基本概念及操作

     

    一、Linux 桌面环境介绍

     

    相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 Unix/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,类似 Windows95 之前的Windows 的图形界面实则也只是运行在 DOS 环境的一套软件。而 Linux 上的这套软件以前是XFree86,现在则是 xorg(X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为X11或X)实现的,X 本身只是工具包及架构协议,而 xorg 便是 X 架构规范的一个实现体,也就是说它是实现了 X 协议规范的一个提供图形用户界面服务的服务器,就像实现了 http 协议提供 web 服务的 Apache。如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境KDEGNOMEXFCELXDE,其中就有你看到的,实验楼目前使用的 XFCE 桌面环境,部分老用户可能可以回想起,实验楼之前使用的环境是 LXDE。这也意味着在 Linux 上你可以自己选择安装不同的桌面环境,甚至可以定制自己的专属桌面。

     

     

    这里讲这么多,主要是为了帮助你更好理解 Linux 的桌面环境是一个怎样的概念,以及它跟 Windows 操作系统桌面的差异,实际它们之间是有着本质的差别的,希望清楚这些内容之后可以让你忽略那些体验上的差异,专心把精力放到 Linux 系统本身或者你正准备学习的某一门技术之上,这门实验课后面的内容和实验楼的其他课程便是为了帮助你实现以上两个目标的。

     

    二、Linux 桌面环境的使用

     

    如果你对当前实验桌面环境(xfce)的使用有任何困难,建议你先学习实验楼入门基础课程,对于其它桌面环境的使用,不在本课程的范围之类,有兴趣的用户可以在自己计算机中安装完整的 Linux 发行版或其 Live CD 体验。

     

    关于登录账户密码的说明, 实验楼环境中所有的默认系统用户名均为 shiyanlou,密码为 shiyanlou

     

    三、Linux终端

     

    1.Terminal(终端)

     

    通常在我们使用 Linux 时,我们并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成接受用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序(Terminal),下面几个比较常见的终端模拟器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前我们的实验中的终端程序是 xfce 桌面环境自带的 xfce-terminal。不过要注意的是这里所说的终端(Terminal)和控制台(Console)是有区别的。

     

     

    终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登陆就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录,在物理机系统上你可以通过使用[Ctrl]+[Alt]+[F1]~[F6]进行切换,不过在我们的在线实验环境中可能无法切换,因为特殊功能按键会被你主机系统劫持。当你切换到其中一个终端后想要切换回图形界面,你可以按下[Ctrl]+[Alt]+[F7]来完成。

     

    2.Shell

     

    通常在图形界面中对实际体验带来差异的不是上述的不同发行版的各种终端模拟器,而大都是这个 Shell(壳),有壳就有核,这里的核就是指的 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 Unix/Linux 下的图形用户界面 GNOME 和 KDE,有时也被叫做“虚拟 shell”或“图形 shell”。

     

    Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的脚本语言。当然在这点也有别于 Windows 下的命令行,虽然也提供了很简单的控制语句。在Windows 操作系统下,可能有些用户从来都不会直接的使用 Shell,然而在 UNIX 系列操作系统下,Shell 仍然是控制系统启动、X11 启动和很多其他实用工具的脚本解释程序。

     

    在 UNIX/Linux 中比较流行的常见的 Shell 有 bash,zsh,ksh,csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME),但我们的环境中使用的分别是zsh 和 xfce。

     

    3.命令行操作体验

     

    如图,双击桌面上的Xface终端图标,打开终端,打开终端后会自动运行 Shell 程序,然后我们就可以输入命令让系统来执行了:

     

     

    1).重要快捷键:

     

    真正学习命令行之前,你先要掌握几个十分有用,必需掌握的小技巧:

     

    [Tab]

     

    使用Tab键来进行命令补全,Tab键一般键盘是在字母Q旁边,这个技巧给你带来的最大的好处就是当你忘记某个命令的全称时你可以只输入它的开头的一部分然后按下Tab键就可以得到提示或者帮助完成:

     

     

     

     

     

    当然不止补全命令,补全目录,补全命令参数都是没问题的:

     

     

     

    [Ctrl+c]

     

    想想你有没有遇到这种情况,当你在 Linux 命令行中无意输入了一个不知道的命令,或者错误的使用了一个命令,导致在终端里出现了你无法预料的情况,比如,只有光标在闪烁无法继续输入命令,或者不停地在输出一大堆你不想要的结果。你想要立即停止并恢复到你可控的状态,那该怎么办呢。这时候你就可以使用Ctrl+c键来强行终止当前程序(你可以放心它并不会使终端退出)。

     

    尝试输入以下命令:

     

    $ tail

     

    然后你会发现你接下来的输入都没有任何反应了,只是将你输入的东西显示出来,现在你可以使用Ctrl+c,来中断这个你目前可能还不知道是什么的程序了。(在后续课程中我们会具体解释这个tail命令是什么)

     

    又或者输入:

     

    $ find /
    

     

     

     

    显然这不是你想的结果,可以使用Ctrl+c 结束。

     

    虽然这个按着很方便,但不要随便按,因为有时候当你看到终端没有任何反应或提示,也不能接受你的输入,可能只是运行的程序需要你耐心的等一下,你就不要急着Ctrl+c了。

     

    其他一些常用快捷键

     

    按键作用
    Ctrl+d 键盘输入结束或退出终端
    Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行
    Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
    Ctrl+a 将光标移至输入行头,相当于Home
    Ctrl+e 将光标移至输入行末,相当于End
    Ctrl+k 删除从光标所在位置到行末
    Alt+Backspace 向前删除一个单词
    Shift+PgUp 将终端显示向上滚动
    Shift+PgDn 将终端显示向下滚动

     

    2).学会利用历史输入命令

     

    很简单,你可以使用键盘上的方向键,恢复你之前输入过的命令,你一试便知。

     

    3).学会使用通配符

     

    通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。

     

    终端里面输入的通配符是由 Shell 处理的,不是由所涉及到命令语句处理的,它只会出现在命令的“参数值”里(它不用在 命令名称里, 命令不记得,那就用Tab补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种 Shell 实现的路径扩展功能。在 通配符被处理后, Shell 会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

     

    先使用 touch 命令创建 2 个文件,后缀都为 txt:

     

    $ touch adsfasd.txt wergjlkas.txt
    

     

    可以给文件随意命名,假如过了很长时间,你已经忘了这两个文件的文件名,现在你想在你大堆其他文件中找到这两个文本文件,就可以使用通配符:

     

    $ ls *.txt
    

     

     

    在创建文件的时候,如果需要一次性创建多个文件,比如:“love_1_linux.txt,love_2_linux.txt,... love_10_linux.txt”。在 Linux 中十分方便:

     

    $ touch love_{1..10}_linux.txt
    

     

     

    Shell 常用通配符:

     

    字符含义
    * 匹配 0 或多个字符
    ? 匹配任意一个字符
    [list] 匹配 list 中的任意单一字符
    [!list] 匹配 除list 中的任意单一字符以外的字符
    [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
    {string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串
    {c2..c2} 匹配 c1-c2 中全部字符 如{1..10}

     

    4).学会在命令行中获取帮助

     

    在 Linux 环境中,如果你遇到困难,可以使用man 命令,它是Manual page的缩写。

     

    Manual pages 是在 UNIX 或类 UNIX 操作系统在线软件文档的一种普遍的形式。 内容包括计算机程序(包括库和系统调用),正式的标准和惯例,甚至是抽象的概念。用户可以通过执行 man 命令调用手册页。

     

    你可以使用如下方式来获得某个命令的说明和使用方式的详细介绍:

     

    $ man <command_name>
    

     

    比如你想查看 man 命令本身的使用方式,你可以输入:

     

    man man

     

    通常情况下,man 手册里面的内容都是英文的,这就要求你有一定的英文基础。man 手册的内容很多,涉及了 Linux 使用过程中的方方面面,为了便于查找,是做了分册(分区段)处理的,在Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段,安排如下:

     

    区段说明
    1 一般命令
    2 系统调用
    3 库函数,涵盖了C标准函数库
    4 特殊文件(通常是/dev中的设备)和驱动程序
    5 文件格式和约定
    6 游戏和屏保
    7 杂项
    8 系统管理命令和守护进程

     

    要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如:

     

    $ man 3 printf

     

    所有的手册页遵循一个常见的布局,其为通过简单的 ASCII 文本展示而优化,而这种情况下可能没有任何形式的高亮或字体控制。一般包括以下部分内容:

     

    NAME(名称)

     

    该命令或函数的名称,接着是一行简介。

     

    SYNOPSIS(概要)

     

    对于命令,正式的描述它如何运行,以及需要什么样的命令行参数。对于函数,介绍函数所需的参数,以及哪个头文件包含该函数的定义。

     

    DESCRIPTION(说明)

     

    命令或函数功能的文本描述。

     

    EXAMPLES(示例)

     

    常用的一些示例。

     

    SEE ALSO(参见)

     

    相关命令或函数的列表。

     

    也可能存在其他部分内容,但这些部分没有得到跨手册页的标准化。常见的例子包括:OPTIONS(选项),EXIT STATUS(退出状态),ENVIRONMENT(环境),BUGS(程序漏洞),FILES(文件),AUTHOR(作者),REPORTING BUGS(已知漏洞),HISTORY(历史)和COPYRIGHT(版权)。

     

    通常 man 手册中的内容很多,你可能不太容易找到你想要的结果,不过幸运的是你可以在 man 中使用搜索,/<你要搜索的关键字>,查找到后你可以使用n键切换到下一个关键字所在处,shift+n为上一个关键字所在处。使用Space(空格键)翻页,Enter(回车键)向下滚动一行,或者使用j,k(vim编辑器的移动键)进行向前向后滚动一行。按下h键为显示使用帮助(因为man使用less作为阅读器,实为less工具的帮助),按下q退出。

     

    想要获得更详细的帮助,你还可以使用info命令,不过通常使用man就足够了。如果你知道某个命令的作用,只是想快速查看一些它的某个具体参数的作用,那么你可以使用--help参数,大部分命令都会带有这个参数,如:

     

    $ ls --help

     

    作业

     

    本课程会在每一节实验结束部分介绍一个有趣的 Linux 命令,这一节介绍一个可以输出图形字符的命令banner,先看效果:

     

     

    你可以先使用如下命令安装:

     

    $ sudo apt-get update;sudo apt-get install sysvbanner
    

     

    然后:

     

    $ banner shiyanlou

     

    或者你觉得这字体不好看,那么你还可以使用默认已经安装的一个命令printerbanner

     

    $ printerbanner -w 50 A

     

     

     

    '-w'参数指定打印宽度,因为我们的环境在屏幕中显示比较小,必须要加上宽度限制。

     

    还有两个类似的命令toilet,figlet,作为作业安装试用。

     

     

     

    第三节 用户及文件权限管理

     

     

    在这一节中我学习了linux中创建,删除用户,添加用户组和文件权限设置等操作。

     

     

     

    按照作业要求,我添加了一个新用户,并且给他创建了一个文件,给安排了权限设置,即只有他才能访问:

     

     

     

     

     

    第四节 Linux 目录结构及文件基本操作

    一、Linux 目录结构

    在讲 Linux 目录结构之前,你首先要清楚一点东西,那就是 Linux 的目录与 Windows 的目录的区别,或许对于一般操作上的感受来说没有多大不同,但从它们的实现机制来说是完全不同的。

    一种不同是体现在目录与存储介质(磁盘,内存,DVD 等)的关系上,以往的 Windows 一直是以存储介质为主的,主要以盘符(C 盘,D 盘...)及分区的来实现文件管理,然后之下才是目录,目录就显得不是那么重要,除系统文件之外的用户文件放在任何地方任何目录也是没有多大关系。所以通常 Windows 在使用一段时间后,磁盘上面的文件目录会显得杂乱无章(少数善于整理的用户除外吧)。然而 UNIX/Linux 恰好相反,UNIX 是以目录为主的,Linux 也继承了这一优良特性。 Linux 是以树形目录结构的形式来构建整个系统的,可以理解为一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。举例来说,可以利用网络文件系统(Network File System,NFS)服务器载入某特定目录等。

    1.FHS 标准

    Linux 的目录结构说复杂很复杂,说简单也很简单。复杂在于,因为系统的正常运行是以目录结构为基础的,对于初学者来说里面大部分目录都不知道其作用,重要与否,特别对于哪些曾近的重度 Windows 用户,他们会纠结很长时间,关于我安装的软件在哪里这类问题。说它简单是因为,它其中大部分目录结构是规定好了(FHS 标准),是死的,当你掌握后,你在里面的一切操作都会变得井然有序。

    FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

    FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该要放置设置文件,/bin 与 /sbin 则应该要放置可执行文件等等。

    第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件、/usr/share 放置共享数据等等。

    FHS_2.3 标准文档

    如果你觉得看这个不明白,那么你可以试试最真实最直观的方式,执行如下命令:

    $ tree /
    

    如果提示"command not found",就先安装:

    # 因为我们的环境的原因,每次新启动实验会清除系统恢复初始状态,所以需要手动更新软件包索引,以便我们安装时能找到相应软件包的源
    
    sudo apt-get update
    
    sudo apt-get install tree

    关于上面提到的 FHS,这里还有个很重要的内容你一定要明白,FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动(注意,不是不能,学习过程中,不要怕这些),将目录定义为四种交互作用的形态,如下表所示:

    2.目录路径

    路径

    有人可能不明白这路径是指什么,有什么用。顾名思义,路径就是你要去哪儿的路线嘛。如果你想进入某个具体的目录或者想获得某个目录的文件(目录本身也是文件)那就得用路径来找到了。

    使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录(**注意,还记得我们上一节介绍过的,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件), - 表示上一次所在目录,通常表示当前用户的"home"目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。

    进入上一级目录:

    $ cd ..
    

    进入你的“home”目录:

    $ cd ~ 
    # 或者 cd /home/<你的用户名>
    

    使用 pwd 获取当前路径:

    $ pwd
    

    绝对路径

    关于绝对路径,简单地说就是以根"/"目录为起点的完整路径,以你所要到的目录为终点,表现形式如: /usr/local/bin,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。

    相对路径

    相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如: usr/local/bin (这里假设你当前目录为根目录)。你可能注意到,我们表示相对路径实际并没有加上表示当前目录的那个 . ,而是直接以目录名开头,因为这个 usr 目录为 / 目录下的子目录,是可以省略这个 . 的(以后会讲到一个类似不能省略的情况);如果是当前目录的上一级目录,则需要使用 .. ,比如你当前目录为“home”目录,根目录就应该表示为 ../../ ,表示上一级目录("home"目录)的上一级目录("/"目录)。

    下面我们以你的"home"目录为起点,分别以绝对路径和相对路径的方式进入/usr/local/bin 目录:

    # 绝对路径
    $ cd /usr/local/bin
    # 相对路径 $ cd ../../usr/local/bin

    进入一个目录,可以使用绝对路径也可以使用相对路径,那我们应该在什么时候选择正确的方式进入某个目录呢。就是凭直觉嘛,你觉得怎样方便就使用哪一个,而不用特意只使用某一种。比如假设我当前在 /usr/local/bin 目录,我想进入上一级的 local 目录你说是使用 cd .. 方便还是 cd /usr/local 方便。而如果要进入的是 usr 目录,那么 cd /usr ,就比cd ../..方便一点了。

    提示:在进行目录切换的过程中请多使用 Tab 键自动补全,可避免输入错误,连续按两次Tab可以显示全部候选结果

    二、Linux 文件的基本操作

    1.新建

    新建空白文件

    使用 touch 命令创建空白文件,关于 touch 命令,其主要是来更改已有文件的时间戳的(比如,最近访问时间,最近修改时间),但其在不加任何参数的情况下,只指定一个文件名,则可以创建一个为指定文件名的空白文件(不会覆盖已有同名文件),当然你也可以同时指定该文件的时间戳,更多关于 touch 命令的用法,会在下一讲文件搜索中涉及。

    创建名为 test 的空白文件,因为在其他目录没有权限,所以需要先 cd ~ 切换回用户的/home/shiyanlou 目录:

    $ cd ~
    $ touch test
    

    新建目录

    使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性

    创建名为"mydir"的空目录:

    $ mkdir mydir
    

    使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):

    $ mkdir -p father/son/grandson
    

    后面的目录路径,以绝对路径的方式表示也是可以的。

    2.复制

    复制文件

    使用cp(copy)命令复制一个文件或目录到指定目录。将之前创建的"test"文件复制到"/home/shiyanlou/father/son/grandson"目录中:

    $ cp test father/son/grandson
    

    是不是很方便啊,如果在图形界面则需要先在源目录复制文件,再进到目的目录粘贴文件,命令行操作步骤就一步到位了嘛。

    复制目录

    如果直接使用cp命令,复制一个目录的话,会出现如下错误:

    要成功复制目录需要加上-r或者-R参数,表示递归复制,就是说有点“株连九族”的意思:

    $ cp -r father family
    

    3.删除

    删除文件

    使用rm(remove files or directories)命令,删除一个文件或目录:

    $ rm test
    

    有时候你会遇到想要删除一些为只读权限的文件,直接使用rm删除会显示一个提示,如下:

    你如果想忽略这提示,直接删除文件,可以使用-f参数强制删除:

    $ rm -f test
    

    删除目录

    跟复制目录一样,要删除一个目录,也需要加上-r-R参数:

    $ rm -r family
    

    4.移动文件与文件重命名

    移动文件

    使用mv(move or rename files)命令,移动文件(剪切)。将文件"file1"移动到"Documents"目录mv 源目录文件 目的目录

    $ mv file1 Documents
    

    重命名文件

    将文件"file1"重命名为"myfile" mv 旧的文件名 新的文件名

    $ mv file1 myfile
    

    批量重命名

    要实现批量重命名,mv 命令就有点力不从心了,我们可以使用一个看起来更专业的命令rename来实现。不过它是要用 perl 正则表达式来作为参数,关于正则表达式我们要在后面才会介绍到,这里只做演示,你只要记得这个rename命令可以批量重命名就好了,以后再重新学习也不会有任何问题,毕竟你已经掌握了一个更常用的mv命令。

    # 使用通配符批量创建 5 个文件
    $ touch file{1..5}.txt
    
    # 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件
    $ rename 's/.txt/.c/' *.txt
    
    # 批量将这 5 个文件,文件名改为大写
    $ rename 'y/a-z/A-Z/' *.c

    简单解释下上面的命令,rename是先使用第二个参数的通配符匹配所有后缀为.txt的文件,然后使用第一个参数提供的正则表达式将匹配的这些文件的.txt后缀替换为.c,这一点在我们后面学习了sed命令后,相信你会更好的理解。

    5.查看文件

    使用cat,tacnl命令查看文件

    这两个命令都是用来打印文件内容到标准输出(终端),其中cat为正序显示,tac倒序显示。

    标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

    比如我们要查看之前从"/etc"目录下拷贝来的passwd文件:

    $ cat passwd
    

    可以加上-n参数显示行号:

    $ cat -n passwd
    

    nl命令,添加行号并打印,这是个比cat -n更专业的行号打印命令。

    这里简单列举它的常用的几个参数:

    -b : 指定添加行号的方式,主要有两种:
        -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
        -b t:只列出非空行的编号并列出(默认为这种方式)
    -n : 设置行号的样式,主要有三种:
        -n ln:在行号字段最左端显示
        -n rn:在行号字段最右边显示,且不加 0
        -n rz:在行号字段最右边显示,且加 0
    -w : 行号字段占用的位数(默认为 6 位)
    

     

    你会发现使用这几个命令,默认的终端窗口大小,一屏显示不完文本的内容,得用鼠标拖动滚动条或者滑动滚轮才能继续往下翻页,要是可以直接使用键盘操作翻页就好了,那么你就可以使用下面要介绍的命令。

    使用moreless命令分页查看文件

    如果说上面的 cat 是用来快速查看一个文件内容的,那么这个moreless就是天生用来"阅读"一个文件的内容的,比如说"man"手册内部就是使用的 less 来显示内容。其中more命令比较简单,只能向一个方向滚动,而"less"为基于"more"和"vi"(一个强大的编辑器,我们有单独的课程来让你学习)开发,功能更强大。less 的使用基本和 more 一致,具体使用请查看 man 手册,这里只介绍 more 命令的使用。

    使用more工具打开passwd文件:

    $ more passwd
    

    打开后默认只显示一屏内容,终端底部显示当前阅读的进度(百分比)。可以使用Enter键向下滚动一行,使用Space键向下滚动一屏,按下h显示帮助,q退出。

    使用headtail命令查看文件

    这两个命令那些性子比较急的人应该会比较喜欢,因为它们一个是只查看的头几行(默认为10行,不足10行则显示全部)和尾几行。还是拿 passwd 文件举例,比如当我们想要查看最近新增加的用户,那么我们可以查看这个/etc/passwd文件,不过我们前面也看到了,这个文件里面一大堆乱糟糟的东西,看起来实在费神啊。这里想到系统新增加一个用户,应该会将用户的信息添加到passwd文件的最后,那么这时候我们就可以使用tail命令了:

    $ tail /etc/passwd
    

    甚至更直接的只看一行, 加上-n参数,后面紧跟行数:

    $ tail -n 1 /etc/passwd
    

     

    关于tail命令,不得不提的还有它一个很牛的参数-f,这个参数可以实现不停地读取某个文件的内容并显示。这可让我们动态查看日志起到实时监视的作用,不过我不会在这门基础课程中介绍它的更多细节,感兴趣的用户可以自己去了解。

    6.查看文件类型

    前面我提到过,在 Linux 下面文件的类型不是根据文件后缀来判断的,我们通常使用file命令可以查看文件的类型:

    $ file /bin/ls
    

    这表示这是一个可执行文件,运行在 64 位平台,并使用了动态链接文件(共享库)。

    7.编辑文件

    在 Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs,vim,nano),由于涉及 Linux 上的编辑器的内容比较多,且非常重要,故我们有一门单独的基础课专门介绍这其中一个编辑器(vim)。在这里强烈希望正在学习这门 Linux 基础课的你先在这里暂停一下,先去学习vim 编辑器的使用(至少掌握基本的操作)然后再继续本课程后面的内容,因为后面的内容会假设你已经学会了 vim 编辑器的使用。如果你想更加快速的入门,你可以直接使用 Linux 内部的 vim 学习教程,输入如下命令即可开始:

    $ vimtutor
    

    作业

    你是不是觉得在我们的环境中学习感觉轻松愉快毫无压力呢,所以偶尔偷偷懒也是没有问题的。要真是这样可不太好啊,要学会给自己点压力,稍微严格点要求自己才行。你又或许会想要是有人能监督就好了,这样你能学得更快。好吧今天就教你怎么召唤一双眼睛出来监督你:

    $ xeyes
    

    你可以使用如下命令将它放到后台运行

    $ nohup xeyes &

     

    第五节 环境变量与文件查找

    一、环境变量

    1.变量

    declare命令:创建变量;

    $符号用于表示引用一个变量的值

    2.环境变量

      

    命令

      
      

    说明

      

    set

    显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量

    env

    显示与当前用户相关的环境变量,还可以让命令在指定环境中运行

    export

    显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量

    操作截图:

     

     

    3.命令的查找路径与顺序

     PATH里面就保存了Shell中执行的命令的搜索路径。

    创建脚本:

     

     

    5.修改和删除已有变量

    变量修改

    变量的修改有以下几种方式:

      

    变量设置方式

      
      

    说明

      

    ${变量名#匹配字串}

    从头向后开始匹配,删除符合匹配字串的最短数据

    ${变量名##匹配字串}

    从头向后开始匹配,删除符合匹配字串的最长数据

    ${变量名%匹配字串}

    从尾向前开始匹配,删除符合匹配字串的最短数据

    ${变量名%%匹配字串}

    从尾向前开始匹配,删除符合匹配字串的最长数据

    ${变量名/旧的字串/新的字串}

    将符合旧字串的第一个字串替换为新的字串

    ${变量名//旧的字串/新的字串}

    将符合旧字串的全部字串替换为新的字串

     使用unset命令删除一个环境变量

    6.如何让环境变量立即生效

    source命令别名就是.,注意与表示当前路径的那个点区分开;

    二、搜索文件

    三、作业

     

    第六节 文件打包及解压缩

    在这一节中,我们着重学习了Linux下的三种文件打包压缩形式,即zip,rar,tar

     

    第七节 文件系统操作与磁盘管理

     

    实验介绍

     

    本节实验的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习 Linux 和实验楼后续其他课程的过程中有极大帮助。

     

    因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前面省略了关于 Linux 文件系统的一些基本知识,也因为我们是在线实验环境,所以也避开了很少一部分但又十分重要的关于硬件的内容,我们只能期待用户能够抱着提高自学能力的心态自己去补充相关的知识。

     

    一、简单文件系统操作

     

    1.查看磁盘和目录的容量

     

    使用 df 命令查看磁盘的容量

     

    $ df
    

     

    在实验楼的环境中你将看到如下的输出内容:

     

     

    但在实际的物理主机上会更像这样:

     

     

    一般使用情况下,我们更多只是关心第一行的内容也就是环境中的rootfs或者物理主机上的/dev/sda2

     

    "rootfs" : (Root File System)它是 Ramfs(Ramfs 是一个非常简单的 Linux 文件系统用于实现磁盘缓存机制作为动态可调整大小的基于 ram 的文件系统)或者 tmpfs 的一个特殊实例,它作为系统启动时内核载入内存之后,在挂载真正的的磁盘之前的一个临时文件系统。通常的主机会在系统启动后用磁盘上的文件系统替换,只是在一些嵌入式系统中会只存在一个 rootfs ,或者像我们目前遇到的情况运行在虚拟环境中共享主机资源的系统也可能会采用这种方式。

     

    物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘),你如果主机上有多块硬盘则可能还会出现 /dev/sdb,/dev/sdc 这些磁盘设备都会在 /dev 目录下以文件的存在形式。

     

    接着你还会看到"1k-blocks"这个陌生的东西,它表示以磁盘块大小的方式显示容量,后面为相应的以块大小表示的已用和可用容量,在你了解 Linux 的文件系统之前这个就先不管吧,我们以一种你应该看得懂的方式展示:

     

    $ df -h
    

     

     

    现在你就可以使用命令查看你主机磁盘的使用情况了。至于挂载点如果你还记得前面第 4 节介绍 Linux 目录树结构的内容,那么你就应该能很好的理解挂载的概念,这里就不再赘述。

     

    使用 du 命令查看目录的容量

     

    这个命令前面其实已经用了很多次了:

     

    # 默认同样以 blocks 的大小展示
    $ du 
    # 加上`-h`参数,以更易读的方式展示
    $ du -h
    

     

    -d参数指定查看目录的深度

     

    # 只查看1级目录的信息
    $ du -h -d 0 ~
    # 查看2级
    $ du -h -d 1 ~
    

     

     

    du(estimate file space usage)命令与df(report file system disk space usage)只用一字只差,首先就希望注意不要弄混淆了,以可以像我这样从man手册中获取命令的完整描述,记全称就不会搞混了。

     

    二、简单的磁盘管理

     

    下面涉及的命令具有一定的危险性,操作不当可能会丢失你的个人数据,初学者建议在虚拟环境中进行操作

     

    通常情况下,这一小节应该直接将如何挂载卸载磁盘,如何格式化磁盘,如何分区,但如你所见,我们的环境中没东西给你挂,也没东西给你格和分,所以首先我们会先创建一个虚拟磁盘来进行后续的练习操作

     

    1.创建虚拟磁盘

     

    dd 命令简介(部分说明来自dd (Unix) wiki))

     

    dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于 Linux 的很重要的一点,一切即文件,在 Linux 上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd 也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在 ASCII 与 EBCDIC 编码间互换。

     

    dd的命令行语句与其他的 Linux 程序不同,因为它的命令行选项格式为选项=值,而不是更标准的--选项 值-选项=值dd默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。

     

    我们先来试试用dd命令从标准输入读入用户输入到标准输出或者一个文件:

     

    # 输出到文件
    $ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1
    # 输出到标准输出
    $ dd if=/dev/stdin of=/dev/stdout bs=10 count=1
    

     

     

    上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如'K','M','G'等单位),count用于指定块数量。如上图所示,我指定只读取总共 10 个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共 16 个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用和ducat命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其他的多余输入将被截取并保留在标准输入。

     

    前面说到dd在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件:

     

    $ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
    

     

     

     

    你可以在man文档中查看其他所有转换参数。

     

    使用 dd 命令创建虚拟镜像文件

     

    通过上面一小节,你应该掌握了dd的基本使用,下面就来使用dd命令来完成创建虚拟磁盘的第一步。

     

    /dev/zero设备创建一个容量为 256M 的空文件:

     

    $ dd if=/dev/zero of=virtual.img bs=1M count=256
    $ du -h virtual.img
    

     

     

     

    然后我们要将这个文件格式化(写入文件系统),这里我们要学到一个(准确的说是一组)新的命令来完成这个需求。

     

    使用 mkfs 命令格式化磁盘(我们这里是自己创建的虚拟磁盘镜像)

     

    你可以在命令行输入 mkfs 然后按下Tab键,你可以看到很多个以 mkfs 为前缀的命令,这些不同的后缀其实就是表示着不同的文件系统,可以用 mkfs 格式化成的文件系统:

     

     

    我们可以简单的使用下面的命令来将我们的虚拟磁盘镜像格式化为ext4文件系统:

     

    $ mkfs.ext4 virtual.img
    

     

     

    可以看到实际 mkfs.ext4 是使用 mke2fs 来完成格式化工作的。mke2fs 的参数很多,不过我们也不会经常格式化磁盘来玩,所以就掌握这基本用法吧,等你有特殊需求时,再查看 man 文档解决。

     

    更多关于文件系统的知识,请查看wiki: 文件系统 ext3,ext4

     

    如果你想想知道 Linux 支持哪些文件系统你可以输入ls -l /lib/modules/$(uname -r)/kernel/fs(我们的环境中无法查看)查看。

     

    使用 mount 命令挂载磁盘到目录树

     

    用户在 Linux/UNIX 的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,此时用户要对该文件系统执行 mount 的指令以进行挂载。通常是使用在 USB 或其他可移除存储设备上,而根目录则需要始终保持挂载的状态。又因为 Linux/UNIX 文件系统可以对应一个文件而不一定要是硬件设备,所以可以挂载一个包含文件系统的文件到目录树。

     

    Linux/UNIX 命令行的 mount 指令是告诉操作系统,对应的文件系统已经准备好,可以使用了,而该文件系统会对应到一个特定的点(称为挂载点)。挂载好的文件、目录、设备以及特殊文件即可提供用户使用。

     

    我们先来使用mount来查看下主机已经挂载的文件系统:

     

    $ sudo mount
    

     

     

    输出的结果中每一行表示一个设备或虚拟设备,每一行最前面是设备名,然后是 on 后面是挂载点,type 后面表示文件系统类型,再后面是挂载选项(比如可以在挂载时设定以只读方式挂载等等)。

     

    那么我们如何挂载真正的磁盘到目录树呢,mount命令的一般格式如下:

     

    mount [options] [source] [directory]
    

     

    一些常用操作:

     

    mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
    

     

    我们现在直接来挂载我们创建的虚拟磁盘镜像到/mnt目录:

     

    $ mount -o loop -t ext4 virtual.img /mnt 
    # 也可以省略挂载类型,很多时候 mount 会自动识别
    
    # 以只读方式挂载
    $ mount -o loop --ro virtual.img /mnt
    # 或者mount -o loop,ro virtual.img /mnt
    

     

    使用 umount 命令卸载已挂载磁盘

     

    # 命令格式 sudo umount 已挂载设备名或者挂载点,如:
    $ sudo umount /mnt
    

     

    不过遗憾的是,由于我们环境的问题(环境中使用的 Linux 内核在编译时没有添加对 Loop device的支持),所以你将无法挂载成功:

     

     

    另外关于 loop 设备,你可能会有诸多疑问,那么请看下面来自维基百科/dev/loop的说明:

     

    在类 UNIX 系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。

    在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。

    这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用。

     

    使用 fdisk 为磁盘分区(关于分区的一些概念不清楚的用户请参看主引导记录

     

    同样因为环境原因中没有物理磁盘,也无法创建虚拟磁盘的原因我们就无法实验练习使用该命令了,下面我将以我的物理主机为例讲解如何为磁盘分区。

     

    # 查看硬盘分区表信息
    $ sudo fdisk -l
    

     

     

    输出结果中开头显示了我主机上的磁盘的一些信息,包括容量扇区数,扇区大小,I/O 大小等信息。

     

    我们重点开一下中间的分区信息,/dev/sda1,/dev/sda2 为主分区分别安装了 Windows 和 Linux 操作系统,/dev/sda3 为交换分区(可以理解为虚拟内存),/dev/sda4 为扩展分区其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四个逻辑分区,因为主机上有几个分区之间有空隙,没有对齐边界扇区,所以分区之间的不是完全连续的。

     

    # 进入磁盘分区模式
    $ sudo fdisk virtual.img
    

     

     

    在进行操作前我们首先应先规划好我们的分区方案,这里我将在使用 128M(可用 127M 左右)的虚拟磁盘镜像创建一个 30M 的主分区剩余部分为扩展分区包含 2 个大约 45M 的逻辑分区。

     

    操作完成后输入p查看结果如下:

     

     

    最后不要忘记输入w写入分区表。

     

    使用 losetup 命令建立镜像与回环设备的关联

     

    $ sudo losetup /dev/loop0 virtual.img
    # 如果提示设备忙你也可以使用其它的回环设备,"ls /dev/loop*"参看所有回环设备
    
    # 解除设备关联
    $ sudo losetup -d /dev/loop0
    

     

    然后再使用mkfs格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到kpartx工具,需要先安装:

     

    $ sudo apt-get install kpartx
    $ sudo kpart kpartx -av /dev/loop0
    
    # 取消映射
    $ sudo kpart kpartx -dv /dev/loop0
    

     

     

    接着再是格式化,我们将其全部格式化为 ext4:

     

    $ sudo mkfs.ext4 -q /dev/mapper/loop0p1
    $ sudo mkfs.ext4 -q /dev/mapper/loop0p5
    $ sudo mkfs.ext4 -q /dev/mapper/loop0p6
    

     

    格式化完成后在/media目录下新建四个空目录用于挂载虚拟磁盘:

     

    $ mkdir -p /media/virtualdisk_{1..3}
    

     

    # 挂载磁盘分区
    $ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
    $ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
    $ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3
    
    # 卸载磁盘分区
    $ sudo umount /dev/mapper/loop0p1
    $ sudo umount /dev/mapper/loop0p5
    $ sudo umount /dev/mapper/loop0p6
    

     

    然后:

     

    $ df -h
    

     

     

    作业

     

    cowsay命令,可以让你在终端里以一种动物说话的形式打印出一段话。

     

     

    第八节  命令执行顺序控制与管道

    一、命令执行顺序的控制

    1.顺序执行多条命令

    2.有选择的执行命令(&&就是用来实现选择性执行的,它表示如果前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0则执行后面的,否则不执行)

     

    二、管道

    cut 命令,打印每一行的某一字段:

    grep 命令,在文本中或 stdin 中查找匹配字符串:

    wc 命令,简单小巧的计数工具:

    uniq 去重命令:

     

    第九节 简单的文本处理

     

    在这一节中,主要讲解了文本处理的基本操作,诸如讲一段文字中的某个元素去掉,将两段文字拼接等方法。

     

    第十节 数据流重定向

    在这一节里,主要讲解了数据的重定向的概念,其与管道的区别和大量基本操作。

     

     

     

    第十一节 正则表达式基础

    一、正则表达式

    1. 举例

    2.基本语法:

    一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。

    二、grep模式匹配命令

    1.基本操作

    grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件。grep支持三种正则表达式引擎,分别用三个参数指定:

         

      

    参数

      
      

    说明

      

    -E

    POSIX扩展正则表达式,ERE

    -G

    POSIX基本正则表达式,BRE

    -P

    Perl正则表达式,PCRE

    在通过grep命令使用正则表达式之前,先介绍一下它的常用参数:

         

      

    参数

      
      

    说明

      

    -b

    将二进制文件作为文本来进行匹配

    -c

    统计以模式匹配的数目

    -i

    忽略大小写

    -n

    显示匹配文本所在行的行号

    -v

    反选,输出不匹配行的内容

    -r

    递归匹配查找

    -A n

    n为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行

    -B n

    n为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行

    --color=auto

    将输出中的匹配项设置为自动颜色显示

     

    2.使用正则表达式

    使用基本正则表达式,BRE

    下面包含完整的特殊符号及说明:

         

      

    特殊符号

      
      

    说明

      

    [:alnum:]

    代表英文大小写字节及数字,亦即 0-9, A-Z, a-z

    [:alpha:]

    代表任何英文大小写字节,亦即 A-Z, a-z

    [:blank:]

    代表空白键与 [Tab] 按键两者

    [:cntrl:]

    代表键盘上面的控制按键,亦即包括 CR, LF, Tab,   Del.. 等等

    [:digit:]

    代表数字而已,亦即 0-9

    [:graph:]

    除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键

    [:lower:]

    代表小写字节,亦即 a-z

    [:print:]

    代表任何可以被列印出来的字节

    [:punct:]

    代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...

    [:upper:]

    代表大写字节,亦即 A-Z

    [:space:]

    任何会产生空白的字节,包括空白键, [Tab], CR 等等

     

    使用扩展正则表达式,ERE。要通过grep使用扩展正则表达式需要加上-E参数,或使用egrep。

    三、sed 流编辑器

    sed工具用于过滤和转换文本的流编辑器。

     

    三、sed 流编辑器

      

      

    参数

      
      

    说明

      

    -n

    安静模式,只打印受影响的行,默认打印输入数据的全部内容

    -e

    用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数

    -f filename

    指定执行filename文件中的命令

    -r

    使用扩展正则表达式,默认为标准正则表达式

    -i

    将直接修改输入文件内容,而不是打印到标准输出设备

      

      

    命令

      
      

    说明

      

    s

    行内替换

    c

    整行替换

    a

    插入到指定行的后面

    i

    插入到指定行的前面

    p

    打印指定行,通常与-n参数配合使用

    d

    删除指定行

    四、awk文本处理语言

    AWK是一种优良的文本处理工具。

    pattern通常是是表示用于匹配输入的文本的“关系式”或“正则表达式”,action则是表示匹配后将执行的动作。

    awk处理文本的方式,是将文本分割成一些“字段”,然后再对这些字段进行处理,默认情况下,awk以空格作为一个字段的分割符。

    -F参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式) ,-v用于预先为awk程序指定变量,-f参数用于指定awk命令要执行的程序文件,或者在不加-f参数的情况下直接将程序语句放在这里,最后为awk需要处理的文本输入,且可以同时输入多个文本文件。

    四、作业

     

    第十二节   Linux下软件安装

    一、Linux 上的软件安装

    通常 Linux 上的软件安装主要:在线安装,从磁盘安装deb软件包,从二进制软件包安装,从源代码编译安装

    二、在线安装

    安装:

    升级:

     卸载:

     搜索:

     

    三、使用 dpkg 从本地磁盘安装 deb 软件包

    安装:

    四、从二进制包安装

    从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可。

    五、作业

     




  • 相关阅读:
    学指令 emacs篇
    c 排序 总结
    C# WinForm源码下载
    PetShop下载
    Visual Studio常用技巧
    人事信息管理系统(PMS)
    css实现细表格原理
    GridView导出Excel/Word
    dotnet程序员装机必备工具
    容器练习一
  • 原文地址:https://www.cnblogs.com/huangbobo/p/4824220.html
Copyright © 2020-2023  润新知