Linux 第一次学习笔记

1、Linux 为什么物node

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

                       

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

2、Linux 重要人物

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

 

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

 

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

 

4.Bill Joy:BSD 开发者

 

5.Tanenbaum:Minix 开发者

 

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

 

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

1.免费与收费

  • 最新正版 Windows8.1 官方售价 ¥888;
  • Linux 免费或少量费用。
  • Windows 平台:数量和质量的优点,不过大部分为收费软件;由微软官方提供重要支持和服务;
  • Linux 平台:大都为开源自由软件,用户能够修改定制和再发布,因为基本免费没有资金支持,部分软件质量和体验欠缺;有全球全部的 Linux 开发者和自由软件社区提供支持。
  • Windows 平台:三天两头打补丁安装系统安全更新,仍是会中病毒木马;
  • Linux 平台:要说 Linux 没有安全问题,那固然是不可能的,这一点仁者见仁智者见智,相对来讲确定比 Windows 平台要更加安全,使用 Linux 你也不用装某杀毒,某毒霸。
  • Windows:普通用户基本都是纯图形界面下操做使用,依靠鼠标和键盘完成一切操做,用户上手容易入门简单;
  • Linux:兼具图形界面操做(须要使用带有桌面环境的发行版)和彻底的命令行操做,能够只用键盘完成一切操做,新手入门较困难,须要一些学习和指导(这正是咱们要作的事情),一旦熟练以后效率极高。
  • Windows:这些年以前算是全封闭的,系统可定制性不好;
  • Linux:你想怎么作就怎么作,Windows 能作到得它都能,Windows 作不到的,它也能。

2.软件与支持

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

3.安全性 

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

4.使用习惯 

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

5.可定制性

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

6.应用范畴

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

7.Windows 没有的

  • 稳定的系统
  • 安全性和漏洞的快速修补
  • 多用户
  • 用户和用户组的规划
  • 相对较少的系统资源占用
  • 可定制裁剪,移植到嵌入式平台(如安卓设备)
  • 可选择的多种图形用户界面(如 GNOME,KDE)
  • 没有特定的支持厂商
  • 游戏娱乐支持度不足
  • 专业软件支持度不足
  • 明确目的:你是要用 Linux 来干什么,搭建服务器,作程序开发,仍是平常办公,仍是娱乐游戏;
  • 面对现实:Linux 大都在命令行下操做,可否接受不用或少用图形界面;
  • 是学习 Linux 操做系统自己仍是某一个Linux发行版(Ubuntu,CentOS,Fedora,OpenSUSE,Debian,Mint 等等),若是你对发行版的概念或者它们之间的关系不明确的话能够参看Linux 发行版

8.Linux 没有的 

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

4、如何学习 Linux

1.学习心态 

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

2.注重基础,从头开始

 

大体的学习路径以下:web

 

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

 

3、Linux终端

1.Terminal(终端)

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

3、Linux终端

1.Terminal(终端)

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

2.Shell

一般在图形界面中对实际体验带来差别的不是上述的不一样发行版的各类终端模拟器,而大都是这个 Shell(壳),有壳就有核,这里的核就是指的 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”的软件(命令解析器),相似于 DOS 下的 command(命令行)和后来的 cmd.exe。编程

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

3.命令行操做体验

 

1).重要快捷键:

[Tab]

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

[Ctrl+c]

使用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 实现的路径扩展功能。

先使用 touch 命令建立 2 个文件,后缀都为 txt,而后利用通用符来查询。

 

在建立文件的时候,若是须要一次性建立多个文件,好比:“20135212_text_1.txt20135212_text_2.txt... 20135212_text_10.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的缩写。

用户能够经过执行 man 命令调用手册页。

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

 

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

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

NAME(名称)

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

SYNOPSIS(概要)

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

DESCRIPTION(说明)

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

EXAMPLES(示例)

经常使用的一些示例。

SEE ALSO(参见)

相关命令或函数的列表。

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

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

做业

Banner:

 

Printerbanner:

 

Toilet:

 

Figlet:

 

用户及文件权限管理

1、Linux 用户管理

Linux 是一个能够实现多用户登录的操做系统,能够同时登录同一台主机,并共享一些主机的资源,但分别有本身的用户空间,用于存放各自的文件。

1.查看用户

 

输入的第一列表示打开当前伪终端的用户的用户名(要查看当前登陆用户的用户名,去掉空格直接使用 whoami 便可),第二列的 pts/0pts 表示伪终端,所谓伪是相对于 /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 的用户:

 

