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

学习过程!!!!javascript

首先,是LINUX系统的诞生大事件,即它的历史。css

  • 1965 年,Bell 实验室、MIT、GE(通用电气公司)准备开发 Multics 系统,为了同时支持 300 个终端访问主机,可是 1969 年失败了;前端

    刚开始并无鼠标、键盘,输入设备只有卡片机,所以若是要测试某个程序,则须要将读卡纸插入卡片机,若是有错误,还须要从新来过; Multics:Multiplexed Information and Computing Servicejava

  • 1969 年,Ken Thompson(C语言之父)利用汇编语言开发了 FIle Server System(Unics,即 UNIX 的原型)node

    由于汇编语言对于硬件的依赖性,所以只能针对特定硬件; 只是为了移植一款“太空旅游”的游戏;python

  • 1973 年,Dennis Ritchie 和 Ken Thompson 发明了 C 语言,然后写出了 UNIX 的内核linux

    将 B 语言改为 C 语言,由此产生了 C 语言之父; 90% 的代码是 C 语言写的,10% 的代码用汇编写的,所以移植时只要修改那 10% 的代码便可;nginx

  • 1977 年,Berkeley 大学的 Bill Joy 针对他的机器修改 UNIX 源码,称为BSD(Berkeley Software Distribution)git

    Bill Joy 是 Sun 公司的创始人;web

  • 1979 年,UNIX 发布 System V,用于我的计算机;

  • 1984 年,由于 UNIX 规定:“不能对学生提供源码”,Tanenbaum 老师本身编写兼容于 UNIX 的Minix,用于教学;

  • 1984 年,Stallman 开始 GNU(GNU's Not Unix)项目,创办 FSF(Free Software Foundation)基金会;

    产品:GCC、Emacs、Bash Shell、GLIBC; 倡导“自由软件”; GNU 的软件缺少一个开放的平台运行,只能在 UNIX 上运行; 自由软件指用户能够对软件作任何修改,甚至再发行,可是始终要挂着 GPL 的版权; 自由软件是能够卖的,可是不能只卖软件,而是卖服务、手册等;

  • 1985 年,为了不 GNU 开发的自由软件被其余人用做专利软件,所以建立 GPL(General Public License)版权声明;

  • 1988 年,MIT 为了开发 GUI,成立了 XFree86 的组织;

  • 1991 年,芬兰赫尔辛基大学的研究生 Linus Torvalds 基于 gcc、bash 开发了针对 386 机器的 Linux 内核;

  • 1994 年,Torvalds 发布 Linux-v1.0;

  • 1996 年,Torvalds 发布 Linux-v2.0,肯定了 Linux 的吉祥物:企鹅; Linux-v2.0,肯定了 Linux 的吉祥物:企鹅;

其次,是关键人物的介绍。

1.Ken Thompson:C 语言之父和 UNIX 之父

2.Dennis Ritchie:C 语言之父和 UNIX 之父

3.Stallman:著名黑客,GNU 创始人,开发了 Emacs、gcc、bash shell

4.Bill Joy:BSD 开发者

5.Tanenbaum:Minix 开发者

6.Linus Torvalds:Linux 之父,芬兰赫尔辛基大学

3、Linux 与 Windows 到底有哪些不一样

1.免费与收费

  • 最新正版 Windows8.1 官方售价 ¥888;
  • Linux 免费或少量费用。

2.软件与支持

  • Windows 平台:数量和质量的优点,不过大部分为收费软件;由微软官方提供重要支持和服务;
  • Linux 平台:大都为开源自由软件,用户能够修改定制和再发布,因为基本免费没有资金支持,部分软件质量和体验欠缺;有全球全部的 Linux 开发者和自由软件社区提供支持。

3.安全性

  • Windows 平台:三天两头打补丁安装系统安全更新,仍是会中病毒木马;
  • Linux 平台:要说 Linux 没有安全问题,那固然是不可能的,这一点仁者见仁智者见智,相对来讲确定比 Windows 平台要更加安全,使用 Linux 你也不用装某杀毒,某毒霸。

4.使用习惯

  • Windows:普通用户基本都是纯图形界面下操做使用,依靠鼠标和键盘完成一切操做,用户上手容易入门简单;
  • Linux:兼具图形界面操做(须要使用带有桌面环境的发行版)和彻底的命令行操做,能够只用键盘完成一切操做,新手入门较困难,须要一些学习和指导(这正是咱们要作的事情),一旦熟练以后效率极高。

5.可定制性

  • Windows:这些年以前算是全封闭的,系统可定制性不好;
  • Linux:你想怎么作就怎么作,Windows 能作到得它都能,Windows 作不到的,它也能。

6.应用范畴

或许你以前不知道 Linux ,要知道,你以前在 Windows 使用百度,谷歌,上淘宝,聊 QQ 时,支撑这些软件和服务的,是后台成千上万的 Linux 服务器主机,它们时时刻刻都在进行着忙碌的数据处理和运算,能够说世界上大部分软件和服务都是运行在 Linux 之上的。

7.Windows 没有的

  • 稳定的系统
  • 安全性和漏洞的快速修补
  • 多用户
  • 用户和用户组的规划
  • 相对较少的系统资源占用
  • 可定制裁剪,移植到嵌入式平台(如安卓设备)
  • 可选择的多种图形用户界面(如 GNOME,KDE)

8.Linux 没有的

  • 没有特定的支持厂商
  • 游戏娱乐支持度不足
  • 专业软件支持度不足

LINUX基本概念及操做!!!

 

实验介绍

本节实验主要有:

一、实验楼环境介绍 二、经常使用 Shell 命令及快捷键 三、Linux 使用小技巧

 

1、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终端

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 是指“提供给使用者使用界面”的软件(命令解析器),相似于 DOS 下的 command(命令行)和后来的 cmd.exe。普通意义上的 Shell 就是能够接受用户输入命令的程序。它之因此被称做 Shell 是由于它隐藏了操做系统底层的细节。一样的 Unix/Linux 下的图形用户界面 GNOME 和 KDE,有时也被叫作“虚拟 shell”或“图形 shell”。

Unix/Linux 操做系统下的 Shell 既是用户交互的界面,也是控制系统的脚本语言。

。在Windows 操做系统下,可能有些用户历来都不会直接的使用 Shell,然而在 UNIX 系列操做系统下,Shell 仍然是控制系统启动、X11 启动和不少其余实用工具的脚本解释程序。

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

3.命令行操做体验

1).重要快捷键:

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

[Tab]

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

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

[Ctrl+c]

想一想你有没有遇到这种状况,当你在 Linux 命令行中无心输入了一个不知道的命令,或者错误的使用了一个命令,致使在终端里出现了你没法预料的状况,好比,只有光标在闪烁没法继续输入命令,或者不停地在输出一大堆你不想要的结果。你想要当即中止并恢复到你可控的状态,那该怎么办呢。这时候你就能够使用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:

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

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 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

你能够先使用以下命令安装:

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

而后:


以下:$ banner shiyanlou

 

实验三:用户及文件权限管理

实验介绍

一、Linux 中建立、删除用户,及用户组等操做。 二、Linux 中的文件权限设置。

1、Linux 用户管理

1.查看用户

输入 who am i 

输入的第一列表示打开当前伪终端的用户的用户名(要查看当前登陆用户的用户名,去掉空格直接使用 whoami 便可),第二列的 pts/0 中 pts 表示伪终端,所谓伪是相对于 /dev/tty 设备而言的,还记得上一节讲终端时的那七个使用 [Ctrl]+[Alt]+[F1]~[F7] 进行切换的 /dev/tty 设备么,这是“真终端”,伪终端就是当你在图形用户界面使用 /dev/tty7 时每打开一个终端就会产生一个伪终端, pts/0 后面那个数字就表示打开的伪终端序号,你能够尝试再打开一个终端,而后在里面输入 who am i ,看第二列是否是就变成 pts/1 了,第三列则表示当前伪终端的启动时间。

who 命令其它经常使用参数

参数 说明
-a 打印能打印的所有
-d 打印死掉的进程
-m am i,mom likes
-q 打印当前登陆用户数及用户名
-u 打印当前登陆用户登陆信息
-r 打印运行等级

2.建立用户

在 Linux 系统里, root 帐户拥有整个系统至高无上的权利,好比 新建/添加 用户。

咱们通常登陆系统时都是以普通帐户的身份登陆的,要建立用户须要 root 权限,这里就要用到 sudo 这个命令了。不过使用这个命令有两个大前提,一是你要知道当前登陆用户的密码,二是当前用户必须在 sudo 用户组。shiyanlou 用户的密码就是 “shiyanlou” ,它同时也属于 sudo 用户组

以下:

这个命令不但能够添加用户到系统,同时也会默认为新用户建立 home 目录:

ls /home

