第一节 Linux系统简介
一、Linux是一个操作系统
1. Linux 本身只是操作系统的内核。内核是使其他程序能够运行的基础。
它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序
实际上都运行在内核之上。
2. Linux 内核具备了挑战 UNIX 的所有本质特性,包括 TCP/IP 网络,图
形界面系统
二、linux与windows的区别
- Linux 免费或少许费用。
- Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺;有全球所有的 Linux 开发者和自由软件社区提供支持。
- Linux 平台:要说 Linux 没有安全问题,那当然是不可能的,这一点仁者见仁智者见智,相对来说肯定比 Windows 平台要更加安全,使用 Linux 你也不用装某杀毒,某毒霸。
- Linux 平台:要说 Linux 没有安全问题,那当然是不可能的,这一点仁者见仁智者见智,相对来说肯定比 Windows 平台要更加安全,使用 Linux 你也不用装某杀毒,某毒霸。
- Linux 平台:要说 Linux 没有安全问题,那当然是不可能的,这一点仁者见仁智者见智,相对来说肯定比 Windows 平台要更加安全,使用 Linux 你也不用装某杀毒,某毒霸。
三、如何学习Linux
第二节 基本概念及操作
相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在
Unix/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,类似
Windows95 之前的Windows 的图形界面实则也只是运行在 DOS 环境的一套软件
输入find /后按ctrl+c停止
输入tail时用 ctrl+c停止
其他一些常用快捷键
按↑键重复上一命令
通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它
来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。
通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个
真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。
Shell 常用通配符:
学会在命令行中获取帮助
在 Linux 环境中,如果你遇到困难,可以使用man
命令,它是Manual page
的缩写
通常情况下,man 手册里面的内容都是英文的,这就要求你有一定的英文基础。man 手册的内容很多,涉及了 Linux 使用过程中的方方面面,
为了便于查找,是做了分册(分区段)处理的,在Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段,安排如下:
你可以先使用如下命令安装banner:
效果如下
或者你觉得这字体不好看,那么你还可以使用默认已经安装的一个命令printerbanner
:
第三节 用户及文件权限管理
一、Linux 用户管理
Linux 是一个可以实现多用户登陆的操作系统,不同的两个人分别有自己的用户空间,用于存放各自的文件。但实际上他们的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于Linux 的 用户管理 和 权限机制 ,不同用户不可以轻易地查看、修改彼此的文件。
1.查看用户
第一列:表示打开当前伪终端的用户的用户名,要查看当前登录用户的用户名,去掉空格直接使用 whoami即可。
第二列: pts/0中 pts 表示伪终端,所谓伪是相对于 /dev/tty设备而言的(“真终端”---[Ctrl]+[Alt]+[F1]~[F7]进行切换的 /dev/tty设备;伪终端---当你在图形用户界面使用 /dev/tty7时每打开一个终端就会产生一个伪终端)
第三列:表示当前伪终端的启动时间。
操作截图:
who 命令其它常用参数
参数 |
说明 |
-a |
打印能打印的全部 |
-d |
打印死掉的进程 |
-m |
同am i,mom likes |
-q |
打印当前登录用户数及用户名 |
-u |
打印当前登录用户登录信息 |
-r |
打印运行等级 |
2.创建用户
(1)root 是Linux 和 UNIX 系统中的超级管理员用户帐户
(2)sudo命令:1.两个大前提,一是你要知道当前登录用户的密码,二是当前用户必须在 sudo
用户组。2.不但可以添加用户到系统,同时也会默认为新用户创建home 目录。
操作截图:
(3)退出当前用户跟退出终端一样可以使用 exit命令或者使用快捷键 Ctrl+d
3.用户组
(1)如何知道自己属于哪些用户组呢?
方法一:使用groups命令
冒号之前表示用户,后面表示该用户所属的用户组
操作截图:
方法二:查看/etc/group文件
cat 命令:用于读取指定文件的内容并打印到终端输出
| sort :将读取的文本进行一个字典排序再输出
操作截图:
/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。
(2)将其它用户加入 sudo 用户组
默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入sudo用户组从而获取 root 权限。
操作截图:
4.删除用户
操作截图:
二、Linux 文件权限
1.查看文件权限
ls 命令:列出并显示当前目录下的文件。
drwxr-xr-x:文件类型和权限
3(或2...):链接数
shiyanlou:所属用户组
4096:文件大小
9月 19 22:35 :最后的修改时间
Desktop:文件名
文件类型:
/dev 目录下有各种设备文件,大都跟具体的硬件设备相关。
文件权限:
cat <file name> 命令:读取某个文件的内容,读权限
文件大小:
给 ls 加上 -lh 参数来更直观的查看文件的大小。
以‘.‘ 开头的文件为隐藏文件。
操作截图:可以同时使用‘-A‘ 和 ‘-l‘ 参数
查看某一个目录的完整属性:
显示所有文件大小:(小 s 为显示文件大小,大 S 为按文件大小排序,若要知道如何按其它方式排序,“man”命令查询。)
2.变更文件所有者
操作截图:
3.修改文件权限
方式一:二进制数字表示
方式二:加减赋值操作
‘g‘‘o‘还有‘u‘,分别表示group,others,user,‘+‘,‘-‘ 就分别表示增加和去掉相应的权限。
三、作业
添加用户:loutest5337
变更权限所有者:
第四节 Linux 目录结构及文件基本操作
笔记:本节讲述了关于Linux目录与文件的基本操作处理,如创建、重命名、移动、复制等。
具体操作如下:
作业截图:
第五节、环境变量与文件查找
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 则不需要。
二、搜索文件
与搜索相关的命令常用的有如下几个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
作业:
第六节
第六节 文件打包与压缩
一、文件打包和解压缩
文件后缀名 |
说明 |
*.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程序压缩的文件 |
1.zip压缩打包程序
du命令查看打包后文件的大小
第一行命令中,-r参数表示递归打包包含子目录的全部内容,-q参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。
使用-e参数可以创建加密压缩包。
2.使用unzip命令解压缩zip文件
使用-O(英文字母,大写o)参数指定编码类型;
不想解压只想查看压缩包的内容你可以使用-l参数;
3.rar打包压缩命令
使用rar和unrar工具分别创建和解压 rar 压缩包。
使用a参数添加一个目录~到一个归档文件中,如果该文件不存在就会自动创建。
从指定压缩包文件中删除某个文件、查看不解压文件:
全路径解压:
4.tar打包工具(tar命令一些基本的使用方式)
压缩文件格式 |
参数 |
*.tar.gz |
-z |
*.tar.xz |
-J |
*tar.bz2 |
-j |
-c表示创建一个tar 包文件,-f用于指定创建的文件名,注意文件名必须紧跟在-f参数之后。
二、作业
第七节、文件系统操作与磁盘管理
dd默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。
上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如‘K‘,‘M‘,‘G‘等单位),
count用于指定块数量。如上图所示,我指定只读取总共 10 个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共 16 个字节(一个英文字符占一个字节)内容,
显然超过了设定大小。使用和du和cat命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其他的多余输入将被截取并保留在标准输入。
第八节、命令执行顺序控制与管道
管道是什么,管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
管道又分为匿名管道和具名管道(这里将不会讨论在源程序中使用系统调用创建并使用管道的情况,它与命令行的管道在内核中实际都是采用相同的机制)。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|
分隔符表示,|
在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。下面我们就将通过一些常用的可以使用管道的"过滤程序"来帮助你熟练管道的使用。
第九节、简单的文件处理
文本处理命令
1.tr 命令
tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。
使用方式:
tr [option]...SET1 [SET2]
常用的选项有:
选项 |
说明 |
-d |
删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
-s |
去除set1指定的在输入文本中连续并重复的字符 |
2.col 命令
col 命令可以将Tab换成对等数量的空格建,或反转这个操作。
使用方式:
col [option]
常用的选项有:
选项 |
说明 |
-x |
将Tab转换为空格 |
-h |
将空格转换为Tab(默认选项) |
3.join命令
学过数据库的用户对这个应该不会陌生,这个命令就是用于将两个文件中包含相同内容的那一行合并在一起。
使用方式:
join [option]... file1 file2
常用的选项有:
选项 |
说明 |
-t |
指定分隔符,默认为空格 |
-i |
忽略大小写的差异 |
-1 |
指明第一个文件要用哪个字段来对比,,默认对比第一个字段 |
-2 |
指明第二个文件要用哪个字段来对比,,默认对比第一个字段 |
4.paste命令
paste这个命令与join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。
使用方式:
paste [option] file...
常用的选项有:
选项 |
说明 |
-d |
指定合并的分隔符,默认为Tab |
-s |
不合并到一行,每个文件为一行 |
以上命令截图:
三、作业
第十节、数据流重定向
一、数据流重定向
下面我们简单的回顾一下我们前面经常用到的两个重定向操作:
$ echo ‘hello shiyanlou‘ > redirect $ echo ‘www.shiyanlou.com‘ >> redirect $ cat redirect
当然前面没有用到的<
和<<
操作也是没有问题的,如你理解的一样,它们的区别在于重定向的方向不一致而已,>
表示是从左到右,<
右到左。
1.简单的重定向
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 的结果。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面这个命令用于将/etc/passwd
文件按:
分割取第一个字段排序后,使用echo
命令生成一个列表。
作业:
第十一节、正则表达式基础
- 优先级
grep模式匹配命令
- 基本操作
grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件。grep支持三种正则表达式引擎,分别用三个参数指定:
参数说明
-E POSIX扩展正则表达式,ERE
-G POSIX基本正则表达式,BRE
-P Perl正则表达式,PCRE
常用参数
- 使用正则表达式
- 位置:查找/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:]]‘
完整的特殊符号及说明
- 位置:查找/etc/group文件中以"shiyanlou"为开头的行
- 排除字符
echo ‘geek|good‘ | grep ‘[^o]‘
注意:当^放到中括号内为排除字符,否则表示行首。
sed 流编辑器
sed工具在 man 手册里面的全名为"sed - stream editor for filtering and transforming text ",意即,用于过滤和转换文本的流编辑器。在 Linux/UNIX 的世界里敢称为编辑器的工具,大都非等闲之辈,比如前面的"vi/vim(编辑器之神)","emacs(神的编辑器)","gedit"这些个编辑器。sed与上述的最大不同之处大于它是一个非交互式的编辑器,下面我们就开始介绍sed这个编辑器.
- sed 命令基本格式
sed [参数]... [执行命令] [输入文件]...
形如:
sed -i ‘1s/sad/happy/‘ test # 表示将test文件中第一行的"sad"替换为"happy"
- 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为执行动作。 常用动作指令:
- 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
- 我们先找一个用于练习的文本文件:
awk文本处理语言
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。最简单地说,AWK是一种用于处理文本的编程语言工具。
- awk的一些基础概念 awk所有的操作都是基于pattern(模式)—action(动作)对来完成的,如下面的形式:
$ pattern {action}你可以看到就如同很多编程语言一样,它将所有的动作操作用一对{}花括号包围起来。其中pattern通常是是表示用于匹配输入的文本的“关系式”或“正则表达式”,action则是表示匹配后将执行的动作。在一个完整awk操作中,这两者可以只有其中一个,如果没有pattern则默认匹配输入的全部文本,如果没有action则默认为打印匹配内容到屏幕。awk处理文本的方式,是将文本分割成一些“字段”,然后再对这些字段进行处理,默认情况下,awk以空格作为一个字段的分割符,不过这不是固定了,你可以任意指定分隔符,下面将告诉你如何做到这一点。
- awk命令基本格式 awk [-F fs] [-v var=value] [-f prog-file | ‘program text‘] [file...]
-F:用于预先指定前面提到的字段分隔符(还有其他指定字段的方式)
-v用于预先为awk程序指定变量
-f用于指定awk命令要执行的程序文件,或者在不加-f参数的情况下直接将程序语句放在这里
最后为awk需要处理的文本输入,且可以同时输入多个文本文件 - awk操作
- 先用vim新建一个文本文档
vim test
包含如下内容:
I like linux
www.shiyanlou.com - 使用awk将文本内容打印到终端 "quote>" 不用输入
awk ‘{
print
> }‘ test - 或者写到一行 awk ‘{print}‘ test
- 将test的第一行的每个字段单独显示为一行 awk ‘{
> if(NR==1){
> print $1 "\n" $2 "\n" $3
> } else {
> print}
> }‘ test - 或者 awk ‘{
> if(NR==1){
> OFS="\n"
> print $1, $2, $3
> } else {
> print}
> }‘ test说明:你首先应该注意的是,这里我使用了awk语言的分支选择语句if,它的使用和很多高级语言如C/C++语言基本一致,如果你有这些语言的基础,这里将很好理解。另一个你需要注意的是NR与OFS,这两个是awk内建的变量,NR表示当前读入的记录数,你可以简单的理解为当前处理的行数,OFS表示输出时的字段分隔符,默认为" "空格,如上图所见,我们将字段分隔符设置为\n换行符,所以第一行原本以空格为字段分隔的内容就分别输出到单独一行了。然后是$N其中N为相应的字段号,这也是awk的内建变量,它表示引用相应的字段,因为我们这里第一行只有三个字段,所以只引用到了$3。除此之外另一个这里没有出现的$0,它表示引用当前记录(当前行)的全部内容。
- 先用vim新建一个文本文档
- awk常用的内置变量
第十二节、Linux下软件安装
一、Linux 上的软件安装
通常 Linux 上的软件安装主要有三种方式:
- 在线安装
- 从磁盘安装deb软件包
- 从二进制软件包安装
- 从源代码编译安装
二、在线安装
在不同的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 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.卸载软件
卸载是一个命令加回车 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
相关的软件,并且有相关软件的简介。
三、使用 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
3.查看已安装软件包的安装目录
使用dpkg -L
查看deb
包目录信息
$ sudo dpkg -L emacs
四、从二进制包安装
二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH
环境变量即可。
作业: