Linux 读书笔记 一

1、Linux 简介javascript


实验介绍css

本节主要介绍 Linux 的历史,Linux 与 Windows 的区别等入门知识。若是你已经有过充分的了解,能够跳过本节,直接进入下一个实验。html

1、Linux 为什么物前端

Linux 就是一个操做系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操做系统是什么,就不用过多解释了,若是你学习过前面的入门课程,应该会有个基本概念了,这里简单介绍下操做系统在整个计算机系统中的角色。java

 

咱们的 Linux 也就是系统调用和内核那两层,固然直观的来看,咱们使用的操做系统还包含一些在其上运行的应用程序,好比文本编辑器,浏览器,电子邮件。node

2、Linux 历史简介python

操做系统始于二十世纪 50 年代,当时的操做系统能运行批处理程序。批处理程序不须要用户的交互,它从文件或者穿孔卡片读取数据,而后输出到另一个文件或者打印机。linux

二十世纪六十年代初,交互式操做系统开始流行。它不只仅能够交互,还能使多个用户从不一样的终端同时操做主机。这样的操做系统被称做分时操做系统,它的出现对批处理操做系统是个极大的挑战。许多人尝试开发分时操做系统, 其中包括一些大学的研究项目和商业项目。当时有一个项目叫作" Multics ",它的技术在当时很创新。" Multics "项目的开发并不顺利。它花费了远超过预计的时间来完成,却没有在操做系统市场上占到多少份额。而参加该项目的一个开发团体-贝尔实验室退出了这个项目。他们在退出后开发了他们本身的一个操做系统—— UNIX。nginx

UNIX 最初免费发布并所以在大学里受到欢迎。后来,UNIX 实现了 TCP/IP 协议栈,成为了早期工做站的操做系统的一个流行选择。git

1990年,UNIX 在服务器市场尤为是大学校园成为主流操做系统,许多校园都有 UNIX 主机,固然还包括一些研究它的计算机系的学生。这些学生都渴望能在本身的电脑上运行 UNIX 。不幸的是,从那时候开始,UNIX 开始变得商业化,它的价格也变得很是昂贵。而惟一低廉的选择就是 MINIX ,这是一个功能有限的相似 UNIX 的操做系统,做者 Andrew Tanebaum 开发它的目的是用于教学。

1991 年 10 月,Linus Torvalds(Linux 之父)在赫尔辛基大学接触 UNIX ,他但愿能在本身的电脑上运行一个相似的操做系统。但是 UNIX 的商业版本很是昂贵,因而他从 MINIX 开始入手,计划开发一个比 MINIX 性能更好的操做系统。很快他就开始了本身的开发工做。他第一次发行的版本很快吸引了一些黑客。尽管最初的 Linux 并无多少用处,但因为一些黑客的加入使它很快就具备了许多吸引人的特性,甚至一些对操做系统开发不感兴趣的人也开始关注它。

Linux 自己只是操做系统的内核。内核是使其余程序可以运行的基础。它实现了多任务和硬件管理,用户或者系统管理员交互运行的全部程序实际上都运行在内核之上。其中有些程序是必需的,好比说,命令行解释器(shell),它用于用户交互和编写 shell 脚本(.bat文件)。 Linus没有本身去开发这些应用程序,而是使用已有的自由软件。这减小了搭建开发环境而所需花费的工做量。实际上,他常常改写内核,使得那些程序能更容易在 Linux 上运行。许多重要的软件,包括 C 编译器,都来自于自由软件基金 GNU 项目。GNU 项目开始于 1984 年,目的是为了开发一个彻底相似于 UNIX 的免费操做系统。为了表扬 GNU 对 Linux 的贡献,许多人把 Linux 称为GNU/Linux(GNU 有本身的内核)。

1992-1993 年,Linux 内核具有了挑战 UNIX 的全部本质特性,包括 TCP/IP 网络,图形界面系统(X window),Linux 一样也吸引了许多行业的关注。一些小的公司开发和发行Linux,有几十个 Linux 用户社区成立。1994 年,Linux 杂志也开始发行。

Linux 内核 1.0 在 1994 年三月发布,内核的发布要经历许多开发周期,直至到达一个稳定的版本。

下面列举一下 Linux 诞生大事件:

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

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

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

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

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

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

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

Bill Joy 是 Sun 公司的创始人;

  • 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 的吉祥物:企鹅;

UNIX进化史(UNIX你们族族谱1969-2013)

 