如今你已经建立好一个用户,而且你能够使用你建立的用户登陆了,使用以下命令切换登陆用户:

$ su -l lilei
退出当前用户跟退出终端同样能够使用 exit 命令或者使用快捷键 Ctrl+d
exitCtrl+d

3.用户组

在 Linux 里面如何知道本身属于哪些用户组呢?

方法一:使用groups命令



$ groups shiyanlou

方法二:查看/etc/group文件

$ cat /etc/group | sort 

这里 cat 命令用于读取指定文件的内容并打印到终端输出,后面会详细讲它的使用。 | sort 表示将读取的文本进行一个字典排序再输出,而后你将看到以下一堆输出,你能够在最下面看到 shiyanlou 的用户组信息:

没找到,不要紧,你能够使用命令过滤掉一些你不想看到的结果:



$ cat /etc/group | grep -E "shiyanlou|sudo"

etc/group 文件格式说明

/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每一个用户组一条记录。格式以下:

group_name:password:GID:user_list

你看到上面的 password 字段为一个 'x' 并非说密码就是它,只是表示密码不可见而已。

将其它用户加入 sudo 用户组

默认状况下新建立的用户是不具备 root 权限的,也不在 sudo 用户组,可让其加入sudo用户组从而获取 root 权限。

$ su -l lilei $ sudo ls 

会提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用户组中,至于 sudoers 文件(/etc/sudoers)你如今最好不要动它,操做不慎会致使比较麻烦的后果。

使用 usermod 命令能够为用户添加用户组,一样使用该命令你必需有 root 权限,你能够直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令

 用 shiyanlou 用户执行 sudo 命令将 lilei 添加到 sudo 用户组,让它也能够使用 sudo 命令得到 root 权限

4.删除用户

删除用户是很简单的事:

 

2、Linux 文件权限

1.查看文件权限

咱们以前已经不少次用到 ls 命令了,如你所见,咱们用它来列出并显示当前目录下的文件,固然这是在不带任何参数的状况下,它能作的固然不止这么多,如今咱们就要用它来查看文件权限。

使用较长格式列出文件:

$ ls -l 

 

 

  • 文件类型

关于文件类型,这里有一点你必需时刻牢记Linux 里面一切皆文件,正由于这一点才有了设备文件( /dev 目录下有各类设备文件,大都跟具体的硬件设备相关)这一说,还有 socket(网络套接字,具体是什么,感兴趣的用户能够本身去了解或期待实验楼的后续相关课程),和 pipe (管道,这个东西很重要,咱们之后将会讨论到,这里你先知道有它的存在便可)。软连接文件,连接文件是分为两种的,另外一种固然是“硬连接”(硬连接不经常使用,具体内容不做为本课程讨论重点,而软连接等同于 Windows 上的快捷方式,你记住这一点就够了)

  • 文件权限

读权限,表示你能够使用 cat <file name> 之类的命令来读取某个文件的内容;写权限,表示你能够编辑和修改某个文件; 执行权限,一般指能够运行的二进制程序文件或者脚本文件,如同 Windows 上的 'exe' 后缀的文件,不过 Linux 上不是经过文件后缀名来区分文件的类型。你须要注意的一点是,一个目录要同时具备读权限和执行权限才能够打开,而一个目录要有写权限才容许在其中建立其它文件,这是由于目录文件实际保存着该目录里面的文件的列表等信息

全部者权限,这一点相信你应该明白了,至于所属用户组权限,是指你所在的用户组中的全部其它用户对于该文件的权限,好比,你有一个艾派德,那么这个用户组权限就决定了你的兄弟姐妹有没有权限使用它破坏它和占有它。

  • 连接数

连接到该文件所在的 inode 结点的文件名数目(关于这个概念涉及到 Linux 文件系统的相关概念知识,不在本课程的讨论范围,感兴趣的用户能够本身去了解)。

  • 文件大小

以 inode 结点大小为单位来表示的文件大小,你能够给 ls 加上 -lh 参数来更直观的查看文件的大小。

明白了文件权限的一些概念,咱们顺带补充一下关于 ls 命令的一些其它经常使用的用法:

  • 显示除了 '.'(当前目录),'..' 上一级目录以外的全部包含隐藏文件(Linux 下以 '.' 开头的文件为隐藏文件)
$ ls -A

固然,你能够同时使用 '-A' 和 '-l' 参数:

$ ls -Al 

查看某一个目录的完整属性,而不是显示目录里面的文件属性:

$ ls -dl <目录名> 
  • 显示全部文件大小,并以普通人类能看懂的方式呈现:
$ ls -AsSh 

其中小 s 为显示文件大小,大 S 为按文件大小排序,若须要知道如何按其它方式排序,请使用“man”命令查询。

2.变动文件全部者

假设目前是 lilei 用户登陆,新建一个文件,命名为 “iphone6”:

$ touch iphone6

如今,使用如下命令变动文件全部者为 shiyanlou :



$ cd /home/lilei $ ls iphone6 $ sudo chown shiyanlou iphone6 $ cp iphone6 /home/shiyanlou

3.修改文件权限

若是你有一个本身的文件不想被其余用户读、写、执行,那么就须要对文件的权限作修改,这里有两种方式:

  • 方式一:二进制数字表示

每一个文件的三组权限(拥有者,所属用户组,其余用户,记住这个顺序是必定的)就对应这一个 "rwx",也就是一个 '7' ,因此若是我要将文件“iphone6”的权限改成只有我本身能够用那么就这样:

为了演示,我先在文件里加点内容:

$ echo "echo \"hello shiyanlou\"" > iphone6 

而后修改权限:

$ chmod 700 iphone6 

如今,其余用户已经不能读这个“iphone6”文件了:

  • 方式二:加减赋值操做

完成上述相同的效果,你能够:



'g''o'还有'u',分别表示group,others,user,'+','-' 就分别表示增长和去掉相应的权限。
做业Q!!!!
添加一个用户,使用建立文件,设置成用户能够读写。$ chmod go-rw iphoneloutestsudo/opt/forloutestloutest

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

实验介绍

一、Linux 的文件组织目录结构。 二、相对路径和绝对路径。 三、对文件的移动、复制、重命名、编辑等操做。

1、Linux 目录结构

  Linux 的目录与 Windows 的目录的区别

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

1.FHS 标准

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

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

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

2.目录路径

路径

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

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

进入上一级目录:

$ cd .. 

进入你的“home”目录:

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

使用 pwd 获取当前路径:

$ pwd 

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

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

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

2、Linux 文件的基本操做

1.新建

新建空白文件

使用 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

 

删除目录

跟复制目录同样,要删除一个目录,也须要加上-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 passwdnlcat -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命令查看文件

仍是拿 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

做业

环境变量与文件查找


实验介绍

本节实验介绍环境变量的做用与用法,及几种搜索文件的方法。学会这些技巧高效地使用 Linux。

1、环境变量

1.变量

要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变量,所谓变量就是计算机中用于记录一个值(不必定是数值,也能够是字符或字符串)的符号,而这些符号将用于不一样的运算处理中。一般变量与值是一对一的关系,能够经过表达式读取它的值赋值给其它变量,也能够直接指定数值赋值给任意变量。为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等等数据类型。Shell 中的变量也基本如此,有不一样类型(但不用专门指定类型名),能够参与运算,有做用域限定。

变量的做用域即变量的有效范围(好比一个函数中、一个源文件中或者全局范围),在该范围内只能有一个同名变量。一旦离开则该变量无效,如同不存在这个变量通常。

在 Shell 中如何建立一个变量,如何给变量赋值和如何读取变量的值呢?这部份内容会在bash 脚本编程这门课中详细介绍,这里我简单举例说明一下:

使用declare命令建立一个变量名为 tmp 的变量:

$ declare tmp 

其实也能够不用 declare 预声明一个变量,直接即用即建立,这里只是告诉你 declare 的做用,这在建立其它指定类型的变量(如数组)时会用到。

使用=号赋值运算符为变量 tmp 赋值为 shiyanlou:



$ tmp=shiyanlou

读取变量的值,使用echo命令和$符号($符号用于表示引用一个变量的值,初学者常常会忘记输入):


操做以下:$ echo $tmp
注意:关于变量名,并非任何形式的变量名都是可用的,变量名只能是英文字母,数字或者下划线,且不能以数字做为开头。

2.环境变量

环境变量就是做用域比自定义变量要大,如Shell 的环境变量做用于自身和它的子进程。在全部的 UNIX 和类 UNIX 系统中,每一个进程都有其各自的环境变量设置,且默认状况下,当一个进程被建立时,处理建立过程当中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也做为一个进程运行在操做系统之上,而咱们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。

一般咱们会涉及到的环境变量有三种:

  • 当前 Shell 进程私有用户自定义变量,如上面咱们建立的 temp 变量,只在当前 Shell 中有效。
  • Shell 自己内建的变量。
  • 从自定义变量导出的环境变量。

