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

北京电子科技学院(BESTI)javascript

              css

课程:信息安全系统设计基础  班级:1352  姓名:吕松鸿  学号:20135229前端

成绩:             指导教师:娄嘉鹏    实验日期:2015.9.20java

实验密级:         预习程度:         实验时间:10:00--22:00python

仪器组次:29         必修/选修: 选修            实验序号:1~12linux

 

(一)Linux 简介web

实验介绍正则表达式

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

1、Linux 为什么物shell

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

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

2、Linux 历史简介

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.注重基础,从头开始

(二)基本概念及操做

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 上你能够本身选择安装不一样的桌面环境,甚至能够定制本身的专属桌面。

2、Linux 桌面环境的使用

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

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

3、Linux终端

一般在咱们使用 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键来强行终止当前程序(你能够放心它并不会使终端退出)。

而后你会发现你接下来的输入都没有任何反应了,只是将你输入的东西显示出来,如今你可使用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:

方在建立文件的时候,若是须要一次性建立多个文件,好比:“love_1_linux.txtlove_2_linux.txt... love_10_linux.txt”。在 Linux 中十分便:

Shell 经常使用通配符:

字符

含义

*

匹配 0 或多个字符

?

匹配任意一个字符

[list]

匹配 list 中的任意单一字符

[!list]

匹配 除list 中的任意单一字符之外的字符

[c1-c2]

匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]

{string1,string2,...}

匹配 sring1 或 string2 (或更多)其一字符串

{c2..c2}

匹配 c1-c2 中所有字符 如{1..10}

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

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

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

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

$ man <command_name>

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

man man

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

区段

说明

1

通常命令

2

系统调用

3

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

4

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

5

文件格式和约定

6

游戏和屏保

7

杂项

8

系统管理命令和守护进程

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

$ man 3 printf

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

NAME(名称)

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

SYNOPSIS(概要)

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

DESCRIPTION(说明)

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

EXAMPLES(示例)

经常使用的一些示例。

SEE ALSO(参见)

相关命令或函数的列表。

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

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

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

$ ls --help

做业

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

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

(三)用户及文件权限管理