3、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 之父,芬兰赫尔辛基大学

 

4、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 没有的

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

5、如何学习 Linux

1.学习心态

  • 明确目的:你是要用 Linux 来干什么,搭建服务器,作程序开发,仍是平常办公,仍是娱乐游戏;
  • 面对现实:Linux 大都在命令行下操做,可否接受不用或少用图形界面;
  • 是学习 Linux 操做系统自己仍是某一个Linux发行版(Ubuntu,CentOS,Fedora,OpenSUSE,Debian,Mint 等等),若是你对发行版的概念或者它们之间的关系不明确的话能够参看Linux 发行版

2.注重基础,从头开始

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、基本概念及操做

实验介绍

本节实验主要有:

一、实验楼环境介绍 二、经常使用 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 的桌面环境是一个怎样的概念,以及它跟 Windows 操做系统桌面的差别,实际它们之间是有着本质的差异的,但愿清楚这些内容以后可让你忽略那些体验上的差别,专心把精力放到 Linux 系统自己或者你正准备学习的某一门技术之上,这门实验课后面的内容和实验楼的其余课程即是为了帮助你实现以上两个目标的。

2、Linux 桌面环境的使用

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

关于登陆帐户密码的说明, 实验楼环境中全部的默认系统用户名均为 shiyanlou,密码为 shiyanlou

3、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.txtlove_2_linux.txt... love_10_linux.txt”。在 Linux 中十分方便:

$ _110touch love{..}_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 命令调用手册页。

你能够使用以下方式来得到某个命令的说明和使用方式的详细介绍:

command$ man <_name>

好比你想查看 man 命令自己的使用方式,你能够输入:

manman

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

区段

说明

1

通常命令

2

系统调用

3

库函数,涵盖了C标准函数库

4

特殊文件(一般是/dev中的设备)和驱动程序

5

文件格式和约定

6

游戏和屏保

7

杂项

8

系统管理命令和守护进程

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

3printf$ man

全部的手册页遵循一个常见的布局,其为经过简单的 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,先看效果:

 

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

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

而后:

$ banner shiyanlou

或者你以为这字体很差看,那么你还能够使用默认已经安装的一个命令printerbanner

$ 50Aprinterbanner -w

 

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

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

 截图:

 

 

 

3、用户及文件权限管理

实验介绍

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

1、Linux 用户管理

经过第一节课程的学习,你应该已经知道,Linux 是一个能够实现多用户登录的操做系统,好比“李雷”和“韩梅梅”均可以同时登录同一台主机,他们共享一些主机的资源,但他们也分别有本身的用户空间,用于存放各自的文件。但实际上他们的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,可是因为 Linux 的 用户管理 和 权限机制 ,不一样用户不能够轻易地查看、修改彼此的文件。

下面咱们就来学习一下 Linux 下的帐户管理的基础知识。

1.查看用户

请打开终端,输入命令:

$ who am i
 
或者
 
$ who mom likes

 