也有三个与上述三种环境变量相关的命令,setenvexport。这三个命令很类似,均可以用于打印相关环境变量,区别在于涉及的是不一样范围的环境变量,详见下表:

命令 说明
set 显示当前 Shell 全部环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量
env 显示与当前用户相关的环境变量,还可让命令在指定环境中运行
export 显示从 Shell 中导出成环境变量的变量,也能经过它将自定义变量导出为环境变量

你能够更直观的使用vimdiff工具比较一下它们之间的差异:

$ temp=shiyanlou
$ export temp_env=shiyanlou $ env|sort>env.txt $ export|sort>export.txt $ set|sort>set.txt 

上述操做将命令输出经过管道|使用sort命令排序,再重定向到对象文本文件中。

$ vimdiff env.txt export.txt set.txt 

使用vimdiff工具比较导出的几个文件的内容。

关于环境变量,能够简单的理解成在当前进程的子进程是否有效,有效则为环境变量,不然不是(有些人也将全部变量统称为环境变量,只是以全局环境变量和局部环境变量进行区分,咱们只要理解它们的实质区别便可)。咱们这里用export命令来体会一下,先在 Shell 中设置一个变量temp=shiyanlou,而后再新建立一个子 Shell 查看temp变量的值:

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

咱们在 Shell 中输入一个命令,Shell 是怎么知道在哪去找到这个命令而后执行的呢?这是经过环境变量PATH来进行搜索的,熟悉 Windows 的用户可能知道 Windows 中的也是有这么一个 PATH 环境变量。这个PATH里面就保存了Shell中执行的命令的搜索路径。

查看PATH环境变量的内容:

$ echo $PATH 

默认状况下你会看到以下输出:



下面咱们将练习建立一个最简单的可执行 Shell 脚本和一个使用 C 语言建立的"hello world"程序,/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
#!/bin/zsh for ((i=0; i<10; i++));do echo "hello shell" done exit 0 

为文件添加可执行权限:

$ chmod 755 hello_shell.sh 

执行脚本

$ ./hello_shell.sh 

建立一个 C 语言"hello world"程序:

$ vim hello_world.c 
#include <stdio.h> int main(void) { printf("hello world!\n"); return 0; } 

使用 gcc 生成可执行文件:

$ gcc -o hello_world hello_world.c 

gcc 生成二进制文件默认具备可执行权限,不须要修改

在 shiyanlou 家目录建立一个mybin目录,并将上述 hello_shell.sh 和 hello_world 文件移动到其中:

$ mkdir mybin $ mv hello_shell.sh hello_world mybin/ 

如今你能够在mybin目录中分别运行你刚刚建立的两个程序:



$ cd mybin $ ./hello_shell.sh $ ./hello_world

4.添加自定义路径到“PATH”环境变量

在前面咱们应该注意到PATH里面的路径是以做为分割符,因此咱们能够这样添加自定义路径:

$ PATH=$PATH:/home/shiyanlou/mybin 

注意这里必定要使用绝对路径

下面咱们就来讲说后一种方式——让它自动执行。

在每一个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是.zshrc,相应 Bash 的配置文件为.bashrc。它们在etc下还都有一个或多个全局的配置文件,不过咱们通常只修改用户目录下的配置文件。

咱们能够简单的使用下面命令直接添加内容到.zshrc中:



上述命令中表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的是以覆盖的方式重定向到一个文件中,使用的时候必定要注意分辨。在指定文件不存在的状况下都会建立新的文件。

$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc>>>

5.修改和删除已有变量

变量修改

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

