单数绝对中,打一肖

(一)Linux基本概念及操作

Linux是一个操作系统

物理机系统上可以通过使用[Ctrl]+[Alt]+[F1][F6]进行终端和图形界面切换,在线实验环境中按下[Ctrl]+[Alt]+[F7]来完成切换。

双击桌面上的Xface终端图标,打开终端,打开终端后会自动运行 Shell 程序,就可以输入命令让系统来执行。

[Tab]使用Tab键来进行命令补全,Tab键一般键盘是在字母Q旁边,这个技巧给你带来的最大的好处就是当你忘记某个命令的全称时你可以只输入它的开头的一部分然后按下Tab键就可以得到提示或者帮助完成。不止补全命令,补全目录,补全命令参数都是没问题的:

②[Ctrl+c]当在 Linux 命令行中无意输入了一个不知道的命令,或者错误的使用了一个命令,导致在终端里出现了无法预料的情况。想要立即停止并恢复到你可控的状态就可以使用Ctrl+c键来强行终止当前程序(它并不会使终端退出)。

如输入find/后使用Ctrl+c键来强行终止当前程序

键盘输入结束或退出终端

暂定当前程序,暂停后按下任意键恢复运行

将当前程序放到后台运行,恢复到前台为命令fg

将光标移至输入行头,相当于Home键

将光标移至输入行末,相当于End键

删除从光标所在位置到行末

使用键盘上的方向上键,恢复之前输入过的命令。

通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。

终端里面输入的通配符是由 Shell 处理的,不是由所涉及到命令语句处理的,它只会出现在命令的“参数值”里(它不用在 命令名称里, 命令不记得,那就用Tab补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种 Shell 实现的路径扩展功能。在 通配符被处理后, Shell 会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

例如:先使用 touch 命令创建 2 个文件,后缀都为 txt,可以给文件随意命名,想在大堆其他文件中找到这两个文本文件,就可以使用通配符

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

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

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

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

系统管理命令和守护进程

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

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

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

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

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

相关命令或函数的列表。

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

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

作业:一个可以输出图形字符的命令banner,

使用默认已经安装的一个命令printerbanner,'-w'参数指定打印宽度,因为我们的环境在屏幕中显示比较小,必须要加上宽度限制。

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

1.Linux 中创建、删除用户,及用户组等操作

打印当前登录用户数及用户名

打印当前登录用户登录信息

root 权限,系统权限的一种,与 SYSTEM 权限可以理解成一个概念,但高于 Administrator 权限,root 是 Linux 和 UNIX 系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权力,所有对象他都可以操作,所以很多黑客在入侵系统的时候,都要把权限提升到 root 权限,用 Windows 的方法理解也就是将自己的非法帐户添加到 Administrators 用户组。更比如安卓操作系统中(基于 Linux 内核)获得 root 权限之后就意味着已经获得了手机的最高权限,这时候你可以对手机中的任何文件(包括系统文件)执行所有增、删、改、查的操作。

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

这个命令不但可以添加用户到系统,同时也会默认为新用户创建 home 目录

退出当前用户跟退出终端一样可以使用 exit 命令或者使用快捷键Ctrl+d。

在 Linux 里面每个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源。一个用户是可以属于多个用户组的。

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

方法一:使用groups命令

其中冒号之前表示用户,后面表示该用户所属的用户组。这里可以看到 shiyanlou 用户同时属于 shiyanlou 和 sudo 用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组(差不多就相当于家长的意思,或者说是老总)。默认情况下在sudo用户组里的可以使用sudo命令获得root权限。

这里 cat 命令用于读取指定文件的内容并打印到终端输出,后面会详细讲它的使用。 | sort 表示将读取的文本进行一个字典排序再输出

可以使用命令过滤掉一些你不想看到的结果

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

 ls 命令来列出并显示当前目录下的文件,当然这是在不带任何参数的情况下。也可以用它来查看文件权限。

使用较长格式列出文件:

Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev 目录下有各种设备文件,大都跟具体的硬件设备相关),还有 socket(网络套接字),和 pipe (管道)。软链接文件,硬链接文件

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

所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限。

③链接数:链接到该文件所在的 inode 结点的文件名数目

显示所有文件大小,并以普通人类能看懂的方式呈现,其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序,请使用“man”命令查询。

如果你有一个自己的文件不想被其他用户读、写、执行,那么就需要对文件的权限做修改,有两种方式:

方式一:二进制数字表示

每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)

(三)Linux 目录结构及文件基本操作

一种不同是体现在目录与存储介质(磁盘,内存,DVD 等)的关系上,以往的 Windows 一直是以存储介质为主的,主要以盘符(C 盘,D 盘...)及分区的来实现文件管理,然后之下才是目录,目录就显得不是那么重要,除系统文件之外的用户文件放在任何地方任何目录也是没有多大关系。所以通常 Windows 在使用一段时间后,磁盘上面的文件目录会显得杂乱无章(少数善于整理的用户除外吧)。然而 UNIX/Linux 恰好相反,UNIX 是以目录为主的,Linux 也继承了这一优良特性。 Linux 是以树形目录结构的形式来构建整个系统的,可以理解为一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,Linux每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。