输入的第一列表示打开当前伪终端的用户的用户名(要查看当前登陆用户的用户名,去掉空格直接使用 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 权限,系统权限的一种,与 SYSTEM 权限能够理解成一个概念,但高于 Administrator 权限,root 是 Linux 和 UNIX 系统中的超级管理员用户账户,该账户拥有整个系统至高无上的权力,全部对象他均可以操做,因此不少黑客在入侵系统的时候,都要把权限提高到 root 权限,用 Windows 的方法理解也就是将本身的非法账户添加到 Administrators 用户组。更好比安卓操做系统中(基于 Linux 内核)得到 root 权限以后就意味着已经得到了手机的最高权限,这时候你能够对手机中的任何文件(包括系统文件)执行全部增、删、改、查的操做。

咱们通常登陆系统时都是以普通帐户的身份登陆的,要建立用户须要 root 权限,这里就要用到 sudo 这个命令了。不过使用这个命令有两个大前提,一是你要知道当前登陆用户的密码,二是当前用户必须在 sudo 用户组。shiyanlou 用户的密码就是 “shiyanlou” ,它同时也属于 sudo 用户组(稍后会介绍如何查看和添加用户组)。如今咱们新建一个叫 lilei 的用户:

$ sudo adduser lilei

按照提示输入 shiyanlou 密码(Linux 下密码输入一般都是不可见的),而后是给 lilei 用户设置密码,后面的选项的一些内容你能够选择直接回车使用默认值:

 

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

$ ls /home

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

-l$ sulilei

 

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

3.用户组

在 Linux 里面每一个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源,就跟家的形式差很少,你的兄弟姐妹(不一样的用户)属于同一个家(用户组),大家能够共同拥有这个家(共享资源),爸妈对待大家都同样(共享权限),你偶尔写写日记,其余人未经容许不能查看(私有资源和权限)。固然一个用户是能够属于多个用户组的,正如你既属于家庭,又属于学校或公司。

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

方法一:使用groups命令

$ groups shiyanlou

 

其中冒号以前表示用户,后面表示该用户所属的用户组。这里能够看到 shiyanlou 用户同时属于 shiyanlou 和 sudo 用户组,每次新建用户若是不指定用户组的话,默认会自动建立一个与用户名相同的用户组(差很少就至关于家长的意思,或者说是老总)。默认状况下在sudo用户组里的能够使用sudo命令得到root权限。

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

group$ cat /etc/| sort

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

 

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

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

 

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

$ su shiyanlou
$ groups lilei
$ Gsudo usermod -sudo lilei
$ groups lilei

而后你再切换会 lilei 用户,如今就能够使用 sudo 获取 root 权限了。

4.删除用户

删除用户是很简单的事:

$ sudo deluser lilei --remove-home

 

2、Linux 文件权限

1.查看文件权限

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

使用较长格式列出文件:

-l$ ls

 

你可能除了知道最后面那一项是文件名以外,其它项就不太清楚了,那么究竟是什么意思呢:

 

可能你仍是不太明白,好比第一项文件类型和权限那一堆东西具体指什么,连接又是什么,何为最后修改时间,下面一一道来:

 

  • 文件类型

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

  • 文件权限

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

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

  • 连接数

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

  • 文件大小

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

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

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

 

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

$ Alls -

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

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

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

2.变动文件全部者

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

$ touch iphone6

可见文件全部者是 lilei :

 

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

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

如今查看,发现 文件全部者成功修改成 shiyanlou :

 

3.修改文件权限

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

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

 

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

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

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

而后修改权限:

chmod700$iphone6

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

 

  • 方式二:加减赋值操做

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

chmod$go-rw iphone

 

'g''o'还有'u',分别表示group,others,user,'+','-' 就分别表示增长和去掉相应的权限。

3、更多

Linux 还有一些关于隐藏权限和特殊权限的内容,想全面了解 Linux 权限管理这部份内容的用户能够经过其余方式学习。

做业

添加一个用户loutest,使用sudo建立文件/opt/forloutest,设置成用户loutest能够读写。截图并把操做过程写入实验报告。

 截图:

 

 

 

 

 

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

实验介绍

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

1、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",就先安装:

# 由于咱们的环境的缘由,每次新启动实验会清除系统恢复初始状态,因此须要手动更新软件包索引,以便咱们安装时能找到相应软件包的源
 
getsudo apt-update
 
getsudo apt-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 目录:

# 绝对路径
cdlocal$/usr//bin
# 相对路径
cdlocal$../../usr//bin

 

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

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

2、Linux 文件的基本操做

1.新建

新建空白文件

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

建立名为 test 的空白文件,由于在其余目录没有权限,因此须要先 cd ~切换回用户的 /home/shiyanlou 目录:

cd$~
test$ touch

新建目录

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

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

mkdir$mydir

使用 -p 参数,同时建立父目录(若是不存在该父目录),以下咱们同时建立一个多级目录(这在有时候安装软件,配置安装路径时很是有用):

mkdir$-p father/son/grandson

 

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

2.复制

复制文件

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

test$ cpfather/son/grandson

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

复制目录

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

 

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

$ cp -r father family

3.删除

删除文件

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

test$ rm

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

 

你若是想忽略这提示,直接删除文件,能够使用-f参数强制删除:

-ftest$ rm

删除目录

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

$ rm -r family

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

移动文件

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

$ Documentsmv file1

 

重命名文件

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

$ mv file1 myfile

批量重命名

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

# 使用通配符批量建立 5 个文件
$ 15touch file{..}.txt
 
# 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件
$ 's/\.txt/\.c/'rename*.txt
 
# 批量将这 5 个文件,文件名改成大写
$ 'y/a-z/A-Z/'rename*.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参数,后面紧跟行数:

$ 1tail -n/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 &

 

5、环境变量与文件查找


实验介绍

本节实验介绍环境变量的做用与用法,及几种搜索文件的方法。学会这些技巧高效地使用 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
exportexport$|sort>.txt
setset$|sort>.txt

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

exportset$ vimdiff env.txt.txt.txt

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

 

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

 

注意:为了与普通变量区分,一般咱们习惯将环境变量名设为大写

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

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

查看PATH环境变量的内容:

echo$PATH$

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

/usr//usr//usr//sbin://usr/g/usr//usr/local/sbin:local/bin:sbin:bin:bin:ames:local/games

若是你还记得咱们在 Linux 目录结构那一节的内容,你就应该知道上面这些目录下放的是哪一类文件了。一般这一类目录下放的都是可执行文件,当咱们在 Shell 中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,若是存在同名的命令,则执行先找到的那个。

下面咱们将练习建立一个最简单的可执行 Shell 脚本和一个使用 C 语言建立的"hello world"程序,若是这两部份内容你以前没有学习过,那么你能够进行一个入门学习: C 语言入门教程 高级 Bash 脚本编程指南 Linux Shell Scripting Tutorial (LSST) v2.0

建立一个 Shell 脚本文件:

$ vim hello_shell.sh

在脚本中添加以下内容,保存并退出(注意不要省掉第一行,这不是注释,论坛有用户反应会有语法错误,就是由于没有了第一行):

#!/bin/zsh
 
for010do((i=; i<; i++));
echo"hello shell"   
done
 
exit0

为文件添加可执行权限:

chmod755$hello_shell.sh

执行脚本

$ ./hello_shell.sh

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

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

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

 

回到上一级目录,也就是shiyanlou家目录,当再想运行那两个程序时,会发现提示命令找不到,除非加上命令的完整路径,但那样很不方便,如何作到想使用系统命令同样执行本身建立的脚本文件或者程序呢?那就要将命令所在路径添加到PATH环境变量了。

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

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

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

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

如今你就能够在其余任意目录执行那两个命令了。你可能会意识到这样还并无很好的解决问题,由于我给 PATH 环境变量追加了一个路径,它也只是在当前 Shell 有效,我一旦退出终端,再打开就会发现又失效了。有没有方法让添加的环境变量全局有效?或者每次启动 Shell 时自动执行上面添加自定义路径到 PATH 的命令?下面咱们就来讲说后一种方式——让它自动执行。

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

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

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

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

5.修改和删除已有变量

变量修改

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

变量设置方式

说明

${变量名#匹配字串}

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

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

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

${变量名%匹配字串}

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

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

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

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

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

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

将符合旧字串的所有字串替换为新的字串

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

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

变量删除

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

unset$temp

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

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

source$.zshrc

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

$ . ./.zshrc

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

2、搜索文件

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

  • whereis简单快速
$whereiswho

 

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

  • locate快而全

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

$ locate /etc/sh

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

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

/usr/share/$ locate\*.jpg

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

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

  • which小而精

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

which$man
  • find精而细

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

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

/etc/$ find-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 小时以内)有改动的文件:

$ 0find ~ -mtime

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

$ Codefind ~ -newer /home/shiyanlou/

做业

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

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

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

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

 

而后按下F11 能够全屏显示。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6、文件打包与压缩

实验介绍

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

1、文件打包和解压缩

在讲 Linux 上的解压缩工具以前,有必要先了解如下常见经常使用的压缩包文件格式。在 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打包文件夹:
$ zip -r -q -o shiyanlou.zip /home/shiyanlou
$ du -h shiyanlou.zip
$ file shiyanlou.zip

 

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

  • 设置压缩级别为9和1(9最大,1最小),从新打包:
9/home/shiyanlou -x ~/$ zip -r --q -o shiyanlou_9.zip*.zip
1/home/shiyanlou -x ~/$ zip -r --q -o shiyanlou_1.zip*.zip

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

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

-d0$ du -h*.zip ~ | sort

经过man 手册可知:

  • h, --human-readable(顾名思义,你能够试试不加的状况)
  • d, --max-depth(所查看文件的深度)

 

这样一目了然,你能够看到默认压缩级别应该是最高的,效果很明显,不过你在环境中操做以后看到的大小可能跟图上的有些不一样,由于在你使用过程当中,会随时还生成一些缓存文件在当前用户的家目录中,这对于咱们学习命令使用来讲,是可有可无的,能够忽略这些不一样。

  • 建立加密zip包

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

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

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

-l$ zip -r-o shiyanlou.zip /home/shiyanlou

须要加上-l参数将LF转换为CR+LF来达到以上目的。

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

shiyanlou.zip解压到当前目录:

$ unzip shiyanlou.zip

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

-d$ unzip -q shiyanlou.zipziptest

 

上述指定目录不存在,将会自动建立。若是你不想解压只想查看压缩包的内容你能够使用-l参数:

-l$ unzipshiyanlou.zip

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

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

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

3.rar打包压缩命令

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

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

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

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

  • 从指定压缩包文件中删除某个文件:
  • 查看不解压文件:
  • 使用unrar解压rar文件
$ rar d shiyanlou.rar .zshrc
 
$ rar l shiyanlou.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参数):
  • 只查看不解包文件-t参数:
  • 保留文件属性和跟随连接(符号连接或软连接),有时候咱们使用tar备份文件当你在其余主机还原时但愿保留文件的属性(-p参数)和备份连接指向的源文件而不是连接自己(-h参数):