变量设置方式 说明
${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据
${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串
${变量名//旧的字串/新的字串} 将符合旧字串的所有字串替换为新的字串

好比要修改咱们前面添加到 PATH 的环境变量。为了不操做失误致使命令找不到,咱们先将 PATH 赋值给一个新的自定义变量 path:

$ path=$PATH $ echo $path $ path=${path%/home/shiyanlou/mybin} # 或使用通配符,*表示任意多个任意字符 $ path=${path%*/mybin} 

变量删除

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

$ unset temp 

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

在上面咱们在 Shell 中修改了一个配置脚本文件以后(好比 zsh 的配置文件 home 目录下的.zshrc),每次都要退出终端从新打开甚至重启主机以后其才能生效,非常麻烦,咱们能够使用source命令来让其当即生效,如:

$ source .zshrc 

source命令还有一个别名就是.,注意与表示当前路径的那个点区分开,虽然形式同样,但做用和使用方式同样,上面的命令若是替换成.的方式就该是

$ . ./.zshrc 

注意第一个点后面有一个空格,并且后面的文件必须指定完整的绝对或相对路径名,source 则不须要。

2、搜索文件

与搜索相关的命令经常使用的有以下几个whereis,which,find,locate

  • whereis简单快速
$whereis who 

你会看到它找到了三个路径,两个可执行文件路径和一个 man 在线帮助文件所在路径,这个搜索很快,由于它并无从硬盘中依次查找,而是直接从数据库中查询。whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。若是想要得到更全面的搜索结果能够使用locate命令。

  • locate快而全

经过"/var/lib/mlocate/mlocate.db"数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务天天自动执行updatedb命令更新一次,因此有时候你刚添加的文件,它可能会找不到,须要手动执行一次updatedb命令(在咱们的环境中必须先执行一次该命令)。它能够用来查找指定目录下的不一样文件类型,如查找 /etc 下全部以 sh 开头的文件:

$ locate /etc/sh 

注意,它不仅是在 etc 目录下查找并会自动递归子目录进行查找

查找 /usr/share/ 下全部 jpg 文件:

$ locate /usr/share/\*.jpg 

注意要添加*号前面的反斜杠转义,不然会没法找到

若是想只统计数目能够加上-c参数,-i参数能够忽略大小写进行查找,whereis 的-b,-m-s一样能够是使用。

  • which小而精

which自己是 Shell 内建的一个命令,咱们一般使用which来肯定是否安装了某个指定的软件,由于它只从PATH环境变量指定的路径中去搜索命令:

$ which man 
  • find精而细

find应该是这几个命令中最强大的了,它不但能够经过文件类型、文件名进行查找并且能够根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。find命令强大到,要把它将明白至少须要单独好几节课程才行,咱们这里只介绍一些经常使用的内容。

在指定目录下搜索指定文件名的文件:

$ find /etc/ -name interfaces 

注意 find 命令的路径是做为第一个参数的, 基本命令格式为 find [path] [option] [action]

与时间相关的命令参数:

参数 说明
-atime 最后访问时间
-ctime 建立时间
-mtime 最后修改时间

下面以-mtime参数举例:

  • -mtime n: n 为数字,表示为在n天以前的”一天以内“修改过的文件
  • -mtime +n: 列出在n天以前(不包含n天自己)被修改过的文件
  • -mtime -n: 列出在n天以前(包含n天自己)被修改过的文件
  • newer file: file为一个已存在的文件,列出比file还要新的文件名

列出 home 目录中,当天(24 小时以内)有改动的文件:

$ find ~ -mtime 0 

列出用户家目录下比Code文件夹新的文件:

$ find ~ -newer /home/shiyanlou/Code 

做业

《黑客帝国》电影里满屏幕代码的“数字雨”,在 Linux 里面你也能够轻松实现这样的效果,你只须要一个命令cmatrix

须要先安装,由于 Ubuntu 没有预装:

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

装好以后先不要急着执行,为了看到更好的效果,咱们须要先修改终端的主题配色,修改成黑底绿字,修改方法见下图:

 

实验六:文件打包与压缩

实验介绍

Linux 上经常使用的 压缩/解压 工具,介绍了 zip,rar,tar 的使用。

Windows 上咱们最多见的不外乎这三种*.zip,*.rar,*.7z后缀的压缩文件,而在 Linux 上面常见经常使用的除了以上这三种外,还有*.gz,*.xz,*.bz2,*.tar,*.tar.gz,*.tar.xz,*tar.bz2,简单介绍以下:

文件后缀名 说明
*.zip zip程序打包压缩的文件
*.rar rar程序压缩的文件
*.7z 7zip程序压缩的文件
*.tar tar程序打包,未压缩的文件
*.gz gzip程序(GNU zip)压缩的文件
*.xz xz程序压缩的文件
*.bz2 bzip2程序压缩的文件
*.tar.gz tar打包,gzip程序压缩的文件
*.tar.xz tar打包,xz程序压缩的文件
*tar.bz2 tar打包,bzip2程序压缩的文件
*.tar.7z tar打包,7z程序压缩的文件

讲了这么多种压缩文件,这么多个命令,不过咱们通常只须要掌握几个命令便可,包括zip,rar,tar。下面会依次介绍这几个命令及对应的解压命令。

1.zip压缩打包程序

  • 使用zip打包文件夹:
  • 设置压缩级别为9和1(9最大,1最小),从新打包:

内容以下:

解释:

上面命令将 shiyanlou 的 home 目录打包成一个文件,并查看了打包后文件的大小和类型。第一行命令中,-r参数表示递归打包包含子目录的所有内容,-q参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。后面使用du命令查看打包后文件的大小(后面会具体说明该命令)。

这里添加了一个参数用于设置压缩级别-[1-9],1表示最快压缩但体积大,9表示体积最小但耗时最久。最后那个-x是为了排除咱们上一次建立的 zip 文件,不然又会被打包进这一次的压缩文件中,注意:这里只能使用绝对路径,不然不起做用

咱们再用du命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小:



$ du -h -d 0 *.zip ~ | sort

经过man 手册可知:

  • h, --human-readable(顾名思义,你能够试试不加的状况)

  • d, --max-depth(所查看文件的深度)

建立加密zip包

使用-e参数能够建立加密压缩包:

$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou

,在 Windows 为 CR+LF(Carriage-Return+Line-Feed:回车加换行),而在 Linux/Unix 上为 LF(换行),因此若是在不加处理的状况下,在 Linux 上编辑的文本,在 Windows 系统上打开可能看起来是没有换行的。若是你想让你在 Linux 建立的 zip 压缩文件在 Windows 上解压后没有任何问题,那么你还须要对命令作一些修改:



须要加上参数将转换为来达到以上目的。$ zip -r -l -o shiyanlou.zip /home/shiyanlou-lLFCR+LF

2.使用unzip命令解压缩zip文件

shiyanlou.zip解压到当前目录:

$ unzip shiyanlou.zip 

使用安静模式,将文件解压到指定目录:



$ unzip -q shiyanlou.zip -d ziptest

 

注意: 使用unzip解压文件时咱们一样应该注意兼容问题,不过这里咱们关心的再也不是上面的问题,而是中文编码的问题,一般 Windows 系统上面建立的压缩文件,若是有有包含中文的文档或以中文做为文件名的文件时默认会采用 GBK 或其它编码,而 Linux 上面默认使用的是 UTF-8 编码,若是不加任何处理,直接解压的话可能会出现中文乱码的问题(有时候它会自动帮你处理),为了解决这个问题,咱们能够在解压时指定编码类型。

使用-O(英文字母,大写o)参数指定编码类型:



unzip -O GBK 中文压缩文件.zip

3.rar打包压缩命令

rar也是 Windows 上经常使用的一种压缩文件格式,在 Linux 上能够使用rarunrar工具分别建立和解压 rar 压缩包。

  • 安装rarunrar工具:


$ sudo apt-get update $ sudo apt-get install rar unrar
  • 从指定文件或目录建立压缩包或添加文件到压缩包:
$ rm *.zip $ rar a shiyanlou.rar . 

上面的命令使用a参数添加一个目录到一个归档文件中,若是该文件不存在就会自动建立。

注意:rar 的命令参数没有-,若是加上会报错。

  • 从指定压缩包文件中删除某个文件:
$ rar d shiyanlou.rar .zshrc 
  • 查看不解压文件:
$ rar l shiyanlou.rar 
  • 使用unrar解压rar文件

全路径解压:

$ unrar x shiyanlou.rar 

去掉路径解压:

$ mkdir tmp $ unrar e shiyanlou.rar tmp/ 

rar命令参数很是多,上面只涉及了一些基本操做

4.tar打包工具

在 Linux 上面更经常使用的是tar工具,tar 本来只是一个打包工具,只是同时仍是实现了对 7z,gzip,xz,bzip2 等工具的支持,这些压缩工具自己只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,因此咱们也无需再单独去学习其余几个工具,tar 的解压和压缩都是同一个命令,只需参数不一样,使用比较方便。

下面先掌握tar命令一些基本的使用方式,即不进行压缩只是进行打包(建立归档文件)和解包的操做。

  • 建立一个 tar 包:


$ tar -cf shiyanlou.tar ~

 

上面命令中,-c表示建立一个 tar 包文件,-f用于指定建立的文件名,注意文件名必须紧跟在-f参数以后,好比不能写成tar -fc shiyanlou.tar,能够写成tar -f shiyanlou.tar -c ~。你还能够加上-v参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的/,你也能够使用-P保留绝对路径符。

  • 解包一个文件(-x参数)到指定路径的已存在目录(-C参数):
$ mkdir tardir $ tar -xf shiyanlou.tar -C tardir 
  • 只查看不解包文件-t参数:
$ tar -tf shiyanlou.tar 
  • 保留文件属性和跟随连接(符号连接或软连接),有时候咱们使用tar备份文件当你在其余主机还原时但愿保留文件的属性(-p参数)和备份连接指向的源文件而不是连接自己(-h参数):
$ tar -cphf etc.tar /etc 

对于建立不一样的压缩格式的文件,对于tar来讲是至关简单的,须要的只是换一个参数,这里咱们就以使用gzip工具建立*.tar.gz文件为例来讲明。

  • 咱们只须要在建立 tar 文件的基础上添加-z参数,使用gzip来压缩文件:
$ tar -czf shiyanlou.tar.gz ~ 
  • 解压*.tar.gz文件:


$ tar -xzf shiyanlou.tar.gz

如今咱们要使用其余的压缩工具建立或解压相应文件只须要更改一个参数便可:

压缩文件格式 参数
*.tar.gz -z
*.tar.xz -J
*tar.bz2 -j

tar 命令的参数不少,不过经常使用的就是上述这些,须要了解更多你能够查看 man 手册获取更多帮助。

做业

天冷的时候,要是有个火炉就行了。这里有个有趣的程序:



$ sudo apt-get install libaa-bin # 提示command not found,请自行解决 $ aafire

实验七:文件系统操做与磁盘管理

实验介绍

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

1、简单文件系统操做

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

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

这个命令前面其实已经用了不少次了:

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

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



# 只查看1级目录的信息 $ du -h -d 0 ~ # 查看2级 $ du -h -d 1 ~
(estimate file space usage)命令与(report file system disk space usage)只用一字只差,首先就但愿注意不要弄混淆了,以能够像我这样从man手册中获取命令的完整描述,记全称就不会搞混了。dudf

2、简单的磁盘管理

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

一般状况下,这一小节应该直接将如何挂载卸载磁盘,如何格式化磁盘,如何分区,但如你所见,咱们的环境中没东西给你挂,也没东西给你格和分,因此首先咱们会先建立一个虚拟磁盘来进行后续的练习操做

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
 
 

使用 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 的参数不少,不过咱们也不会常常格式化磁盘来玩,

使用 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 设备

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

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

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

使用 fdisk 为磁盘分区

一样由于环境缘由中没有物理磁盘,也没法建立虚拟磁盘的缘由咱们就没法实验练习使用该命令了,下面我将以个人物理主机为例讲解如何为磁盘分区。

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

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



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

操做完成后输入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命令,可让你在终端里以一种动物说话的形式打印出一段话。

 

实验八:命令执行顺序控制与管道

实验介绍

顺序执行、选择执行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧。

1、命令执行顺序的控制

1.顺序执行多条命令

每次从新开始实验就得sudo apt-get update,如今已经没有这个问题了),那么你可能会有以下一系列操做:

$ sudo apt-get update # 等待——————————而后输入下面的命令 $ sudo apt-get install some-tool # 等待——————————而后输入下面的命令 $ some-tool 

这时你可能就会想要是我能够一次性输入完,让它本身去一次执行各命令就行了,这就是咱们这一小节要解决的问题。

简单的顺序执行你能够使用;来完成,好比上述操做你能够:

$ sudo apt-get update;sudo apt-get install some-tool;some-tool # 让它本身运行 

2.有选择的执行命令

好比咱们使用which来查找是否安装某个命令,若是找到就执行该命令,不然什么也不作(虽然这个操做没有什么实际意义,但可帮你更好的理解一些概念):

$ which cowsay>/dev/null && cowsay -f head-in ohch~ 

你若是没有安装cowsay,你能够先执行一次上述命令,你会发现什么也没发生,你再安装好以后你再执行一次上述命令,你也会发现一些惊喜。

上面的&&就是用来实现选择性执行的,它表示若是前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0则执行后面的,不然不执行,你能够从$?环境变量获取上一次命令的返回结果:

学习过 C 语言的用户应该知道在 C 语言里面&&表是逻辑与,并且还有一个||表示逻辑或,一样 Shell 也有一个||,它们的区别就在于,shell中的这两个符号除了也可用于表示逻辑与和或以外,就是能够实现这里的命令执行顺序的简单控制。||在这里就是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令:

$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install" 

除了上述基本的使用以外,咱们还能够结合这&&||来实现一些操做,好比:



$ which cowsay>/dev/null && echo "exist" || echo "not exist"
 
 

我画个流程图来解释一下上面的流程:

2、管道

管道是什么,管道是一种通讯机制,一般用于进程间的通讯(也可经过socket进行网络通讯),它表现出来的形式就是将前面每个进程的输出(stdout)直接做为下一个进程的输入(stdin)。

管道又分为匿名管道和具名管道(这里将不会讨论在源程序中使用系统调用建立并使用管道的状况,它与命令行的管道在内核中实际都是采用相同的机制)。咱们在使用一些过滤程序时常常会用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的内容中咱们已经屡次使用到了。具名管道简单的说就是有名字的管道,一般只会在源程序中用到具名管道。

下面咱们就将经过一些经常使用的能够使用管道的"过滤程序"来帮助你熟练管道的使用。

1.试用

先试用一下管道,好比查看/etc目录下有哪些文件和目录,使用ls命令来查看:

$ ls -al /etc 

有太多内容,屏幕不能彻底显示,这时候能够使用滚动条或快捷键滚动窗口来查看。不过这时候能够使用管道:



$ ls -al /etc | less

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

打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:



$ cut /etc/passwd -d ':' -f 1,6
 
 

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

grep命令是很强大的,也是至关经常使用的一个命令,它结合正则表达式能够实现很复杂却很高效的匹配和查找,不过在学习正则表达式以前,这里介绍它简单的使用,而关于正则表达式后面将会有单独一小节介绍到时会再继续学习grep命令和其余一些命令。

grep命令的通常形式为:



grep [命令选项]... 用于匹配的表达式 [文件]...

仍是先体验一下,咱们搜索/home/shiyanlou目录下全部包含"shiyanlou"的全部文本文件,并显示出如今文本中的行号:

$ grep -rnI "shiyanlou" ~
 
 

-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件。这个操做实际没有多大意义,但能够感觉到grep命令的强大与实用。

固然也能够在匹配字段中使用正则表达式,下面简单的演示:



# 查看环境变量中以"yanlou"结尾的字符串 $ export | grep ".*yanlou$"
其中就表示一行的末尾。$

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

wc 命令用于统计并输出一个文件中行、单词和字节的数目,好比输出/etc/passwd文件的统计信息:

$ wc /etc/passwd 

分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数:

# 行数 $ wc -l /etc/passwd # 单词数 $ wc -w /etc/passwd # 字节数 $ wc -c /etc/passwd # 字符数 $ wc -m /etc/passwd # 最长行字节数 $ wc -L /etc/passwd 

注意:对于西文字符来讲,一个字符就是一个字节,但对于中文字符一个汉字是大于2个字节的,具体数目是由字符编码决定的


上面还包括告终合管道的运行。

5.sort 排序命令

这个命令前面咱们也是用过屡次,功能很简单就是将输入按照必定方式排序,而后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。

默认为字典排序:

$ cat /etc/passswd | sort 

反转排序:

$ cat /etc/passwd | sort -r 

按特定字段排序:

$ cat /etc/passwd | sort -t':' -k 3 

上面的-t参数用于指定字段的分隔符,这里是以":"做为分隔符;-k 字段号用于指定对哪个字段进行排序。这里/etc/passwd文件的第三个字段为数字,默认状况下是一字典序排序的,若是要按照数字排序就要加上-n参数:

$ cat /etc/passwd | sort -t':' -k 3 -n 

 

6. uniq 去重命令

uniq命令能够用于过滤或者输出重复行。

  • 过滤重复行

咱们能够使用history命令查看最近执行过的命令(实际为读取${SHELL}_history文件,如咱们环境中的~/.zsh_history文件),不过你可能只想查看使用了那个命令而不须要知道具体干了什么,那么你可能就会要想去掉命令后面的参数而后去掉重复的命令:

$ history | cut -c 8- | cut -d ' ' -f 1 | uniq 

而后通过层层过滤,你会发现确是只输出了执行的命令那一列,不过去重效果好像不明显,仔细看你会发现它趋势去重了,只是不那么明显,之因此不明显是由于uniq命令只能去连续重复的行,不是全文去重,因此要达到预期效果,咱们先排序:

$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq # 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u 

这就是 Linux/UNIX 哲学吸引人的地方,大繁至简,一个命令只干一件事却能干到最好。

  • 输出重复行
# 输出重复过的行(重复的只输出一个)及重复次数 $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc # 输出全部重复的行 $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D 

文本处理命令还有不少,下一节将继续介绍一些经常使用的文本处理的命令。

做业

使用之前介绍过的方法,安装aviewimagemagick,而后用asciiview命令显示图片,使用方法能够用 man 命令查看。


遇到的问题:图片不知道怎么放到虚拟机致使找不到图片。。

实验九:简单的文本处理

实验介绍

这一节咱们将介绍这几个命令tr(注意不是tar),coljoinpaste。实际这一节是上一节关于能实现管道操做的命令的延续,因此咱们依然将结合管道来熟悉这些命令的使用。

1、经常使用的文本处理命令

2、文本处理命令

1.tr 命令

tr 命令能够用来删除一段文本信息

使用方式:

tr [option]...SET1 [SET2] 

经常使用的选项有:

选项 说明
-d 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
-s 去除set1指定的在输入文本中连续并重复的字符

操做举例:



# 删除 "hello shiyanlou" 中全部的'o','l','h' $ echo 'hello shiyanlou' | tr -d 'olh' # 将"hello" 中的ll,去重为一个l $ echo 'hello' | tr -s 'l' # 将输入文本,所有转换为大写或小写输出 $ cat /etc/passwd | tr '[:lower:]' '[:upper:]' # 上面的'[:lower:]' '[:upper:]'你也能够简单的写做'[a-z]' '[A-Z]',固然反过来将大写变小写也是能够的

经常使用的选项有:

选项 说明
-d 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
-s 去除set1指定的在输入文本中连续并重复的字符

操做举例:

# 删除 "hello shiyanlou" 中全部的'o','l','h' $ echo 'hello shiyanlou' | tr -d 'olh' # 将"hello" 中的ll,去重为一个l $ echo 'hello' | tr -s 'l' # 将输入文本,所有转换为大写或小写输出 $ cat /etc/passwd | tr '[:lower:]' '[:upper:]' # 上面的'[:lower:]' '[:upper:]'你也能够简单的写做'[a-z]' '[A-Z]',固然反过来将大写变小写也是能够的
 

2.col 命令

col 命令能够将Tab换成对等数量的空格建,或反转这个操做。

使用方式:

col [option] 

经常使用的选项有:

选项 说明
-x Tab转换为空格
-h 将空格转换为Tab(默认选项)

操做举例:



# 查看 /etc/protocols 中的不可见字符,能够看到不少 ^I ,这其实就是 Tab 转义成可见字符的符号 $ cat -A /etc/protocols # 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,而后再使用 cat 查看,你发现 ^I 不见了 $ cat /etc/protocols | col -x | cat -A

3.join命令

这个命令就是用于将两个文件中包含相同内容的那一行合并在一块儿。

使用方式:

join [option]... file1 file2 

经常使用的选项有:

选项 说明
-t 指定分隔符,默认为空格
-i 忽略大小写的差别
-1 指明第一个文件要用哪一个字段来对比,,默认对比第一个字段
-2 指明第二个文件要用哪一个字段来对比,,默认对比第一个字段

操做举例:



# 建立两个文件 $ echo '1 hello' > file1 $ echo '1 shiyanlou' > file2 $ join file1 file2 # 将/etc/passwd与/etc/shadow两个文件合并,指定以':'做为分隔符 $ sudo join -t':' /etc/passwd /etc/shadow # 将/etc/passwd与/etc/group两个文件合并,指定以':'做为分隔符, 分别比对第4和第3个字段 $ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group

4.paste命令

paste这个命令与join 命令相似,它是在不对比数据的状况下,简单地将多个文件合并一块儿,以Tab隔开。

使用方式:

paste [option] file... 

经常使用的选项有:

选项 说明
-d 指定合并的分隔符,默认为Tab
-s 不合并到一行,每一个文件为一行

操做举例:



$ echo hello > file1 $ echo shiyanlou > file2 $ echo www.shiyanlou.com > file3 $ paste -d ':' file1 file2 file3 $ paste -s file1 file2 file3

做业

一、在《文件打包与解压缩》一节实验中提到 Windows/dos 与 Linux/UNIX 文本文件一些特殊字符不一致,如断行符 Windows 为 CR+LF(\r\n),Linux/UNIX 为 LF(\n)。使用cat -A 文本 能够看到文本中包含的不可见特殊字符。Linux 的\n表现出来就是一个$,而 Windows/dos 的表现为^M$,能够直接使用dos2unixunix2dos工具在两种格式之间进行转换,使用file命令能够查看文件的具体类型。

使用下面这个命令能够安装,之因此叫 ninvaders 是由于这款游戏是基于 ncurses 命令行图形库作的:



sudo apt-get install ninvaders

实验十:数据流重定向

1.简单的重定向

在更多了解 Linux 的重定向以前,咱们须要先知道一些基本的东西,前面咱们已经提到过 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr

标准错误

 

 

另外还有一个符号-,它能够同时做为前一个命令的。

咱们能够这样使用这些文件描述符:

默认使用终端的标准输入做为命令的输入和标准输出做为命令的输出

$ cat (按Ctrl+C退出) 

将cat的连续输出(heredoc方式)重定向到一个文件

$ mkdir Documents
$ cat > Documents/test.c\~ <<EOF
#include <stdio.h> int main() { printf("hello world\n"); return 0; } EOF 

将一个文件做为命令的输入,标准输出做为命令的输出

$ cat Documents/test.c\~ 

将echo命令经过管道传过来的数据做为cat命令的输入,将标准输出做为命令的输出

$ echo 'hi' | cat 

将echo命令的输出从默认的标准输出重定向到一个普通文件



$ echo 'hello shiyanlou' > redirect $ cat redirect

注意不要将管道和重定向混淆,管道默认是链接前一个命令的输出到下一个命令的输入,而重定向一般是须要一个文件来创建两个命令的链接,你能够仔细体会一下上述第三个操做和最后两个操做的异同点。

2.标准错误重定向

重定向标准输出到文件,这是一个很实用的操做,另外一个很实用的操做是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,因此咱们常常看到的一个命令的输出一般是同时包含了标准输出和标准错误的结果的。好比下面的操做:



# 使用cat 命令同时读取两个文件,其中一个存在,另外一个不存在 $ cat Documents/test.c\~ hello.c # 你能够看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息 # 下面咱们将输出重定向到一个文件,根据咱们前面的经验,这里将在看不到任何输出了 $ cat Documents/test.c\~ hello.c > somefile

那有的时候咱们就是注意你应该在输出重定向文件描述符前加上&,不然shell会当作重定向到一个文件名为1的文件中要能够隐藏某些错误或者警告,那又该怎么作呢。这就须要用到咱们前面讲的文件描述符了:



注意你应该在输出重定向文件描述符前加上,不然shell会当作重定向到一个文件名为1的文件中# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面 $ cat Documents/test.c\~ hello.c >somefile 2>&1 # 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件 $ cat Documents/test.c\~ hello.c &>somefilehell&

3.使用tee命令同时重定向到多个文件

常常你可能还有这样的需求,除了将须要将输出重定向到文件以外也须要将信息打印在终端,那么你能够使用tee命令来实现:



$ echo 'hello shiyanlou' | tee hello

4.永久重定向

你应该能够看出咱们前面的重定向操做都只是临时性的,即只对当前命令有效,那如何作到“永久”有效呢,

,咱们能够使用exec命令实现“永久”重定向。exec命令的做用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:

# 先开启一个子 Shell $ zsh # 使用exec替换当前进程的重定向,将标准输出重定向到一个文件 $ exec 1>somefile # 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么作)

5.建立输出文件描述符

默认在 Shell 中能够有9个打开的文件描述符,上面咱们使用了也是它默认提供的0,1,2号文件描述符,另外咱们还能够使用3-8的文件描述符,只是它们默认没有打开而已,你能够使用下面命令查看当前 Shell 进程中打开的文件描述符:

$ cd /dev/fd/;ls -Al 

一样使用exec命令能够建立新的文件描述符:



$ zsh $ exec 3>somefile # 先进入目录,再查看,不然你可能不能获得正确的结果,而后再回到上一次的目录 $ cd /dev/fd/;ls -Al;cd - # 注意下面的命令>与&之间不该该有空格,若是有空格则会出错 $ echo "this is test" >&3 $ cat somefile $ exit

6.关闭文件描述符

如上面咱们打开的3号文件描述符,能够使用以下操做将它关闭:

$ exec 3>&- $ cd /dev/fd;ls -Al;cd - 

7.彻底屏蔽命令的输出

在 Linux 中有一个被成为“黑洞”的设备文件,因此导入它的数据都将被“吞噬”。

在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它一般被用于丢弃不须要的输出流,或做为用于输入流的空文件,这些操做一般由重定向完成。读取它则会当即获得一个EOF。

咱们能够利用设个/dev/null屏蔽命令的输出:

$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1 

向上面这样的操做将使你得不到任何输出结果。

8.使用 xargs 分割参数列表

xargs 是一条 UNIX 和类 UNIX 操做系统的经常使用命令。它的做用是将参数列表转换成小块分段传递给其余命令,以免参数列表过长的问题。

这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。

$ cut -d: -f1 < /etc/passwd | sort | xargs echo 

上面这个命令用于将/etc/passwd文件按:分割取第一个字段排序后,使用echo命令生成一个列表。

做业

 

 

 

实验十一:正则表达式基础

实际这一节实验只是介绍grepsedawk这三个命令,而正则表达式做为这三个命令的一种使用方式(命令输出中能够包含正则表达式)。

1、正则表达式

什么是正则表达式呢?

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在不少文本编辑器里,正则表达式一般被用来检索、替换那些符合某个模式的文本。

许多程序设计语言都支持利用正则表达式进行字符串操做。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 UNIX 中的工具软件(例如sedgrep)普及开的。正则表达式一般缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。

假设咱们有这样一个文本文件,包含"shiyanlou",和"shilouyan"这两个字符串,一样一个表达式:

shi*

若是这做为一个正则表达式,它将只能匹配 shi,而若是不是做为正则表达式*做为一个通配符,则将同时匹配这两个字符串。这是为何呢?由于在正则表达式中*表示匹配前面的子表达式(这里就是它前面一个字符)零次或屡次,好比它能够匹配"sh","shii","shish","shiishi"等等,而做为通配符表示匹配通配符后面任意多个任意字符,因此它能够匹配"shiyanlou",和"shilouyan"两个字符。

体验完了,下面就来开始正式学习正则表达式吧。

2.基本语法:

数量限定

数量限定除了咱们举例用的*,还有+加号,?问号,.点号,若是在一个模式中不加数量限定符则表示出现一次且仅出现一次:

  • +表示前面的字符必须出现至少一次(1次或屡次),例如,"goo+gle",能够匹配"gooogle","goooogle"等;
  • ?表示前面的字符最多出现一次(0次或1次),例如,"colou?r",能够匹配"color"或者"colour";
  • *星号表明前面的字符能够不出现,也能够出现一次或者屡次(0次、或1次、或屡次),例如,“0*42”能够匹配4二、04二、004二、00042等。

范围和优先级

范围和优先级

()圆括号能够用来定义模式字符串的范围和优先级,这能够简单的理解为是否将括号内的模式串做为一个总体。例如,"gr(a|e)y"等价于"gray|grey",(这里体现了优先级,竖直分隔符用于选择a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(这里体验了范围,?将圆括号内容做为一个总体匹配)。

语法(部分)

正则表达式有多种不一样的风格,下面列举一些经常使用的做为 PCRE 子集的适用于perlpython编程语言及grepegrep的正则表达式匹配规则:(因为markdown表格解析的问题,下面的竖直分隔符用全角字符代替,实际使用时请换回半角字符)

PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用 C 语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE是一个轻量级的函数库,比Boost 之类的正则表达式库小得多。PCRE 十分易用,同时功能也很强大,性能超过了 POSIX 正则表达式库和一些经典的正则表达式库。

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结束位置。
{n} n是一个非负整数。匹配肯定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,可是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的全部o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
* 匹配前面的子表达式零次或屡次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或屡次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”能够匹配“do”或“does”中的“do”。?等价于{0,1}。
? 当该字符紧跟在任何一个其余限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽量少的匹配所搜索的字符串,而默认的贪婪模式则尽量多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配全部“o”。
. 匹配除“\n”以外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
(pattern) 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“\(”或“\)”。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”能够匹配“plain”中的“a”。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各类括号等均做为普通字符。脱字符^若是出如今首位则表示负值字符集合;若是出如今字符串中间就仅做为普通字符。连字符 - 若是出如今字符串中间表示字符范围描述;若是若是出如今首位则仅做为普通字符。
[^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”能够匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”能够匹配“a”到“z”范围内的任意小写字母字符。
[^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”能够匹配任何不在“a”到“z”范围内的任意字符。

优先级

优先级为从上到下从左到右,依次下降:

运算符 说明
\ 转义符
(), (?:), (?=), [] 括号和中括号
*、+、?、{n}、{n,}、{n,m} 限定符
^、$、\任何元字符 定位点和序列
 选择

2、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 将输出中的匹配项设置为自动颜色显示

注:在大多数发行版中是默认设置了grep的颜色的,你能够经过参数指定或修改GREP_COLOR环境变量。

2.使用正则表达式

使用基本正则表达式,BRE

  • 位置

查找/etc/group文件中以"shiyanlou"为开头的行



$ grep 'shiyanlou' /etc/group $ grep '^shiyanlou' /etc/group
  • 数量


# 将匹配以'z'开头以'o'结尾的全部字符串 $ echo 'zero\nzo\nzoo' | grep 'z.*o' # 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串 $ echo 'zero\nzo\nzoo' | grep 'z.o' # 将匹配以'z'开头,以任意多个'o'结尾的字符串 $ echo 'zero\nzo\nzoo' | grep 'zo*'
  • 选择


# grep默认是区分大小写的,这里将匹配全部的小写字母 $ echo '1234\nabcd' | grep '[a-z]' # 将匹配全部的数字 $ echo '1234\nabcd' | grep '[0-9]' # 将匹配全部的数字 $ echo '1234\nabcd' | grep '[[:digit:]]' # 将匹配全部的小写字母 $ echo '1234\nabcd' | grep '[[:lower:]]' # 将匹配全部的大写字母 $ echo '1234\nabcd' | grep '[[:upper:]]' # 将匹配全部的字母和数字,包括0-9,a-z,A-Z $ echo '1234\nabcd' | grep '[[:alnum:]]' # 将匹配全部的字母 $ echo '1234\nabcd' | grep '[[:alpha:]]'

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

特殊符号 说明
[: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 等等
[:xdigit:] 表明 16 进位的数字类型,所以包括: 0-9, A-F, a-f 的数字与字节

注意:之因此要使用特殊符号,是由于上面的[a-z]不是在全部状况下都管用,这还与主机当前的语系有关,即设置在LANG环境变量的值,zh_CN.UTF-8的话[a-z],即为全部小写字母,其它语系多是大小写交替的如,"a A b B...z Z",[a-z]中就可能包含大写字母。因此在使用[a-z]时请确保当前语系的影响,使用[:lower:]则不会有这个问题。

# 排除字符 $ echo 'geek|good' | grep '[^o]' 

注意:^放到中括号内为排除字符,不然表示行首

使用扩展正则表达式,ERE

要经过grep使用扩展正则表达式须要加上-E参数,或使用egrep

  • 数量
# 只匹配"zo" $ echo 'zero\nzo\nzoo' | grep -E 'zo{1}' # 匹配以"zo"开头的全部单词 $ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}' 

注意:推荐掌握{n,m}便可,+,?,*,这几个不太直观,且容易弄混淆。

  • 选择
# 匹配"www.shiyanlou.com"和"www.google.com" $ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com' # 或者匹配不包含"baidu"的内容 $ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com' 

注意:由于.号有特殊含义,因此须要转义。

关于正则表达式和grep命令的内容就介绍这么多,下面会介绍两个更强大的工具sedawk,但一样也正是由于这两个工具的强大,咱们的内容没法包含它们的所有,这里将只对基本内容做介绍。

3、sed 流编辑器

sed工具在 man 手册里面的全名为"sed - stream editor for filtering and transforming text ",意即,用于过滤和转换文本的流编辑器。

在 Linux/UNIX 的世界里敢称为编辑器的工具,大都非等闲之辈,好比前面的"vi/vim(编辑器之神)","emacs(神的编辑器)","gedit"这些个编辑器。sed与上述的最大不一样之处大于它是一个非交互式的编辑器,下面咱们就开始介绍sed这个编辑器。

sed经常使用参数介绍

sed 命令基本格式:

sed [参数]... [执行命令] [输入文件]...
# 形如: $ sed -i '1s/sad/happy/' test # 表示将test文件中第一行的"sad"替换为"happy" 
参数 说明
-n 安静模式,只打印受影响的行,默认打印输入数据的所有内容
-e 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令一般不须要加该参数
-f filename 指定执行filename文件中的命令
-r 使用扩展正则表达式,默认为标准正则表达式
-i 将直接修改输入文件内容,而不是打印到标准输出设备

sed编辑器的执行命令(这里”执行“解释为名词)

sed执行命令格式:

[n1][,n2]command [n1][~step]command # 其中一些命令能够在后面加上做用范围,形如: $ sed -i 's/sad/happy/g' test # g表示全局范围 $ sed -i 's/sad/happy/4' test # 4表示指定行中的第四个匹配字符串 

其中n1,n2表示输入内容的行号,它们之间为,逗号则表示从n1到n2行,若是为波浪号则表示从n1开始以step为步进的全部行;command为执行动做,下面为一些经常使用动做指令:

命令 说明
s 行内替换
c 整行替换
a 插入到指定行的后面
i 插入到指定行的前面
p 打印指定行,一般与-n参数配合使用
d 删除指定行

sed操做举例

咱们先找一个用于练习的文本文件:

$ cp /etc/passwd ~ 

打印指定行



# 打印2-5行 $ nl passwd | sed -n '2,5p' # 打印奇数行 $ nl passwd | sed -n '1~2p'

行内替换

# 将输入文本中"shiyanlou" 全局替换为"hehe",并只打印替换的那一行,注意这里不能省略最后的"p"命令 $ sed -n 's/shiyanlou/hehe/gp' passwd 

注意: 行内替换能够结合正则表达式使用。

行间替换



$ nl passwd | grep "shiyanlou" # 删除第21行 $ sed -n '21c\www.shiyanlou.com' passwd

4、awk文本处理语言

1.awk介绍

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.其名称得自于它的创始人Alfred Aho(阿尔佛雷德·艾侯)、Peter Jay Weinberger(彼得·温伯格)和Brian Wilson Kernighan(布莱恩·柯林汉)姓氏的首个字母.AWK程序设计语言,三位建立者已将它正式定义为“样式扫描和处理语言”。它容许您建立简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其余的功能。最简单地说,AWK是一种用于处理文本的编程语言工具。

在大多数linux发行版上面,实际咱们使用的是gawk(GNU awk,awk的GNU版本),在咱们的环境中ubuntu上,默认提供的是mawk,不过咱们一般能够直接使用awk命令(awk语言的解释器),由于系统已经为咱们建立好了awk指向mawk的符号连接。

2.awk的一些基础概念

awk全部的操做都是基于pattern(模式)—action(动做)对来完成的,以下面的形式:

$ pattern {action} 

你能够看到就如同不少编程语言同样,它将全部的动做操做用一对{}花括号包围起来。其中pattern一般是是表示用于匹配输入的文本的“关系式”或“正则表达式”,action则是表示匹配后将执行的动做。在一个完整awk操做中,这二者能够只有其中一个,若是没有pattern则默认匹配输入的所有文本,若是没有action则默认为打印匹配内容到屏幕。

awk处理文本的方式,是将文本分割成一些“字段”,而后再对这些字段进行处理,默认状况下,awk以空格做为一个字段的分割符,不过这不是固定了,你能够任意指定分隔符,下面将告诉你如何作到这一点。

3.awk命令基本格式

awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...] 

其中-F参数用于预先指定前面提到的字段分隔符(还有其余指定字段的方式) ,-v用于预先为awk程序指定变量,-f参数用于指定awk命令要执行的程序文件,或者在不加-f参数的状况下直接将程序语句放在这里,最后为awk须要处理的文本输入,且能够同时输入多个文本文件。如今咱们仍是直接来具体体验一下吧。

4.awk操做体验

先用vim新建一个文本文档

$ vim test 

包含以下内容:

I like linux www.shiyanlou.com 
  • 使用awk将文本内容打印到终端


# "quote>" 不用输入 $ awk '{ > print > }' test # 或者写到一行 $ awk '{print}' test

说明:你首先应该注意的是,这里我使用了awk语言的分支选择语句if,它的使用和不少高级语言如C/C++语言基本一致,若是你有这些语言的基础,这里将很好理解。另外一个你须要注意的是NROFS,这两个是awk内建的变量,NR表示当前读入的记录数,你能够简单的理解为当前处理的行数,OFS表示输出时的字段分隔符,默认为" "空格,如上图所见,咱们将字段分隔符设置为\n换行符,因此第一行本来以空格为字段分隔的内容就分别输出到单独一行了。而后是$N其中N为相应的字段号,这也是awk的内建变量,它表示引用相应的字段,由于咱们这里第一行只有三个字段,因此只引用到了$3。除此以外另外一个这里没有出现的$0,它表示引用当前记录(当前行)的所有内容。

  • 将test的第二行的以点为分段的字段换成以空格为分隔


$ awk -F'.' '{ > if(NR==2){ > print $1 "\t" $2 "\t" $3 > }}' test # 或者 $ awk ' > BEGIN{ > FS="." > OFS="\t" # 若是写为一行,两个动做语句之间应该以";"号分开 > }{ > if(NR==2){ > print $1, $2, $3 > }}' test

说明:这里的-F参数,前面已经介绍过,它是用来预先指定待处理记录的字段分隔符。咱们须要注意的是除了指定OFS咱们还能够在print 语句中直接打印特殊符号如这里的\tprint打印的非变量内容都须要用""一对引号包围起来。上面另外一个版本,展现了实现预先指定变量分隔符的另外一种方式,即便用BEGIN,就这个表达式指示了,其后的动做将在全部动做以前执行,这里是FS赋值了新的"."点号代替默认的" "空格

注意:首先说明一点,咱们在学习和使用awk的时候应该尽量将其做为一门程序语言来理解,这样将会使你学习起来更容易,因此初学阶段在练习awk时应该尽可能按照我那样的方式分多行按照通常程序语言的换行和缩进来输入,而不是所有写到一行(固然这在你熟练了以后是没有任何问题的)。

6.awk经常使用的内置变量

变量名 说明
FILENAME 当前输入文件名,如有多个文件,则只表示第一个。若是输入是来自标准输入,则为空字符串
$0 当前记录的内容
$N N表示字段号,最大值为NF变量的值
FS 字段分隔符,由正则表达式表示,默认为" "空格
RS 输入记录分隔符,默认为"\n",即一行为一个记录
NF 当前记录字段数
NR 已经读入的记录数
FNR 当前输入文件的记录数,请注意它与NR的区别
OFS 输出字段分隔符,默认为" "空格
ORS 输出记录分隔符,默认为"\n"

实验十二:Linux 下软件安装

实验介绍

介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用。

1、Linux 上的软件安装

一般 Linux 上的软件安装主要有三种方式:

  • 在线安装
  • 从磁盘安装deb软件包
  • 从二进制软件包安装
  • 从源代码编译安装

这几种安装方式各有优劣,而大多数软件包会采用多种方式发布软件,因此咱们经常须要所有掌握这几种软件安装方式,以便适应各类环境。下面将介绍前三种安装方式,从源码编译安装你将在 Linux 程序设计中学习到。

2、在线安装

 在不一样的linux发行版上面在线安装方式会有一些差别包括使用的命令及它们的包管理工具,由于咱们的开发环境是基于ubuntu的,因此这里咱们涉及的在线安装方式将只适用于ubuntu发行版,或其它基于ubuntu的发行版如国内的ubuntukylin(优麒麟),ubuntu又是基于debian的发行版,它使用的是debian的包管理工具dpkg,因此一些操做也适用与debian。而在其它一些采用其它包管理工具的发行版如redhat,centos,fedora等将不适用(redhat和centos使用rpm)

1. 先体验一下

好比咱们想安装一个软件,名字叫作 w3m(w3m是一个命令行的简易网页浏览器),那么输入以下命令:



$ sudo apt-get install w3m

2. apt 包管理工具介绍

APT是Advance Packaging Tool(高级包装工具)的缩写,是Debian及其派生发行版的软件包管理器,APT能够自动下载,配置,安装二进制或者源代码格式的软件包,所以简化了Unix系统上管理软件的过程。APT最先被设计成dpkg的前端,用来处理deb格式的软件包。如今通过APT-RPM组织修改,APT已经能够安装在支持RPM的系统管理RPM包。这个包管理器包含以 apt- 开头的的多个工具,如 apt-get apt-cache apt-cdrom 等,在Debian系列的发行版中使用。

当你在执行安装操做时,首先apt-get 工具会在本地的一个数据库中搜索关于 w3m 软件的相关信息,并根据这些信息在相关的服务器上下载软件安装,这里你们可能会一个疑问:既然是在线安装软件,为啥会在本地的数据库中搜索?要解释这个问题就得提到几个名词了:

  • 软件源镜像服务器
  • 软件源

咱们须要按期从服务器上下载一个软件包列表,使用 sudo apt-get update 命令来保持本地的软件包列表是最新的(有时你也须要手动执行这个操做,好比更换了软件源),而这个表里会有软件依赖信息的记录,对于软件依赖,我举个例子:咱们安装 w3m 软件的时候,而这个软件须要 libgc1c2 这个软件包才能正常工做,这个时候 apt-get 在安装软件的时候会一并替咱们安装了,以保证 w3m 能正常的工做。

3.apt-get

apt-get使用各用于处理apt包的公用程序集,咱们能够用它来在线安装、卸载和升级软件包等,下面列出一些apt-get包含的经常使用的一些工具:

工具 说明
install 其后加上软件包名,用于安装一个软件包
update 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
upgrade 升级本地可更新的所有软件包,但存在依赖问题时将不会升级,一般会在更新以前执行一次update
dist-upgrade 解决依赖关系并升级(存在必定危险性)
remove 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
autoremove 移除以前被其余软件包依赖,但如今再也不被使用的软件包
purge 与remove相同,但会彻底移除软件包,包含其配置文件
clean 移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/
autoclean 移除已安装的软件的旧版本软件包

下面是一些apt-get经常使用的参数:

参数 说明
-y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
-s 模拟安装
-q 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时颇有用
-f 修复损坏的依赖关系
-d 只下载不安装
--reinstall 从新安装已经安装但可能存在问题的软件包
--install-suggests 同时安装APT给出的建议安装的软件包

4.安装软件包

只须要执行apt-get install <软件包名>便可

$ sudo apt-get --reinstall install w3m

如何在不知道软件包完整名的时候进行安装。一般咱们是使用Tab键补全软件包名,后面会介绍更好的方法来搜索软件包。有时候你须要同时安装多个软件包,你还能够使用正则表达式匹配软件包名进行批量安装。

5.软件升级

# 更新软件源 $ sudo apt-get update # 升级没有依赖问题的软件包 $ sudo apt-get upgrade # 升级并解决依赖关系 $ sudo apt-get dist-upgrade 

6.卸载软件

一样是一个命令加回车 sudo apt-get remove w3m ,

或者,你能够执行

# 不保留配置文件的移除 $ sudo apt-get purge w3m # 或者 sudo apt-get --purge remove # 移除再也不须要的被依赖的软件包 $ sudo apt-get autoremove


7.软件搜索

当本身刚知道了一个软件,想下载使用,须要确认软件仓库里面有没有,就须要用到搜索功能了,命令以下:

sudo apt-cache search softname1 softname2 softname3……

如今咱们试试搜索一下以前咱们安装的软件 w3m ,如图:

结果显示了4个 w3m 相关的软件,而且有相关软件的简介。

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

1.dpkg 介绍

dpkg 是 Debian 软件包管理器的基础,它被伊恩·默多克建立于 1993 年。dpkg 与 RPM 十分类似,一样被用于安装、卸载和供给和 .deb 软件包相关的信息。

dpkg 自己是一个底层的工具。上层的工具,像是 APT,被用于从远程获取软件包以及处理复杂的软件包关系。"dpkg"是"Debian Package"的简写。

咱们常常能够在网络上简单以deb形式打包的软件包,就须要使用dpkg命令来安装。

dpkg经常使用参数介绍:

参数 说明
-i 安装指定deb包
-R 后面加上目录名,用于安装该目录下的全部deb安装包
-r remove,移除某个已安装的软件包
-I 显示deb包文件的信息
-s 显示已安装软件的信息
-S 搜索已安装的软件包
-L 显示已安装软件包的目录信息

2.使用dpkg安装deb软件包

咱们先使用apt-get加上-d参数只下载不安装,下载emacs编辑器的deb包,下载完成后,咱们能够查看/var/cache/apt/archives/目录下的内容,以下图:

而后咱们将第一个deb拷贝到home目录下,并使用dpkg安装

$ cp /var/cache/apt/archives/emacs24_24.3+1-4ubuntu1_amd64.deb ~ # 安装以前参看deb包的信息 $ sudo dpkg -I emacs24_24.3+1-4ubuntu1_amd64.deb 

如你所见,这个包还额外依赖了一些软件包,这意味着,若是主机目前没有这些被依赖的软件包,直接使用dpkg安装可能会存在一些问题,由于dpkg并不能为你解决依赖关系。

# 使用dpkg安装 $ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb 

3.查看已安装软件包的安装目录

若是你依然在纠结到底linux将软件安装到了什么地方,那么很幸运你将能够经过dpkg找到答案

使用dpkg -L查看deb包目录信息



$ sudo dpkg -L emacs

4、从二进制包安装

二进制包的安装比较简单,咱们须要作的只是将从网络上下载的二进制包解压后放到合适的目录,而后将包含可执行的主程序文件的目录添加进PATH环境变量便可

做业

这一节是本课程的最后一节,因此这里咱们给你们介绍一个颇有趣的命令。

安装:



$ sudo apt-get install bb
相关文章
相关标签/搜索