学习计时:共11小时html 读书:4前端 代码:3node 做业:2python 博客:2linux |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1、学习目标git |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 可以独立安装Linux操做系统
2. 可以熟练使用Linux系统的基本命令
3. 熟练使用Linux中用户管理命令/系统相关命令/文件目录相关命令/打包压缩相关命令/比较合并相关命令/网络相关命令等
4. 熟练应用“搜索”进行触类旁通的学习
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2、学习资源web |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 课程资料:https://www.shiyanlou.com/courses/413 实验一,课程邀请码:W7FQKW4Y正则表达式 2. Linux 基础入门:https://www.shiyanlou.com/courses/1(重点,第一次课考核内容所有从这里面出)shell |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3、学习方法 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同窗,请你不要由于困难半途而废。
2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对本身负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。经过实验楼环境或本身安装的虚拟机在实践中进行学习
4. 实验报告很重要:详细记录你完成项目任务的思路,得到老师点评和帮助本身复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程经过博客发表,博客标题“信息安全系统设计基础第一周学习总结”
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4、学习任务 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(提示:请将要求学生完成的任务、测验或思考题列在此处) 1. 重点学习 cheat/find/locate/grep/man/whereis/which/apt-get 查找帮助文档、各类示例多多练习,这几个命令会贯穿咱们整个学习的学习,掌握这几个命令就能够很好学习其余命令了。 2. 这学期须要掌握的命令有ac,apt-get,bzip2,cat,chgrp,chmod,chown,clear,compress,cp,dd,df,diff,du,dump,evn,find,finger,free,grep,gzip,head,kill,less,ln,locate,l,gout,ls,man,mkdir,more,mount,mt,mv,netstat,nslookup,od,passwd,patch,ps,pstop,pwd,rm,shell,sort,ssh,stty,tail,tar,telnet,touch,tree,uname,unzip,vi,vim,whereis,which,who,write等 3. 测试示例:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
五、后续学习预告(可选): |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Linux下C语言编程基础:
VIM进行编辑
GCC进行编译
GDB进行调试
Make进行自动化
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
六、学习过程 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
实验一 Linux 简介
本节主要介绍 Linux 的历史,Linux 与 Windows 的区别等入门知识。
1、Linux 为什么物
Linux 就是一个操做系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操做系统是什么,就不用过多解释了,若是你学习过前面的入门课程,应该会有个基本概念了,这里简单介绍下操做系统在整个计算机系统中的角色。
Linux 也就是系统调用和内核那两层,固然直观的来看,咱们使用的操做系统还包含一些在其上运行的应用程序,好比文本编辑器,浏览器,电子邮件。
2、Linux 历史简介
操做系统始于二十世纪 50 年代,当时的操做系统能运行批处理程序。批处理程序不须要用户的交互,它从文件或者穿孔卡片读取数据,而后输出到另一个文件或者打印机。
二十世纪六十年代初,交互式操做系统开始流行。它不只仅能够交互,还能使多个用户从不一样的终端同时操做主机。这样的操做系统被称做分时操做系统,它的出现对批处理操做系统是个极大的挑战。许多人尝试开发分时操做系统, 其中包括一些大学的研究项目和商业项目。当时有一个项目叫作" Multics ",它的技术在当时很创新。" Multics "项目的开发并不顺利。它花费了远超过预计的时间来完成,却没有在操做系统市场上占到多少份额。而参加该项目的一个开发团体-贝尔实验室退出了这个项目。他们在退出后开发了他们本身的一个操做系统—— UNIX。UNIX 最初免费发布并所以在大学里受到欢迎。后来,UNIX 实现了 TCP/IP 协议栈,成为了早期工做站的操做系统的一个流行选择。
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)
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.注重基础,从头开始
大体的学习路径以下:
实验二 基本概念及操做
实验介绍
本节实验主要有:
一、实验楼环境介绍 二、经常使用 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,像以下几个你们熟知也最流行的实现了客户端功能的桌面环境KDE,GNOME,XFCE,LXDE,其中就有你看到的,实验楼目前使用的XFCE 桌面环境,部分老用户可能能够回想起,实验楼以前使用的环境是LXDE。这也意味着在 Linux 上你能够本身选择安装不一样的桌面环境,甚至能够定制本身的专属桌面。
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了。
其余一些经常使用快捷键
2).学会利用历史输入命令
很简单,你能够使用键盘上的方向上键,恢复你以前输入过的命令,你一试便知。
3).学会使用通配符
通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(好比文件名,参数名)。当查找文件夹时,能够使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,经常使用通配符代替一个或多个真正的字符。
终端里面输入的通配符是由 Shell 处理的,不是由所涉及到命令语句处理的,它只会出如今命令的“参数值”里(它不用在 命令名称里, 命令不记得,那就用Tab补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其看成路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);不然就将该通配符做为一个普通字符传递给“命令”,而后再由命令进行处理。总之,通配符 实际上就是一种 Shell 实现的路径扩展功能。在 通配符被处理后, Shell 会先完成该命令的重组,而后再继续处理重组后的命令,直至执行该命令。
先使用 touch 命令建立 2 个文件,后缀都为 txt:
$ touch adsfasd.txt wergjlkas.txt
能够给文件随意命名,假如过了很长时间,你已经忘了这两个文件的文件名,如今你想在你大堆其余文件中找到这两个文本文件,就能够使用通配符:
$ ls *.txt
在建立文件的时候,若是须要一次性建立多个文件,好比:“love_1_linux.txt,love_2_linux.txt,... love_10_linux.txt”。在 Linux 中十分方便:
$ touch love_{1..10}_linux.txt
Shell 经常使用通配符:
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个区段,安排以下:
要查看相应区段的内容,就在 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
做业
能够使用默认已经安装的一个命令printerbanner:
实验三 用户及文件权限管理
实验介绍
一、Linux 中建立、删除用户,及用户组等操做。 二、Linux 中的文件权限设置。
1、Linux 用户管理下面学习 Linux 下的帐户管理的基础知识。 1.查看用户请打开终端,输入命令: $ who am i
输入的第一列表示打开当前伪终端的用户的用户名(要查看当前登陆用户的用户名,去掉空格直接使用
2.建立用户
在 Linux 系统里, root 权限,系统权限的一种,与 SYSTEM 权限能够理解成一个概念,但高于 Administrator 权限,root 是 Linux 和 UNIX 系统中的超级管理员用户账户,该账户拥有整个系统至高无上的权力,全部对象他均可以操做,因此不少黑客在入侵系统的时候,都要把权限提高到 root 权限,用 Windows 的方法理解也就是将本身的非法账户添加到 Administrators 用户组。更好比安卓操做系统中(基于 Linux 内核)得到 root 权限以后就意味着已经得到了手机的最高权限,这时候你能够对手机中的任何文件(包括系统文件)执行全部增、删、改、查的操做。 咱们通常登陆系统时都是以普通帐户的身份登陆的,要建立用户须要 root 权限,这里就要用到 $ sudo adduser lilei 按照提示输入 shiyanlou 密码(Linux 下密码输入一般都是不可见的),而后是给 lilei 用户设置密码,后面的选项的一些内容你能够选择直接回车使用默认值: 这个命令不但能够添加用户到系统,同时也会默认为新用户建立 home 目录: $ ls /home 如今你已经建立好一个用户,而且你能够使用你建立的用户登陆了,使用以下命令切换登陆用户: -l$ sulilei 退出当前用户跟退出终端同样能够使用
3.用户组
在 Linux 里面每一个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源,就跟家的形式差很少,你的兄弟姐妹(不一样的用户)属于同一个家(用户组),大家能够共同拥有这个家(共享资源),爸妈对待大家都同样(共享权限),你偶尔写写日记,其余人未经容许不能查看(私有资源和权限)。固然一个用户是能够属于多个用户组的,正如你既属于家庭,又属于学校或公司 在 Linux 里面如何知道本身属于哪些用户组呢? 方法一:使用groups命令$ |
命令 |
说明 |
set |
显示当前 Shell 全部环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量 |
env |
显示与当前用户相关的环境变量,还可让命令在指定环境中运行 |
export |
显示从 Shell 中导出成环境变量的变量,也能经过它将自定义变量导出为环境变量 |
能够更直观的使用vimdiff工具比较一下它们之间的差异:
$ temp=shiyanlou
$ export temp_env=shiyanlou
$ env|sort>env.txt
$ export|sort>export.txt
$ set|sort>set.txt
上述操做将命令输出经过管道|使用sort命令排序,再重定向到对象文本文件中。
$ vimdiff env.txt export.txt set.txt
使用vimdiff工具比较导出的几个文件的内容。
关于环境变量,能够简单的理解成在当前进程的子进程是否有效,有效则为环境变量,不然不是(有些人也将全部变量统称为环境变量,只是以全局环境变量和局部环境变量进行区分,咱们只要理解它们的实质区别便可)。咱们这里用export命令来体会一下,先在 Shell 中设置一个变量temp=shiyanlou,而后再新建立一个子 Shell 查看temp变量的值:
注意:为了与普通变量区分,一般咱们习惯将环境变量名设为大写
3.命令的查找路径与顺序
你可能很早以前就有疑问,咱们在 Shell 中输入一个命令,Shell 是怎么知道在哪去找到这个命令而后执行的呢?这是经过环境变量PATH来进行搜索的,熟悉 Windows 的用户可能知道 Windows 中的也是有这么一个 PATH 环境变量。这个PATH里面就保存了Shell中执行的命令的搜索路径。
查看PATH环境变量的内容:
$ echo $PATH
默认状况下你会看到以下输出:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
若是你还记得咱们在 Linux 目录结构那一节的内容,你就应该知道上面这些目录下放的是哪一类文件了。一般这一类目录下放的都是可执行文件,当咱们在 Shell 中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,若是存在同名的命令,则执行先找到的那个。
$ vim ello_shell.sh
在脚本中添加以下内容,保存并退出(注意不要省掉第一行,这不是注释,论坛有用户反应会有语法错误,就是由于没有了第一行):
#!/bin/zsh
for ((i=0; i<10; i++));do
echo "hello shell"
done
exit 0
为文件添加可执行权限:
$ chmod 755 hello_shell.sh
执行脚本
$ ./hello_shell.sh
建立一个 C 语言"hello world"程序:
$ vim hello_world.c
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
使用 gcc 生成可执行文件:
$ gcc -o hello_world hello_world.c
gcc 生成二进制文件默认具备可执行权限,不须要修改
在 shiyanlou 家目录建立一个mybin目录,并将上述 hello_shell.sh 和 hello_world 文件移动到其中:
$ mkdir mybin
$ mv hello_shell.sh hello_world mybin/
如今你能够在mybin目录中分别运行你刚刚建立的两个程序:
$ cd mybin
$ ./hello_shell.sh
$ ./hello_world
回到上一级目录,也就是shiyanlou家目录,当再想运行那两个程序时,会发现提示命令找不到,除非加上命令的完整路径,但那样很不方便,如何作到想使用系统命令同样执行本身建立的脚本文件或者程序呢?那就要将命令所在路径添加到PATH环境变量了。
4.添加自定义路径到“PATH”环境变量
在前面咱们应该注意到PATH里面的路径是以:做为分割符,因此咱们能够这样添加自定义路径:
$ PATH=$PATH:/home/shiyanlou/mybin
注意这里必定要使用绝对路径
如今你就能够在其余任意目录执行那两个命令了。你可能会意识到这样还并无很好的解决问题,由于我给 PATH 环境变量追加了一个路径,它也只是在当前 Shell 有效,我一旦退出终端,再打开就会发现又失效了。有没有方法让添加的环境变量全局有效?或者每次启动 Shell 时自动执行上面添加自定义路径到 PATH 的命令?下面咱们就来讲说后一种方式——让它自动执行。
在每一个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是.zshrc,相应 Bash 的配置文件为.bashrc。它们在etc下还都有一个或多个全局的配置文件,不过咱们通常只修改用户目录下的配置文件。
咱们能够简单的使用下面命令直接添加内容到.zshrc中:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的>是以覆盖的方式重定向到一个文件中,使用的时候必定要注意分辨。在指定文件不存在的状况下都会建立新的文件。
5.修改和删除已有变量
变量修改
变量的修改有如下几种方式:
变量设置方式 |
说明 |
${变量名#匹配字串} |
从头向后开始匹配,删除符合匹配字串的最短数据 |
${变量名##匹配字串} |
从头向后开始匹配,删除符合匹配字串的最长数据 |
${变量名%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最短数据 |
${变量名%%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最长数据 |
${变量名/旧的字串/新的字串} |
将符合旧字串的第一个字串替换为新的字串 |
${变量名//旧的字串/新的字串} |
将符合旧字串的所有字串替换为新的字串 |
好比要修改咱们前面添加到 PATH 的环境变量。为了不操做失误致使命令找不到,咱们先将 PATH 赋值给一个新的自定义变量 path:
$ path=$PATH
$ echo $path
$ path=${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多个任意字符
$ path=${path%*/mybin}
变量删除
能够使用unset命令删除一个环境变量:
$ unset temp
6.如何让环境变量当即生效
在上面咱们在 Shell 中修改了一个配置脚本文件以后(好比 zsh 的配置文件 home 目录下的.zshrc),每次都要退出终端从新打开甚至重启主机以后其才能生效,非常麻烦,咱们能够使用source命令来让其当即生效,如:
$ source .zshrc
source命令还有一个别名就是.,注意与表示当前路径的那个点区分开,虽然形式同样,但做用和使用方式同样,上面的命令若是替换成.的方式就该是$ . ./.zshrc
注意第一个点后面有一个空格,并且后面的文件必须指定完整的绝对或相对路径名,source 则不须要。
2、搜索文件
与搜索相关的命令经常使用的有以下几个whereis,which,find,locate。
$whereis who
你会看到它找到了三个路径,两个可执行文件路径和一个 man 在线帮助文件所在路径,这个搜索很快,由于它并无从硬盘中依次查找,而是直接从数据库中查询。whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。若是想要得到更全面的搜索结果能够使用locate命令。
经过"/var/lib/mlocate/mlocate.db"数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务天天自动执行updatedb命令更新一次,因此有时候你刚添加的文件,它可能会找不到,须要手动执行一次updatedb命令(在咱们的环境中必须先执行一次该命令)。它能够用来查找指定目录下的不一样文件类型,如查找 /etc 下全部以 sh 开头的文件:
$ locate /etc/sh
注意,它不仅是在 etc 目录下查找并会自动递归子目录进行查找
查找 /usr/share/ 下全部 jpg 文件:$ locate /usr/share/\*.jpg
注意要添加*号前面的反斜杠转义,不然会没法找到
若是想只统计数目能够加上-c参数,-i参数能够忽略大小写进行查找,whereis 的-b,-m,-s一样能够是使用。
which自己是 Shell 内建的一个命令,咱们一般使用which来肯定是否安装了某个指定的软件,由于它只从PATH环境变量指定的路径中去搜索命令:$ which man
find应该是这几个命令中最强大的了,它不但能够经过文件类型、文件名进行查找并且能够根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。find命令强大到,要把它将明白至少须要单独好几节课程才行,咱们这里只介绍一些经常使用的内容。
在指定目录下搜索指定文件名的文件:
$ find /etc/ -name interfaces
注意 find 命令的路径是做为第一个参数的,基本命令格式为 find [path] [option] [action]
与时间相关的命令参数:
参数 |
说明 |
-atime |
最后访问时间 |
-ctime |
建立时间 |
-mtime |
最后修改时间 |
下面以-mtime参数举例:
列出 home 目录中,当天(24 小时以内)有改动的文件:$ find ~ -mtime 0
列出用户家目录下比Code文件夹新的文件:
$ find ~ -newer /home/shiyanlou/Code
做业
《黑客帝国》电影里满屏幕代码的“数字雨”,在 Linux 里面你也能够轻松实现这样的效果,你只须要一个命令cmatrix。
须要先安装,由于 Ubuntu 没有预装:$ sudo apt-get update;sudo apt-get install cmatrix
装好以后先不要急着执行,为了看到更好的效果,咱们须要先修改终端的主题配色,修改成黑底绿字,修改方法见下图:而后按下F11 能够全屏显示。
实验六 文件打包与压缩
实验介绍
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 -r -q -o shiyanlou.zip /home/shiyanlou
$ du -h shiyanlou.zip
$ file shiyanlou.zip
上面命令将 shiyanlou 的 home 目录打包成一个文件,并查看了打包后文件的大小和类型。第一行命令中,-r参数表示递归打包包含子目录的所有内容,-q参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。后面使用du命令查看打包后文件的大小(后面会具体说明该命令)。
$ 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
经过man 手册可知:
这样一目了然,你能够看到默认压缩级别应该是最高的,效果很明显,不过你在环境中操做以后看到的大小可能跟图上的有些不一样,由于在你使用过程当中,会随时还生成一些缓存文件在当前用户的家目录中,这对于咱们学习命令使用来讲,是可有可无的,能够忽略这些不一样。
使用-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来达到以上目的。
2.使用unzip命令解压缩zip文件
将shiyanlou.zip解压到当前目录:$ unzip shiyanlou.zip
使用安静模式,将文件解压到指定目录:$ unzip -q shiyanlou.zip -d ziptest
上述指定目录不存在,将会自动建立。若是你不想解压只想查看压缩包的内容你能够使用-l参数:$ unzip -l shiyanlou.zip
注意: 使用unzip解压文件时咱们一样应该注意兼容问题,不过这里咱们关心的再也不是上面的问题,而是中文编码的问题,一般 Windows 系统上面建立的压缩文件,若是有有包含中文的文档或以中文做为文件名的文件时默认会采用 GBK 或其它编码,而 Linux 上面默认使用的是 UTF-8 编码,若是不加任何处理,直接解压的话可能会出现中文乱码的问题(有时候它会自动帮你处理),为了解决这个问题,咱们能够在解压时指定编码类型。
使用-O(英文字母,大写o)参数指定编码类型:
unzip -O GBK 中文压缩文件.zip
3.rar打包压缩命令
rar也是 Windows 上经常使用的一种压缩文件格式,在 Linux 上能够使用rar和unrar工具分别建立和解压 rar 压缩包。
$ sudo apt-get update
$ sudo apt-get install rar unrar
$ rm *.zip
$ rar a shiyanlou.rar .
上面的命令使用a参数添加一个目录~到一个归档文件中,若是该文件不存在就会自动建立。
注意:rar 的命令参数没有-,若是加上会报错。
全路径解压:$ unrar x shiyanlou.rar
去掉路径解压:$ mkdir tmp
$ unrar e shiyanlou.rar tmp/
4.tar打包工具
在 Linux 上面更经常使用的是tar工具,tar 本来只是一个打包工具,只是同时仍是实现了对 7z,gzip,xz,bzip2 等工具的支持,这些压缩工具自己只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,因此咱们也无需再单独去学习其余几个工具,tar 的解压和压缩都是同一个命令,只需参数不一样,使用比较方便。
下面先掌握tar命令一些基本的使用方式,即不进行压缩只是进行打包(建立归档文件)和解包的操做。
上面命令中,-c表示建立一个 tar 包文件,-f用于指定建立的文件名,注意文件名必须紧跟在-f参数以后,好比不能写成tar -fc shiyanlou.tar,能够写成tar -f shiyanlou.tar -c ~。你还能够加上-v参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的/,你也能够使用-P保留绝对路径符
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
对于建立不一样的压缩格式的文件,对于tar来讲是至关简单的,须要的只是换一个参数,这里咱们就以使用gzip工具建立*.tar.gz文件为例来讲明。
如今咱们要使用其余的压缩工具建立或解压相应文件只须要更改一个参数便可:
压缩文件格式 |
参数 |
*.tar.gz |
-z |
*.tar.xz |
-J |
*tar.bz2 |
-j |
tar 命令的参数不少,不过经常使用的就是上述这些,须要了解更多你能够查看 man 手册获取更多帮助。
做业
天冷的时候,要是有个火炉就行了。这里有个有趣的程序:
$ sudo apt-get install libaa-bin
# 提示command not found,请自行解决
$ aafire
本节实验的文件系统操做的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习 Linux 和实验楼后续其余课程的过程当中有极大帮助。
由于本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前面省略了关于 Linux 文件系统的一些基本知识,也由于咱们是在线实验环境,因此也避开了不多一部分但又十分重要的关于硬件的内容,咱们只能期待用户可以抱着提升自学能力的心态本身去补充相关的知识。
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 目录树结构的内容,那么你就应该能很好的理解挂载的概念,这里就再也不赘述。
这个命令前面其实已经用了不少次了:
# 默认一样以 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手册中获取命令的完整描述,记全称就不会搞混了。
一般状况下,这一小节应该直接将如何挂载卸载磁盘,如何格式化磁盘,如何分区,但如你所见,咱们的环境中没东西给你挂,也没东西给你格和分,因此首先咱们会先建立一个虚拟磁盘来进行后续的练习操做
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 个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用和du
和cat
命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其余的多余输入将被截取并保留在标准输入。
前面说到dd
在拷贝的同时还能够实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件:
$ if/dev/stdin101dd=of=test bs=count=conv=ucase
你能够在man
文档中查看其余全部转换参数。
经过上面一小节,你应该掌握了dd
的基本使用,下面就来使用dd
命令来完成建立虚拟磁盘的第一步。
从/dev/zero
设备建立一个容量为 256M 的空文件:
$ if/dev/zero1256dd=of=virtual.img bs=M count=
$ du -h virtual.img
而后咱们要将这个文件格式化(写入文件系统),这里咱们要学到一个(准确的说是一组)新的命令来完成这个需求。
你能够在命令行输入 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
(咱们的环境中没法查看)查看。
用户在 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
# 命令格式 sudo umount 已挂载设备名或者挂载点,如:
$ sudo umount /mnt
不过遗憾的是,因为咱们环境的问题(环境中使用的 Linux 内核在编译时没有添加对 Loop device的支持),因此你将没法挂载成功:
另外关于 loop 设备,你可能会有诸多疑问,那么请看下面来自维基百科/dev/loop的说明:
在类 UNIX 系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件能够如同块设备通常被访问。
在使用以前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将容许文件视为块特殊文件(参见设备文件系统)使用。所以,若是文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备通常被挂载。
这种设备文件常常被用于光盘或是磁盘镜像。经过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出如今挂载点目录。若是挂载目录中自己有文件,这些文件在挂载后将被禁止使用。
一样由于环境缘由中没有物理磁盘,也没法建立虚拟磁盘的缘由咱们就没法实验练习使用该命令了,下面我将以个人物理主机为例讲解如何为磁盘分区。
# 查看硬盘分区表信息
-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
写入分区表。
$ 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
实验八
命令执行顺序控制与管道
实验介绍
顺序执行、选择执行、管道、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
这时你可能就会想要是我能够一次性输入完,让它本身去一次执行各命令就行了,这就是咱们这一小节要解决的问题。
简单的顺序执行你能够使用;来完成,好比上述操做你能够:
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
# 让它本身运行
2.有选择的执行命令
关于上面的操做,不知你有没有思考过一个问题,若是咱们在让它自动顺序执行命令时,前面的命令执行不成功,然后面的命令又依赖与上一条命令的结果,那么就会形成花了时间,最终却获得一个错误的结果,并且有时候直观的看你还没法判断结果是否正确。那么咱们须要可以有选择性的来执行命令,好比上一条命令执行成功才继续下一条,或者不成功又该作出其它什么处理,好比咱们使用which来查找是否安装某个命令,若是找到就执行该命令,不然什么也不作(虽然这个操做没有什么实际意义,但可帮你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你若是没有安装cowsay,你能够先执行一次上述命令,你会发现什么也没发生,你再安装好以后你再执行一次上述命令,你也会发现一些惊喜。
上面的&&就是用来实现选择性执行的,它表示若是前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0则执行后面的,不然不执行,你能够从$?环境变量获取上一次命令的返回结果:
学习过 C 语言的用户应该知道在 C 语言里面&&表是逻辑与,并且还有一个||表示逻辑或,一样 Shell 也有一个||,它们的区别就在于,shell中的这两个符号除了也可用于表示逻辑与和或以外,就是能够实现这里的命令执行顺序的简单控制。||在这里就是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令:
$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"
除了上述基本的使用以外,咱们还能够结合这&&和||来实现一些操做,好比:
$ which cowsay>/dev/null && echo "exist" || echo "not exist"
我画个流程图来解释一下上面的流程:
思考
上面咱们讲到将&&和||结合起来使用,那么是否以任意顺序都行?好比上面咱们是&&在前||在后,反过来能够么?会不会有问题?
2、管道
管道是什么,管道是一种通讯机制,一般用于进程间的通讯(也可经过socket进行网络通讯),它表现出来的形式就是将前面每个进程的输出(stdout)直接做为下一个进程的输入(stdin)。
管道又分为匿名管道和具名管道(这里将不会讨论在源程序中使用系统调用建立并使用管道的状况,它与命令行的管道在内核中实际都是采用相同的机制)。咱们在使用一些过滤程序时常常会用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的内容中咱们已经屡次使用到了。具名管道简单的说就是有名字的管道,一般只会在源程序中用到具名管道。下面咱们就将经过一些经常使用的能够使用管道的"过滤程序"来帮助你熟练管道的使用。
1.试用
先试用一下管道,好比查看/etc目录下有哪些文件和目录,使用ls命令来查看:
$ ls -al /etc
有太多内容,屏幕不能彻底显示,这时候能够使用滚动条或快捷键滚动窗口来查看。不过这时候能够使用管道:
$ ls -al /etc | less
经过管道将前一个命令(ls)的输出做为下一个命令(less)的输入,而后就能够一行一行地看。
2.cut 命令,打印每一行的某一字段
打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:
$ cut /etc/passwd -d ':' -f 1,6
打印/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
文本处理命令还有不少,下一节将继续介绍一些经常使用的文本处理的命令。
做业
使用之前介绍过的方法,安装aview和imagemagick,而后用asciiview命令显示图片,使用方法能够用 man 命令查看。
Linus大神的照片地址http://labfile.oss.aliyuncs.com/courses/1/Linus.png
实验九
这一节咱们将介绍这几个命令tr
(注意不是tar),col
,join
,paste
。实际这一节是上一节关于能实现管道操做的命令的延续,因此咱们依然将结合管道来熟悉这些命令的使用。
tr 命令能够用来删除一段文本信息中的某些文字。或者将其进行转换。
tr[option].SET1[SET2]..
选项 |
说明 |
|
删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
|
去除set1指定的在输入文本中连续并重复的字符 |
# 删除 "hello shiyanlou" 中全部的'o','l','h'
echo'hello shiyanlou'-d'olh'$| tr
# 将"hello" 中的ll,去重为一个l
echo'hello'-s'l'$| tr
# 将输入文本,所有转换为大写或小写输出
'[:lower:]''[:upper:]'$ cat /etc/passwd | tr
# 上面的'[:lower:]' '[:upper:]'你也能够简单的写做'[a-z]' '[A-Z]',固然反过来将大写变小写也是能够的
更多 tr 的使用,你能够使用--help
或者man tr
得到。
col 命令能够将Tab
换成对等数量的空格建,或反转这个操做。
col [option]
选项 |
说明 |
|
将 |
|
将空格转换为 |
# 查看 /etc/protocols 中的不可见字符,能够看到不少 ^I ,这其实就是 Tab 转义成可见字符的符号
$ cat -A /etc/protocols
# 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,而后再使用 cat 查看,你发现 ^I 不见了
$ cat /etc/protocols | col -x | cat -A
学过数据库的用户对这个应该不会陌生,这个命令就是用于将两个文件中包含相同内容的那一行合并在一块儿。
join[option]... file1 file2
选项 |
说明 |
|
指定分隔符,默认为空格 |
|
忽略大小写的差别 |
|
指明第一个文件要用哪一个字段来对比,,默认对比第一个字段 |
|
指明第二个文件要用哪一个字段来对比,,默认对比第一个字段 |
# 建立两个文件
$ '1 hello'echo> file1
$ '1 shiyanlou'echo> file2
$ join file1 file2
# 将/etc/passwd与/etc/shadow两个文件合并,指定以':'做为分隔符
$ ':'sudo join -t/etc/passwd /etc/shadow
# 将/etc/passwd与/etc/group两个文件合并,指定以':'做为分隔符, 分别比对第4和第3个字段
$ ':'1423sudo join -t-/etc/passwd -/etc/group
paste
这个命令与join
命令相似,它是在不对比数据的状况下,简单地将多个文件合并一块儿,以Tab
隔开。
paste[option]file...
选项 |
说明 |
|
指定合并的分隔符,默认为Tab |
|
不合并到一行,每一个文件为一行 |
echo$hello > file1
echo$shiyanlou > file2
echo$www.shiyanlou.com > file3
-d':'$ pastefile1 file2 file3
-s$ pastefile1 file2 file3
上面这些命令不是全部你都会常常用到,不过它们确是很实用的,熟练掌握以后,能够减轻不少工做量,好比不停的用鼠标操做在 gedit 里面复制粘贴赋值粘贴,将两个文件的内容合并为一个文件,这本来只须要一个命令就能完成。
一、在《文件打包与解压缩》一节实验中提到 Windows/dos 与 Linux/UNIX 文本文件一些特殊字符不一致,如断行符 Windows 为 CR+LF(\r\n
),Linux/UNIX 为 LF(\n
)。使用cat -A
文本
能够看到文本中包含的不可见特殊字符。Linux 的\n
表现出来就是一个$
,而 Windows/dos 的表现为^M$
,能够直接使用dos2unix
和unix2dos
工具在两种格式之间进行转换,使用file
命令能够查看文件的具体类型。不过如今但愿你在不使用上述两个转换工具的状况下,使用前面学过的命令手动完成 dos 文本格式到 UNIX 文本格式的转换。
二、还记得小时候在小霸王上面玩的小蜜蜂游戏么?它的正统名字应该是Space Invaders:太空侵略者。
使用下面这个命令能够安装,之因此叫 ninvaders 是由于这款游戏是基于 ncurses 命令行图形库作的:
getsudo apt-install ninvaders
实验十
你可能对重定向这个概念感到些许陌生,但你应该在前面的课程中屡次见过>
或>>
操做了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中。这其实就是重定向,将本来输出到标准输出的数据重定向到一个文件中,由于标准输出(/dev/stdout
)自己也是一个文件,咱们将命令输出导向另外一个文件天然也是没有任何问题的。
下面咱们简单的回顾一下咱们前面常常用到的两个重定向操做:
$ 'hello shiyanlou'echo> redirect
$ 'www.shiyanlou.com'>> echoredirect
$ cat redirect
固然前面没有用到的<
和<<
操做也是没有问题的,如你理解的同样,它们的区别在于重定向的方向不一致而已,>
表示是从左到右,<
右到左。
在更多了解 Linux 的重定向以前,咱们须要先知道一些基本的东西,前面咱们已经提到过 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin
(标准输入,对应于你在终端的输入),stdout
(标准输出,对应于终端的输出),stderr
(标准错误输出,对应于终端的输出)。
文件描述符 |
设备文件 |
说明 |
|
|
标准输入 |
|
|
标准输出 |
|
|
标准错误 |
文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者建立一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写每每会围绕着文件描述符展开。可是文件描述符这一律念每每只适用于 UNIX、Linux 这样的操做系统。
另外还有一个符号-
,它能够同时做为前一个命令的。
咱们能够这样使用这些文件描述符:
默认使用终端的标准输入做为命令的输入和标准输出做为命令的输出
$ cat
CtrlC(按+退出)
将cat的连续输出(heredoc方式)重定向到一个文件
$ mkdir Documents
$ cat > Documents/test.c\~ <<EOF
#include <stdio.h>
int main()
{
printf"hello world\n" ();
return0 ;
}
EOF
将一个文件做为命令的输入,标准输出做为命令的输出
$ Documentscat/test.c\~
将echo命令经过管道传过来的数据做为cat命令的输入,将标准输出做为命令的输出
echo'hi'$| cat
将echo命令的输出从默认的标准输出重定向到一个普通文件
$ 'hello shiyanlou'echo> redirect
$ cat redirect
初学者这里要注意不要将管道和重定向混淆,管道默认是链接前一个命令的输出到下一个命令的输入,而重定向一般是须要一个文件来创建两个命令的链接,你能够仔细体会一下上述第三个操做和最后两个操做的异同点。
重定向标准输出到文件,这是一个很实用的操做,另外一个很实用的操做是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,因此咱们常常看到的一个命令的输出一般是同时包含了标准输出和标准错误的结果的。好比下面的操做:
# 使用cat 命令同时读取两个文件,其中一个存在,另外一个不存在
$ Documentscat/test.c\~ hello.c
# 你能够看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
# 下面咱们将输出重定向到一个文件,根据咱们前面的经验,这里将在看不到任何输出了
$ Documentscat/test.c\~ hello.c > somefile
遗憾的是,这里依然出现了那条错误信息,这正是由于如我上面说的那样,标准输出和标准错误虽然都指向终端屏幕,实际它们并不同。那有的时候咱们就是要能够隐藏某些错误或者警告,那又该怎么作呢。这就须要用到咱们前面讲的文件描述符了:
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ Documents21cat/test.c\~ hello.c >somefile >&
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ Documentscat/test.c\~ hello.c &>somefilehell
注意你应该在输出重定向文件描述符前加上&
,不然shell会当作重定向到一个文件名为1的文件中
tee
命令同时重定向到多个文件
常常你可能还有这样的需求,除了将须要将输出重定向到文件以外也须要将信息打印在终端,那么你能够使用tee
命令来实现:
echo'hello shiyanlou'$| tee hello
你应该能够看出咱们前面的重定向操做都只是临时性的,即只对当前命令有效,那如何作到“永久”有效呢,好比在一个脚本中,你须要某一部分的命令的输出所有进行重定向,难道要让你在每一个命令上面加上临时重定向的操做嘛,固然不须要,咱们能够使用exec
命令实现“永久”重定向。exec
命令的做用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:
# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ 1exec>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么作)
$ ls
$ exit
$ cat somefile
默认在 Shell 中能够有9个打开的文件描述符,上面咱们使用了也是它默认提供的0
,1
,2
号文件描述符,另外咱们还能够使用3-8的文件描述符,只是它们默认没有打开而已,你能够使用下面命令查看当前 Shell 进程中打开的文件描述符:
cd$/dev/fd/;ls -Al
一样使用exec
命令能够建立新的文件描述符:
$ zsh
$ 3exec>somefile
# 先进入目录,再查看,不然你可能不能获得正确的结果,而后再回到上一次的目录
$ Alcd /dev/fd/;ls -;cd -
# 注意下面的命令>与&之间不该该有空格,若是有空格则会出错
$ "this is test"3echo>&
$ cat somefile
$ exit
如上面咱们打开的3号文件描述符,能够使用以下操做将它关闭:
exec3$>&-
cdcd$/dev/fd;ls -Al;-
在 Linux 中有一个被成为“黑洞”的设备文件,因此导入它的数据都将被“吞噬”。
在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它一般被用于丢弃不须要的输出流,或做为用于输入流的空文件,这些操做一般由重定向完成。读取它则会当即获得一个EOF。
咱们能够利用设个/dev/null
屏蔽命令的输出:
1/dev/null21$ cat Documents/test.c\~ nefile>>&
向上面这样的操做将使你得不到任何输出结果。
xargs 是一条 UNIX 和类 UNIX 操做系统的经常使用命令。它的做用是将参数列表转换成小块分段传递给其余命令,以免参数列表过长的问题。
这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。
-d-fecho$ cut:1 < /etc/passwd | sort | xargs
上面这个命令用于将/etc/passwd
文件按:
分割取第一个字段排序后,使用echo
命令生成一个列表。
一、理解下面这段代码的的做用,实际这段代码不会正常工做,请结合这一小节的知识分析这段代码没有正确工做的缘由,并设法解决这个问题。
若是你尚未 Shell 脚本编程的基础,你能够选择跳过或者到这里高级 Bash 编程指南学习
whilereaddofilename;
$filename rm -iv
done<<(ls)
二、以前介绍过一个在命令行将图片转换为 ascii 字符查看的工具 aview/asciiview,不过它是黑白的。如今,这里是个彩色的:
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
实验十一
正则表达式基础
实验介绍
虽然咱们这一节的标题是正则表达式,但实际这一节实验只是介绍grep,sed,awk这三个命令,而正则表达式做为这三个命令的一种使用方式(命令输出中能够包含正则表达式)。正则表达式自己的内容不少,要把它说明清楚须要单独一门课程来实现,不过咱们这一节中涉及到的相关内容一般也可以知足不少状况下的需求了。
想要更深刻地学习使用正则表达式,在这里 正则表达式基础。
1、正则表达式
什么是正则表达式呢?
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在不少文本编辑器里,正则表达式一般被用来检索、替换那些符合某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操做。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 UNIX 中的工具软件(例如sed和grep)普及开的。正则表达式一般缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。
简单的说形式和功能上正则表达式和咱们前面讲的通配符很像,不过它们之间又有很大差异,特别在于一些特殊的匹配字符的含义上,但愿初学者注意不要将二者弄混淆。
1. 举例
假设咱们有这样一个文本文件,包含"shiyanlou",和"shilouyan"这两个字符串,一样一个表达式:
shi*
若是这做为一个正则表达式,它将只能匹配 shi,而若是不是做为正则表达式*做为一个通配符,则将同时匹配这两个字符串。这是为何呢?由于在正则表达式中*表示匹配前面的子表达式(这里就是它前面一个字符)零次或屡次,好比它能够匹配"sh","shii","shish","shiishi"等等,而做为通配符表示匹配通配符后面任意多个任意字符,因此它能够匹配"shiyanlou",和"shilouyan"两个字符。
体验完了,下面就来开始正式学习正则表达式吧。
2.基本语法:
一个正则表达式一般被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。
选择
|竖直分隔符表示选择,例如"boy|girl"能够匹配"boy"或者"girl"
数量限定
数量限定除了咱们举例用的*,还有+加号,?问号,.点号,若是在一个模式中不加数量限定符则表示出现一次且仅出现一次:
范围和优先级
()圆括号能够用来定义模式字符串的范围和优先级,这能够简单的理解为是否将括号内的模式串做为一个总体。例如,"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 正则表达式库和一些经典的正则表达式库。
字符 |
描述 |
\ |
将下一个字符标记为一个特殊字符、或一个原义字符。例如,“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语言的大多数状况下你将只会使用到ERE和BRE,因此咱们接下来的内容都不会讨论到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命令的内容就介绍这么多,下面会介绍两个更强大的工具sed和awk,但一样也正是由于这两个工具的强大,咱们的内容没法包含它们的所有,这里将只对基本内容做介绍。
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
# "quote>" 不用输入
$ awk '{
> }' test
# 或者写到一行
$ awk '{print}' test
说明:在这个操做中我是省略了patter,因此awk会默认匹配输入文本的所有内容,而后在"{}"花括号中执行动做,即print打印全部匹配项,这里是所有文本内容
$ 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++语言基本一致,若是你有这些语言的基础,这里将很好理解。另外一个你须要注意的是NR与OFS,这两个是awk内建的变量,NR表示当前读入的记录数,你能够简单的理解为当前处理的行数,OFS表示输出时的字段分隔符,默认为" "空格,如上图所见,咱们将字段分隔符设置为\n换行符,因此第一行本来以空格为字段分隔的内容就分别输出到单独一行了。而后是$N其中N为相应的字段号,这也是awk的内建变量,它表示引用相应的字段,由于咱们这里第一行只有三个字段,因此只引用到了$3。除此以外另外一个这里没有出现的$0,它表示引用当前记录(当前行)的所有内容。
$ 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 语句中直接打印特殊符号如这里的\t,print打印的非变量内容都须要用""一对引号包围起来。上面另外一个版本,展现了实现预先指定变量分隔符的另外一种方式,即便用BEGIN,就这个表达式指示了,其后的动做将在全部动做以前执行,这里是FS赋值了新的"."点号代替默认的" "空格
注意:首先说明一点,咱们在学习和使用awk的时候应该尽量将其做为一门程序语言来理解,这样将会使你学习起来更容易,因此初学阶段在练习awk时应该尽可能按照我那样的方式分多行按照通常程序语言的换行和缩进来输入,而不是所有写到一行(固然这在你熟练了以后是没有任何问题的)。
6.awk经常使用的内置变量
变量名 |
说明 |
FILENAME |
当前输入文件名,如有多个文件,则只表示第一个。若是输入是来自标准输入,则为空字符串 |
$0 |
当前记录的内容 |
$N |
N表示字段号,最大值为NF变量的值 |
FS |
字段分隔符,由正则表达式表示,默认为" "空格 |
RS |
输入记录分隔符,默认为"\n",即一行为一个记录 |
NF |
当前记录字段数 |
NR |
已经读入的记录数 |
FNR |
当前输入文件的记录数,请注意它与NR的区别 |
OFS |
输出字段分隔符,默认为" "空格 |
ORS |
输出记录分隔符,默认为"\n" |
关于awk的内容本课程将只会包含这些内容,若是你想了解更多,请期待后续课程,或者参看一下连接内容:
做业
一、练习其余几个命令动做的使用。
二、一个在线游戏,固然咱们主要目的是学习,这个游戏也是有寓教于乐的性质,让你快速学会vim的基础操做:
实验十二
Linux 下软件安装
实验介绍
介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用。
1、Linux 上的软件安装
一般 Linux 上的软件安装主要有三种方式:
这几种安装方式各有优劣,而大多数软件包会采用多种方式发布软件,因此咱们经常须要所有掌握这几种软件安装方式,以便适应各类环境。下面将介绍前三种安装方式,从源码编译安装你将在 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
7、遇到的问题及解决
8、其余
经过此次试验,我对Linux有了基本的认识,学习到了不少新知识。由于实验有点多,因此效率不是过高,而且没有彻底消化,但愿之后能够提升效率,继续深刻理解所学知识。