$ mkdir tardir
$ Ctar -xf shiyanlou.tar -tardir
 
$ tar -tf shiyanlou.tar
 
$ tar -cphf etc.tar /etc

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

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

 

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

压缩文件格式

参数

*.tar.gz

-z

*.tar.xz

-J

*tar.bz2

-j

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

做业

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

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

 

 

 

 

 

 

7、文件系统操做与磁盘管理

实验介绍

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

由于本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前面省略了关于 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

 

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

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

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

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

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

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

 

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

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命令从标准输入读入用户输入到标准输出或者一个文件:

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

 

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

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

$ if/dev/stdin101dd=of=test bs=count=conv=ucase

 

你能够在man文档中查看其余全部转换参数。

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

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

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

$ if/dev/zero1256dd=of=virtual.img bs=M count=
$ du -h virtual.img

 

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

使用 mkfs 命令格式化磁盘(咱们这里是本身建立的虚拟磁盘镜像)

你能够在命令行输入 mkfs 而后按下Tab键,你能够看到不少个以 mkfs 为前缀的命令,这些不一样的后缀其实就是表示着不一样的文件系统,能够用 mkfs 格式化成的文件系统:

 

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

virtual$ mkfs.ext4.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目录:

loop$ mount -o-t ext4 virtual.img /mnt
# 也能够省略挂载类型,不少时候 mount 会自动识别
 