1、Linux 用户管理

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

  1. 查看用户
  • 输入的第一列表示打开当前伪终端的用户的用户名(要查看当前登陆用户的用户名,去掉空格直接使用 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.建立用户

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

3.用户组

方法一:使用groups命令

 

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

etc/group 文件格式说明

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

group_name:password:GID:user_list

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

4.删除用户

2、Linux 文件权限

1.查看文件权限

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

使用较长格式列出文件:

 

关于 ls 命令的一些其它经常使用的用法:

 

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

 

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

 

显示全部文件大小,并以普通人类能看懂的方式呈现:

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

2.变动文件全部者

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

3.修改文件权限

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

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

 

方式二:加减赋值操做

 

做业

添加一个用户loutest,使用sudo建立文件/opt/forloutest,设置成用户loutest能够读写。

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

1、Linux 目录结构

1.FHS 标准

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

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

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

2.目录路径

路径

绝对路径

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

相对路径

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

2、Linux 文件的基本操做

1.新建

新建空白文件

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

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

$ cd ~
$ touch test

新建目录

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

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

2.复制

复制文件

使用cp(copy)命令复制一个文件或目录到指定目录。

复制目录

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

要成功复制目录须要加上-r或者-R参数,表示递归复制

3.删除

删除文件

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

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

$ rm -f test

删除目录

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

$ rm -r family

 

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

移动文件

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

 

重命名文件

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

$ mv file1 myfile

批量重命名

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

5.查看文件

使用cat,tacnl命令查看文件

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

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

好比咱们要查看以前从"/etc"目录下拷贝来的passwd文件,能够加上-n参数显示行号:

 

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文件:

 

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

使用headtail命令查看文件

 

6.查看文件类型

前面我提到过,在 Linux 下面文件的类型不是根据文件后缀来判断的,咱们一般使用file命令能够查看文件的类型:

 

7.编辑文件

在 Linux 下面编辑文件一般咱们会直接使用专门的命令行编辑器好比(emacs,vim,nano),因为涉及 Linux 上的编辑器的内容比较多,且很是重要,故咱们有一门单独的基础课专门介绍这其中一个编辑器(vim)。

做业

 

(五)环境变量与文件查找

1、环境变量

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

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

$ declare tmp

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

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

$ tmp=shiyanlou

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

$ echo $tmp
 
 

2.环境变量

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

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

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

命令

说明

set

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

env

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

export

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

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

 

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

查看PATH环境变量的内容:

$ echo $PATH

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

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

下面咱们将练习建立一个最简单的可执行 Shell 脚本和一个使用 C 语言建立的"hello world"程序

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

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

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

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

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

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

5.修改和删除已有变量

变量修改

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

变量设置方式

说明

${变量名#匹配字串}

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

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

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

${变量名%匹配字串}

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

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

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

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

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

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

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

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

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

$ source .zshrc

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

$ . ./.zshrc

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

2、搜索文件

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

  • whereis简单快速

 

 

做业

(六)文件打包与压缩

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压缩打包程序

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

    • 设置压缩级别为9和1(9最大,1最小),从新打包:

    $ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip

    $ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip

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

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

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

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

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

$ zip -r -e -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 上解压后没有任何问题,那么你还须要对命令作一些修改:

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

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

  1. 使用unzip命令解压缩zip文件
  • 将shiyanlou.zip解压到当前目录:
  • $ unzip shiyanlou.zip
    • 使用安静模式,将文件解压到指定目录:
    • $ unzip -q shiyanlou.zip -d ziptest
 

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

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

 

3.rar打包压缩命令

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

  • 安装rar和unrar工具:

$ 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打包工具

  • 建立一个 tar 包:

$ tar -cf shiyanlou.tar ~

 
  • 解包一个文件(-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

做业

(七)文件系统操做与磁盘管理

1、简单文件系统操做

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

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

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

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

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

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

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

2、简单的磁盘管理

1.建立虚拟磁盘

咱们先来试试用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

前面说到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

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

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

$ sudo mount

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

# 命令格式 sudo umount 已挂载设备名或者挂载点,如:
$ sudo umount /mnt
使用 fdisk 为磁盘分区(关于分区的一些概念不清楚的用户请参看主引导记录
 
           

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

 

做业

(八)命令执行顺序控制与管道

1、命令执行顺序的控制

1.顺序执行多条命令

一般状况下,咱们每次只能在终端输入一条命令,按下回车执行,执行完成后,咱们再输入第二条命令,而后再按回车执行…… 你可能会遇到以下使用场景:我须要使用apt-get安装一个软件,而后安装完成后当即运行安装的软件(或命令工具),又恰巧你的主机才更换的软件源尚未更新软件列表(好比以前咱们的环境中,每次从新开始实验就得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则执行后面的,不然不执行,你能够从$?环境变量获取上一次命令的返回结果:

一般状况下,咱们每次只能在终端输入一条命令,按下回车执行,执行完成后,咱们再输入第二条命令,而后再按回车执行…… 你可能会遇到以下使用场景:我须要使用apt-get安装一个软件,而后安装完成后当即运行安装的软件(或命令工具),又恰巧你的主机才更换的软件源尚未更新软件列表(好比以前咱们的环境中,每次从新开始实验就得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则执行后面的,不然不执行,你能够从$?环境变量获取上一次命令的返回结果:

一般状况下,咱们每次只能在终端输入一条命令,按下回车执行,执行完成后,咱们再输入第二条命令,而后再按回车执行…… 你可能会遇到以下使用场景:我须要使用apt-get安装一个软件,而后安装完成后当即运行安装的软件(或命令工具),又恰巧你的主机才更换的软件源尚未更新软件列表(好比以前咱们的环境中,每次从新开始实验就得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则执行后面的,不然不执行,你能够从$?环境变量获取上一次命令的返回结果:

 

 

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

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

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个字节的,具体数目是由字符编码决定的

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

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

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 命令查看。



(九)简单的文本处理

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


(十)数据流重定向

  1、数据流重定向

1.简单的重定向

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

文件描述符

设备文件

说明

0

/dev/stdin

标准输入

1

/dev/stdout

标准输出

2

/dev/stderr

标准错误

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

 

2.标准错误重定向

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

4.永久重定向

5.建立输出文件描述符

6.关闭文件描述符

7.彻底屏蔽命令的输出

8.使用 xargs 分割参数列表

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

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

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

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

 

做业:

 

(十一)正则表达式基础

1、正则表达式

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

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

1. 举例

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 子集的适用于perl和python编程语言及grep或egrep的正则表达式匹配规则:(因为markdown表格解析的问题,下面的竖直分隔符用全角字符代替,实际使用时请换回半角字符)

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

2、grep模式匹配命令

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

1.基本操做

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

参数

说明

-E

POSIX扩展正则表达式,ERE

-G

POSIX基本正则表达式,BRE

-P

Perl正则表达式,PCRE

不过在你没学过perl语言的大多数状况下你将只会使用到ERE和BRE,因此咱们接下来的内容都不会讨论到PCRE中特有的一些正则表达式语法(它们之间大部份内容是存在交集的,因此你不用担忧会遗漏多少重要内容)

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

参数

说明

-b

将二进制文件做为文原本进行匹配

-c

统计以模式匹配的数目

-i

忽略大小写

-n

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

-v

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

-r

递归匹配查找

-A n

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

-B n

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

--color=auto

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

2.使用正则表达式

3、sed 流编辑器

4、awk文本处理语言

 

做业:

(十二)Linux 下软件安装

1、Linux 上的软件安装

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

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

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

2、在线安装

试想一下,平时咱们在使用 Windows 的时候,想要安装一个软件,咱们须要在网上去下载对应软件的安装包,接着安装的时候就是不断的去点击下一步,这些流程想必你们已经经历的无数回了,可是在 Linux 下,一个命令加回车,等待一下,软件就安装好了,这就是方便的在线安装软件的方式。

 

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.安装软件包

 

5.软件升级

 

6.卸载软件

若是你如今以为 w3m 这个软件不合本身的胃口一样是一个命令加回车 sudo apt-get remove w3m ,系统会有一个确认的操做

7.软件搜索

 做业:

相关文章
相关标签/搜索