FHS(文件系统层次结构标准)定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态,如下表所示

3)相对路径和绝对路径

如果想进入某个具体的目录或者想获得某个目录的文件(目录本身也是文件)那就得用路径来找。

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

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

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

使用 touch 命令创建空白文件,关于 touch 命令,其主要是来更改已有文件的时间戳的(比如,最近访问时间,最近修改时间),但其在不加任何参数的情况下,只指定一个文件名,则可以创建一个为指定文件名的空白文件(不会覆盖已有同名文件),也可以同时指定该文件的时间戳。

使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性。使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用)

3.对文件的移动、复制、重命名、编辑等操作

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

使用rm(remove files or directories)命令,删除一个文件或目录,有时候你会遇到想要删除一些为只读权限的文件,直接使用rm删除会显示一个提示,如果想忽略这提示,直接删除文件,可以使用-f参数强制删除

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

要实现批量重命名,可以使用一个看起来更专业的命令rename来实现。不过它是要用 perl 正则表达式来作为参数

rename是先使用第二个参数的通配符匹配所有后缀为.txt的文件,然后使用第一个参数提供的正则表达式将匹配的这些文件的.txt后缀替换为.c

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

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

more和less是用来"阅读"一个文件的内容的,比如说"man"手册内部就是使用的 less 来显示内容。其中more命令比较简单,只能向一个方向滚动

只查看头几行(默认为10行,不足10行则显示全部)和尾几行。

tail命令有一个参数-f,这个参数可以实现不停地读取某个文件的内容并显示。

在 Linux 下面文件的类型不是根据文件后缀来判断的,我们通常使用file命令可以查看文件的类型

在 Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs,vim,nano)

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

Shell 变量,是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的值赋值给其它变量,也可以直接指定数值赋值给任意变量。为了便于运算和处理,变量的作用域即变量的有效范围(比如一个函数中、一个源文件中或者全局范围),在该范围内只能有一个同名变量。一旦离开则该变量无效。

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

环境变量就是作用域比自定义变量要大,Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。

③从自定义变量导出的环境变量。

也有三个与上述三种环境变量相关的命令,set,env,export。

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

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

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

环境变量,可以简单的理解成在当前进程的子进程是否有效,有效则为环境变量,否则不是

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

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

在 Shell 中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,如果存在同名的命令,则执行先找到的那个

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

在前面我们应该注意到PATH里面的路径是以:作为分割符,所以我们可以这样添加自定义路径:

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

5)修改和删除已有变量

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

${变量名#匹配字串}

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

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

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

${变量名%匹配字串}

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

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

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

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

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

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

将符合旧字串的全部字串替换为新的字串

比如要修改我们前面添加到 PATH 的环境变量。为了避免操作失误导致命令找不到,我们先将 PATH 赋值给一个新的自定义变量 path

6)如何让环境变量立即生效

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

ource命令还有一个别名就是.,注意与表示当前路径的那个点区分开,虽然形式一样,但作用和使用方式一样,上面的命令如果替换成.的方式就该是 $. ./.zshrc注意第一个点后面有一个空格,而且后面的文件必须指定完整的绝对或相对路径名,source 则不需要。

①whereis简单快速,这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)

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

which本身是 Shell 内建的一个命令,我们通常使用which来确定是否安装了某个指定的软件,因为它只从PATH环境变量指定的路径中去搜索命令:

find应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。

与时间相关的命令参数:

下面以-mtime参数举例:

列出 home 目录中,当天(24 小时之内)有改动的文件;列出用户家目录下比Code文件夹新的文件:

zip程序打包压缩的文件

7zip程序压缩的文件

tar程序打包,未压缩的文件

bzip2程序压缩的文件

tar打包,gzip程序压缩的文件

tar打包,xz程序压缩的文件

tar打包,bzip2程序压缩的文件

tar打包,7z程序压缩的文件

1)zip压缩打包程序

使用zip打包文件夹:

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

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

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

上述指定目录不存在,将会自动创建。如果你不想解压只想查看压缩包的内容你可以使用-l参数。注意: 使用unzip解压文件时我们同样应该注意兼容问题,为了解决这个问题,我们可以在解压时指定编码类型。

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

3)rar打包压缩命令

从指定文件或目录创建压缩包或添加文件到压缩包:

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

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

在 Linux 上面更常用的是tar工具,tar 原本只是一个打包工具,只是同时还是实现了对 7z,gzip,xz,bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩。

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

(六)文件系统操作与磁盘管理

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

一般使用情况下,我们更多只是关心第一行的内容也就是环境中的rootfs或者物理主机上的/dev/sda2

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

物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘),你如果主机上有多块硬盘则可能还会出现 /dev/sdb,/dev/sdc 这些磁盘设备都会在 /dev 目录下以文件的存在形式。

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

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

dd的命令行语句与其他的 Linux 程序不同,因为它的命令行选项格式为选项=值,而不是更标准的--选项 值或-选项=值。dd默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。

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

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