# 以只读方式挂载
loop$ mount -o--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 为磁盘分区(关于分区的一些概念不清楚的用户请参看主引导记录

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

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

 

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

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

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

 

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

操做完成后输入p查看结果以下:

 

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

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

$ 0sudo losetup /dev/loopvirtual.img
# 若是提示设备忙你也能够使用其它的回环设备,"ls /dev/loop*"参看全部回环设备
 
# 解除设备关联
$ 0sudo losetup -d /dev/loop

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

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

 

接着再是格式化,咱们将其所有格式化为 ext4:

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

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

mkdir_13$-p /media/virtualdisk{..}
# 挂载磁盘分区
$ 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命令,可让你在终端里以一种动物说话的形式打印出一段话。

# 安装
$ sudo apt-get install cowsay
 
# 默认是一只牛
$ cowsay hello shiyanlou
 
# 加上'-l'参数打印全部支持的动物(其实不仅是动物)种类
$ cowsay -l
 
# 使用'-f'参数选择动物种类
$ cowsay -f elephant hello shiyanlou
 
# 此外它还能够结合咱们以前的做业讲过的 fortune 命令一块儿使用
$ fortune | cowsay -f daemon

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8、命令执行顺序控制与管道

实验介绍

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

1、命令执行顺序的控制

1.顺序执行多条命令

一般状况下,咱们每次只能在终端输入一条命令,按下回车执行,执行完成后,咱们再输入第二条命令,而后再按回车执行…… 你可能会遇到以下使用场景:我须要使用apt-get安装一个软件,而后安装完成后当即运行安装的软件(或命令工具),又恰巧你的主机才更换的软件源尚未更新软件列表(好比以前咱们的环境中,每次从新开始实验就得sudo apt-get update,如今已经没有这个问题了),那么你可能会有以下一系列操做:

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

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

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

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

2.有选择的执行命令

关于上面的操做,不知你有没有思考过一个问题,若是咱们在让它自动顺序执行命令时,前面的命令执行不成功,然后面的命令又依赖与上一条命令的结果,那么就会形成花了时间,最终却获得一个错误的结果,并且有时候直观的看你还没法判断结果是否正确。那么咱们须要可以有选择性的来执行命令,好比上一条命令执行成功才继续下一条,或者不成功又该作出其它什么处理,好比咱们使用which来查找是否安装某个命令,若是找到就执行该命令,不然什么也不作(虽然这个操做没有什么实际意义,但可帮你更好的理解一些概念):

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

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

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

 

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

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

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

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

 

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

 

思考

上面咱们讲到将&&||结合起来使用,那么是否以任意顺序都行?好比上面咱们是&&在前||在后,反过来能够么?会不会有问题?

2、管道

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

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

1.试用

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

$ ls -al /etc

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

$ ls -al /etc | less

经过管道将前一个命令(ls)的输出做为下一个命令(less)的输入,而后就能够一行一行地看。

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

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

-d':'-f16$ cut /etc/passwd,

 

打印/etc/passwd文件中每一行的前N个字符:

# 前五个(包含第五个)
$ 5cut /etc/passwd -c -
# 前五个以后的(包含第五个)
$ 5cut /etc/passwd -c-
# 第五个
$ 5cut /etc/passwd -c
# 2到5之间的(包含第五个)
$ 25cut /etc/passwd -c-

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

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

grep命令的通常形式为:

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

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

grep"shiyanlou"$-rnI~

 

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

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

# 查看环境变量中以"yanlou"结尾的字符串
export".*yanlou$"$| grep

 

其中$就表示一行的末尾。

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

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

$ wc /etc/passwd

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

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

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

 

再来结合管道来操做一下,下面统计 /etc 下面全部目录数:

-l$ ls -dl /etc/*/ | wc

 

5.sort 排序命令

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

默认为字典排序:

sort$ cat /etc/passswd |

反转排序:

sort$ cat /etc/passwd |-r

按特定字段排序:

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

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

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

 

6. uniq 去重命令

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

  • 过滤重复行

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

history8-d' '-f1$| cut -c- | cut| uniq

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

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

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

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

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

做业

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

Linus大神的照片地址http://labfile.oss.aliyuncs.com/courses/1/Linus.png

 

 

9、简单的文本处理

实验介绍

这一节咱们将介绍这几个命令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]',固然反过来将大写变小写也是能够的 

更多 tr 的使用,你能够使用--help或者man tr得到。

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 

3、小结

上面这些命令不是全部你都会常常用到,不过它们确是很实用的,熟练掌握以后,能够减轻不少工做量,好比不停的用鼠标操做在 gedit 里面复制粘贴赋值粘贴,将两个文件的内容合并为一个文件,这本来只须要一个命令就能完成。

做业

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

二、还记得小时候在小霸王上面玩的小蜜蜂游戏么?它的正统名字应该是Space Invaders:太空侵略者

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

sudo apt-get install ninvaders 

 

 

 

10、数据流重定向

实验介绍

你可能对重定向这个概念感到些许陌生,但你应该在前面的课程中屡次见过>>>操做了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中。这其实就是重定向,将本来输出到标准输出的数据重定向到一个文件中,由于标准输出(/dev/stdout)自己也是一个文件,咱们将命令输出导向另外一个文件天然也是没有任何问题的。

1、数据流重定向

下面咱们简单的回顾一下咱们前面常常用到的两个重定向操做:

$ echo 'hello shiyanlou' > redirect $ echo 'www.shiyanlou.com' >> redirect $ cat redirect 

固然前面没有用到的<<<操做也是没有问题的,如你理解的同样,它们的区别在于重定向的方向不一致而已,>表示是从左到右,<右到左。

1.简单的重定向

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

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

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者建立一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写每每会围绕着文件描述符展开。可是文件描述符这一律念每每只适用于 UNIX、Linux 这样的操做系统。

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

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

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

$ 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 

遗憾的是,这里依然出现了那条错误信息,这正是由于如我上面说的那样,标准输出和标准错误虽然都指向终端屏幕,实际它们并不同。那有的时候咱们就是要能够隐藏某些错误或者警告,那又该怎么作呢。这就须要用到咱们前面讲的文件描述符了:

# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面 $ cat Documents/test.c\~ hello.c >somefile 2>&1 # 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件 $ cat Documents/test.c\~ hello.c &>somefilehell 

注意你应该在输出重定向文件描述符前加上&,不然shell会当作重定向到一个文件名为1的文件中

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

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

$ echo 'hello shiyanlou' | tee hello 

4.永久重定向

你应该能够看出咱们前面的重定向操做都只是临时性的,即只对当前命令有效,那如何作到“永久”有效呢,好比在一个脚本中,你须要某一部分的命令的输出所有进行重定向,难道要让你在每一个命令上面加上临时重定向的操做嘛,固然不须要,咱们能够使用exec命令实现“永久”重定向。exec命令的做用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:

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

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命令生成一个列表。

做业

一、理解下面这段代码的的做用,实际这段代码不会正常工做,请结合这一小节的知识分析这段代码没有正确工做的缘由,并设法解决这个问题。

若是你尚未 Shell 脚本编程的基础,你能够选择跳过或者到这里高级 Bash 编程指南学习

while read filename; do rm -iv $filename done <<(ls) 

二、以前介绍过一个在命令行将图片转换为 ascii 字符查看的工具 aview/asciiview,不过它是黑白的。如今,这里是个彩色的:

$ sudo apt-get install caca-utils $ cacaview <pic_file> $ cacademo $ cacafire

11、正则表达式基础

实验介绍

虽然咱们这一节的标题是正则表达式,但实际这一节实验只是介绍grepsedawk这三个命令,而正则表达式做为这三个命令的一种使用方式(命令输出中能够包含正则表达式)。正则表达式自己的内容不少,要把它说明清楚须要单独一门课程来实现,不过咱们这一节中涉及到的相关内容一般也可以知足不少状况下的需求了。

想要更深刻地学习使用正则表达式,在这里 正则表达式基础

1、正则表达式

什么是正则表达式呢?

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

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

简单的说形式和功能上正则表达式和咱们前面讲的通配符很像,不过它们之间又有很大差异,特别在于一些特殊的匹配字符的含义上,但愿初学者注意不要将二者弄混淆。

1. 举例

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

shi*

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

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

2.基本语法:

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

选择

|竖直分隔符表示选择,例如"boy|girl"能够匹配"boy"或者"girl"

数量限定

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

  • +表示前面的字符必须出现至少一次(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} 限定符
^、$、\任何元字符 定位点和序列
 选择

更多正则表达式的内容能够参考如下连接:

regex的思导图:

2、grep模式匹配命令

上面空谈了那么多正则表达式的内容也并无说起具体该如何使用它,实在枯燥,若是说正则表达式是一门武功话,那它也只能算得上一些口诀招式罢了,要把它真正练起来还得须要一些兵器在手才行,这里咱们要介绍的grep命令以及后面要讲的sed,awk这些就该算做是这样的兵器了。

1.基本操做

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

参数 说明
-E POSIX扩展正则表达式,ERE
-G POSIX基本正则表达式,BRE
-P Perl正则表达式,PCRE

不过在你没学过perl语言的大多数状况下你将只会使用到EREBRE,因此咱们接下来的内容都不会讨论到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*' 

注意:其中\n为换行符

  • 选择
# 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 

关于sed命令就介绍这么多,你若是但愿了解更多sed的高级用法,你能够参看以下连接:

4、awk文本处理语言

看到上面的标题,你可能会感到惊异,难道咱们这里要学习的是一门“语言”么,确切的说,咱们是要在这里学习awk文本处理语言,只是咱们并不会在这里学习到比较完整的关于awk的内容,仍是由于前面的缘由,它太强大了,它的应用无处不在,咱们没法在这里以简短的文字描述面面俱到,若是你有目标成为一个linux系统管理员,确实想学好awk,你一不用担忧,实验楼会在以后陆续上线linux系统管理员的学习路径,里面会有单独的关于正则表达式,awk,sed等相关课程,敬请期待吧。下面的内容,咱们就做为一个关于awk的入门体验章节吧,其中会介绍一些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的符号连接。

$ ll /usr/bin/awk 

nawk: 在 20 世纪 80 年代中期,对 awk语言进行了更新,并不一样程度地使用一种称为 nawk(new awk) 的加强版本对其进行了替换。许多系统中仍然存在着旧的awk 解释器,但一般将其安装为 oawk (old awk) 命令,而 nawk 解释器则安装为主要的 awk 命令,也能够使用 nawk 命令。Dr. Kernighan 仍然在对 nawk 进行维护,与 gawk 同样,它也是开放源代码的,而且能够免费得到; gawk: 是 GNU Project 的awk解释器的开放源代码实现。尽管早期的 GAWK 发行版是旧的 AWK 的替代程序,但不断地对其进行了更新,以包含 NAWK 的特性; mawk 也是awk编程语言的一种解释器,mawk遵循 POSIX 1003.2 (草案 11.3)定义的 AWK 语言,包含了一些没有在AWK 手册中提到的特点,同时 mawk 提供一小部分扩展,另外听说mawk是实现最快的awk

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 

说明:在这个操做中我是省略了patter,因此awk会默认匹配输入文本的所有内容,而后在"{}"花括号中执行动做,即print打印全部匹配项,这里是所有文本内容

  • 将test的第一行的每一个字段单独显示为一行
$ awk '{ > if(NR==1){ > print $1 "\n" $2 "\n" $3 > } else { > print} > }' test # 或者 $ awk '{ > if(NR==1){ > OFS="\n" > print $1, $2, $3 > } else { > 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"

关于awk的内容本课程将只会包含这些内容,若是你想了解更多,请期待后续课程,或者参看一下连接内容:

做业

一、练习其余几个命令动做的使用。

  • 练习1: 结合正则表达式作更多练习。
  • 练习2: 参考下面的连接,掌握 sed 处理文本的基本原理,理解 pattern space 和 hold space 概念。 sed简明教程 sed单行脚本快速参考 sed彻底手册

  • 练习3: 基于 pattern space 和 hold space 实现将一个文本倒序输出和交换奇数行和偶数行。

二、一个在线游戏,固然咱们主要目的是学习,这个游戏也是有寓教于乐的性质,让你快速学会vim的基础操做:

vim大冒险




12、Linux 下软件安装

实验介绍

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

1、Linux 上的软件安装

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

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

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

2、在线安装

试想一下,平时咱们在使用 Windows 的时候,想要安装一个软件,咱们须要在网上去下载对应软件的安装包,接着安装的时候就是不断的去点击下一步,这些流程想必你们已经经历的无数回了,可是在 Linux 下,一个命令加回车,等待一下,软件就安装好了,这就是方便的在线安装软件的方式。在学习这种安装方式以前有一点须要说明的是,在不一样的linux发行版上面在线安装方式会有一些差别包括使用的命令及它们的包管理工具,由于咱们的开发环境是基于ubuntu的,因此这里咱们涉及的在线安装方式将只适用于ubuntu发行版,或其它基于ubuntu的发行版如国内的ubuntukylin(优麒麟),ubuntu又是基于debian的发行版,它使用的是debian的包管理工具dpkg,因此一些操做也适用与debian。而在其它一些采用其它包管理工具的发行版如redhat,centos,fedora等将不适用(redhat和centos使用rpm)

1. 先体验一下

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

$ sudo apt-get install w3m 

这样的操做你应该在前面的章节中看到过不少次了,它就表示将会安装一个软件包名为w3m的软件

咱们来看看命令执行后的效果:

$ w3m www.shiyanlou.com/faq 

注意:若是你在安装一个软件以后,没法当即使用Tab键补全这可命令,你能够尝试先执行source ~/.zshrc,而后你就能够使用补全操做。

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.卸载软件

若是你如今以为 w3m 这个软件不合本身的胃口,或者是找到了更好的,你须要卸载它,那么简单!一样是一个命令加回车 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…… 

apt-cache 命令则是针对本地数据进行相关操做的工具,search 顾名思义在本地的数据库中寻找有关 softname1 softname2 …… 相关软件的信息。如今咱们试试搜索一下以前咱们安装的软件 w3m ,如图:

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

关于在线安装的的内容咱们就介绍这么多,想了解更多关于APT的内容,你能够参考:

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 

跟前面预料的同样,这里你可能出现了一些错误:

咱们将如何解决这个错误了,这就要用到apt-get了,使用它的-f参数了,修复依赖关系的安装

$ sudo apt-get -f install 

没有任何错误,这样咱们就安装成功了,而后你能够运行emacs程序

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

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

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

$ sudo dpkg -L emacs 

dpkg还有一些其余的参数,这里将做为练习题由你本身来学习

4、从二进制包安装

二进制包的安装比较简单,咱们须要作的只是将从网络上下载的二进制包解压后放到合适的目录,而后将包含可执行的主程序文件的目录添加进PATH环境变量便可,若是你不知道该放到什么位置,请从新复习第四节关于 Linux 目录结构的内容。

做业

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

安装:

$ sudo apt-get install bb






 

 

实验截图:

 
相关文章
相关标签/搜索