切换登入:

 

3.用户组

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

方法一:使用groups命令

 

其中冒号以前表示用户,后面表示该用户所属的用户组。

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

$ cat /etc/group | sort

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

 

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

etc/group 文件格式说明

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

group_name:password:GID:user_list

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

将其它用户加入 sudo 用户组

 

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

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

这里我用 shiyanlou 用户执行 sudo 命令将 lilei 添加到 sudo 用户组,让它也可使用 sudo 命令得到 root 权限

 

4.删除用户

删除用户是很简单的事:

 

2、Linux 文件权限

1.查看文件权限

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

使用较长格式列出文件:

 

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

 

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

 

  • 文件类型

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

  • 文件权限

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

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

  • 连接数

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

  • 文件大小

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

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

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

$ ls -A

 

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

$ ls -Al

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

$ ls -dl <目录名>

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

$ ls -AsSh

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

2.变动文件全部者

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

$ touch iphone6

可见文件全部者是 lilei :

 

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

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

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

 

3.修改文件权限

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

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

 

每一个文件的三组权限(拥有者,所属用户组,其余用户,记住这个顺序是必定的)就对应这一个 "rwx",也就是一个 '7'

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

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

而后修改权限:

$ chmod 700 iphone6

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

 

  • 方式二:加减赋值操做

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

$ chmod go-rw iphone

 

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

 

做业:

1.添加一个用户loutest

 

 

 

而后建立文件:sudo touch /opt/forloutest
接着,将文件全部者改成用户loutest:sudo chown loutest /opt/forloutest
最后,修改文件权限,将权限修改成用户loutest能够读写:sudo chmod 600 /opt/forloutest

 

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

实验介绍

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

1、Linux 目录结构

Linux 是以树形目录结构的形式来构建整个系统的,能够理解为一个用户可操做系统的骨架。虽然本质上不管是目录结构仍是操做系统内核都是存储在磁盘上的,但从逻辑上来讲 Linux 的磁盘是“挂在”(挂载在)目录上的,每个目录不只能使用本地磁盘分区的文件系统,也可使用网络上的文件系统。

1.FHS 标准

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

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

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

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

 

2.目录路径

路径

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

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

进入上一级目录:

$ cd ..

进入你的“home”目录:

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

使用 pwd 获取当前路径:

$ pwd

 

绝对路径

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

相对路径

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

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

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

 

2、Linux 文件的基本操做

1.新建

新建空白文件

$ cd ~
$ touch test

新建目录

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

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

$ mkdir mydir

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

$ mkdir -p father/son/grandson

 

2.复制

复制文件

$ cp test father/son/grandson

 

复制目录

若是直接使用cp命令,复制一个目录的话,会出现以下错误, 要成功复制目录须要加上-r或者-R参数,表示递归复制,就是说有点“株连九族”的意思:

 

3.删除

删除文件

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

$ rm test

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

 

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

$ rm -f test

删除目录

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

$ rm -r family

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

移动文件

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

$ mv file1 Documents

重命名文件

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

$ mv file1 myfile

批量重命名

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

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

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

5.查看文件

使用cat,tacnl命令查看文件

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

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

好比咱们要查看以前从"/etc"目录下拷贝来的passwd文件:

$ cat passwd

能够加上-n参数显示行号:

$ cat -n passwd

 

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

使用moreless命令分页查看文件

 

使用headtail命令查看文件

Tail:查看文件最后几行的信息

 

6.查看文件类型

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

 

7.编辑文件

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

Xeyes:

 

环境变量与文件查找


实验介绍

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

1、环境变量

1.变量

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

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

在 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 中导出成环境变量的变量,也能经过它将自定义变量导出为环境变量

 

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

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

查看PATH环境变量的内容:

$ echo $PATH

 

建立一个Shell脚本文件:

 

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

 

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

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

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

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

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

5.修改和删除已有变量

变量修改

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

     

  

变量设置方式

  
  

说明

  