将输出的英文字符转换为大写再写入文件:

使用dd命令来完成创建虚拟磁盘的第一步。从/dev/zero设备创建一个容量为 256M 的空文件:

使用 mkfs 命令格式化磁盘(我们这里是自己创建的虚拟磁盘镜像)

你可以在命令行输入 mkfs 然后按下Tab键,你可以看到很多个以 mkfs 为前缀的命令,这些不同的后缀其实就是表示着不同的文件系统,可以用 mkfs 格式化成的文件系统:

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

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

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

输出的结果中每一行表示一个设备或虚拟设备,每一行最前面是设备名,然后是 on 后面是挂载点,type 后面表示文件系统类型,再后面是挂载选项

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

1.命令执行顺序的控制

一次性输入完,让程序去一次执行各命令

上一条命令执行成功才继续下一条,或者不成功又该做出其它什么处理

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

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

管道又分为匿名管道和具名管道。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|分隔符表示。具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。

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

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

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

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

-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件。

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

wc 命令用于统计并输出一个文件中行、单词和字节的数目

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

uniq命令可以用于过滤或者输出重复行。

使用history命令查看最近执行过的命令(实际为读取${SHELL}_history文件,如我们环境中的~/.zsh_history文件)重效果不明显,是因为uniq命令只能去连续重复的行,不是全文去重,所以要达到预期效果,要先排序

1.常用的文本处理命令

tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。

col 命令可以将Tab换成对等数量的空格建,或反转这个操作。

学过数据库的用户对这个应该不会陌生,这个命令就是用于将两个文件中包含相同内容的那一行合并在一起。

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

Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

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

另外还有一个符号-,它可以同时作为前一个命令的。

我们可以这样使用这些文件描述符:

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

不要将管道和重定向混淆,管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接。

重定向标准输出到文件,这是一个很实用的操作,另一个很实用的操作是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示

要可以隐藏某些错误或者警告,这就需要用到我们前面讲的文件描述符了

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

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

4)永久重定向:前面的重定向操作都只是临时性的,即只对当前命令有效,我们可以使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向

5)创建输出文件描述符

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

如上面我们打开的3号文件描述符,可以使用如下操作将它关闭

7)完全屏蔽命令的输出

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

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

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

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。正则表达式通常缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。

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

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

*星号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。

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

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

将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。

匹配输入字符串的开始位置。

匹配输入字符串的结束位置。

n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

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并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“\(”或“\)”。

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

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

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

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

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

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

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

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

将二进制文件作为文本来进行匹配

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

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

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

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

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

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

代表任何可以被列印出来的字节

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

使用扩展正则表达式,ERE

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

注意:因为.号有特殊含义,所以需要转义。

sed工具即用于过滤和转换文本的流编辑器。

1)sed常用参数介绍

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

4.awk文本处理语言

AWK是一种优良的文本处理工具,它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。最简单地说,AWK是一种用于处理文本的编程语言工具。

2)awk的一些基础概念

3)awk命令基本格式

其中-F参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式) ,-v用于预先为awk程序指定变量,-f参数用于指定awk命令要执行的程序文件,或者在不加-f参数的情况下直接将程序语句放在这里,最后为awk需要处理的文本输入,且可以同时输入多个文本文件。

5)awk常用的内置变量

当前输入文件名,若有多个文件,则只表示第一个。如果输入是来自标准输入,则为空字符串

N表示字段号,最大值为NF变量的值

字段分隔符,由正则表达式表示,默认为" "空格

输入记录分隔符,默认为"\n",即一行为一个记录

当前输入文件的记录数,请注意它与NR的区别

输出字段分隔符,默认为" "空格

输出记录分隔符,默认为"\n"

②从磁盘安装deb软件包

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

其后加上软件包名,用于安装一个软件包

从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表

升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update

解决依赖关系并升级(存在一定危险性)

移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件

移除之前被其他软件包依赖,但现在不再被使用的软件包

与remove相同,但会完全移除软件包,包含其配置文件

移除已安装的软件的旧版本软件包

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

自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用

静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用

重新安装已经安装但可能存在问题的软件包

同时安装APT给出的建议安装的软件包

1.无法修改文件所有者

通过对《Linux基础入门》中十二门实验课的学习,我对于linux系统有了一定的了解,掌握了一些基本的使用技巧和快捷键,虽然在短时间内并没有完全熟练的掌握这些知识,但是脑海中已经有了关于学习linux的基本框架。Linux基本概念及操作、用户及文件权限管理、linux目录结构及文件基本操作、环境变量与文件查找、文件打包与解压缩、文件系统操作与磁盘管理、命令执行顺序控制与管道、简单的文本处理、数据流重定向、正则表达式基础和linux下软件安装这些知识点都基本掌握。虽然实验中还是遇到了一些问题,在同学的帮助下最终完成了本次实验,感觉获益匪浅。对于这门新知识,一定要从一开始打牢基础才能减少以后学习中的知识漏洞。

我要回帖

更多关于 单数有奖红也是是什么生肖 的文章

 

随机推荐