${变量名#匹配字串}

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

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

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

${变量名%匹配字串}

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

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

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

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

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

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

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

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

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

变量删除

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

$ unset temp

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

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

$ source .zshrc

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

$ . ./.zshrc

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

2、搜索文件

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

  • whereis简单快速

$whereis who

 

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

  • locate快而全

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

$ locate /etc/sh

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

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

$ locate /usr/share/\*.jpg

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

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

  • which小而精

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

$ which man

  • find精而细

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

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

$ find /etc/ -name interfaces

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

与时间相关的命令参数:

     

  

参数

  
  

说明

  

-atime

最后访问时间

-ctime

建立时间

-mtime

最后修改时间

下面以-mtime参数举例:

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

 

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

$ find ~ -mtime 0

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

$ find ~ -newer /home/shiyanlou/Code

做业:

 

文件打包与压缩

实验介绍

Linux 上经常使用的 压缩/解压 工具,介绍了 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最小),从新打包:

$ 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

 

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

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

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

shiyanlou.zip解压到当前目录:

$ unzip shiyanlou.zip

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

$ unzip -q shiyanlou.zip -d ziptest

3.rar打包压缩命令

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

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

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

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

  • 从指定压缩包文件中删除某个文件:
  • 查看不解压文件:
  • 使用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.gz

-z

*.tar.xz

-J

*tar.bz2

-j

.tar打包工具

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

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

  • 建立一个 tar 包:
$ tar -cf shiyanlou.tar ~

 

1、简单文件系统操做

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

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

$ df

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

$ df -h

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

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

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

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

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

2、简单的磁盘管理

1.建立虚拟磁盘

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

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

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

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

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

使用 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 命令挂载磁盘到目录树

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

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

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

$ sudo mount
 

那么咱们如何挂载真正的磁盘到目录树呢,mount命令的通常格式以下:

mount [options] [source] [directory]

一些经常使用操做:

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

 

 

1、命令执行顺序的控制

1.顺序执行多条命令

2.有选择的执行命令

上一条命令执行成功才继续下一条,或者不成功又该作出其它什么处理,好比咱们使用which来查找是否安装某个命令,若是找到就执行该命令,不然什么也不作

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

||就是与&&相反的控制效果

2、管道

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

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

1.试用

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

$ ls -al /etc

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 [命令选项]... 用于匹配的表达式 [文件]...

-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件。这个操做实际没有多大意义,但能够感觉到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
# 最长行字节数
$ wc -L /etc/passwd

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

 

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]',固然反过来将大写变小写也是能够的

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

 

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

1、正则表达式

什么是正则表达式呢?

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

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

匹配xy。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。

[xyz]

字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”能够匹配“plain”中的“a”。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各类括号等均做为普通字符。脱字符^若是出如今首位则表示负值字符集合;若是出如今字符串中间就仅做为普通字符。连字符-若是出如今字符串中间表示字符范围描述;若是若是出如今首位则仅做为普通字符。

[^xyz]

排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”能够匹配“plain”中的“plin”。

[a-z]

字符范围。匹配指定范围内的任意字符。例如,“[a-z]”能够匹配“a”到“z”范围内的任意小写字母字符。

[^a-z]

排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”能够匹配任何不在“a”到“z”范围内的任意字符。

优先级

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

     

  

运算符

  
  

说明

  

\

转义符

(), (?:), (?=), []

括号和中括号

*、+、?、{n}、{n,}、{n,m}

限定符

^、$、\任何元字符

定位点和序列

 选择

2、grep模式匹配命令

上面空谈了那么多正则表达式的内容也并无说起具体该如何使用它,实在枯燥,若是说正则表达式是一门武功话,那它也只能算得上一些口诀招式罢了,要把它真正练起来还得须要一些兵器在手才行,这里咱们要介绍的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*'

  • 选择

# 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 的数字与字节

使用扩展正则表达式,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'

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

删除指定行

打印指定行

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

行内替换

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

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

行间替换

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

4、awk文本处理语言

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

1.awk介绍

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

Linux 下软件安装

实验介绍

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

1、Linux 上的软件安装

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

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

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

2、在线安装

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

.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 ,系统会有一个确认的操做,以后这个软件便“滚蛋了”。

7.软件搜索

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

sudo apt-cache search softname1 softname2 softname3……

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

1.dpkg 介绍

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

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

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

dpkg经常使用参数介绍:

     

  

参数

  
  

说明

  

-i

安装指定deb包

-R

后面加上目录名,用于安装该目录下的全部deb安装包

-r

remove,移除某个已安装的软件包

-I

显示deb包文件的信息

-s

显示已安装软件的信息

-S

搜索已安装的软件包

-L

显示已安装软件包的目录信息

2.使用dpkg安装deb软件包

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

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

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

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

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

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

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

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

4、从二进制包安装

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

相关文章
相关标签/搜索