第二周(9.14-9.20):javascript
学习计时:共17小时css 实验楼:6小时 读书:1小时 代码:3小时 做业:0小时 博客:7小时前端 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1、学习目标java |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 可以独立安装Linux操做系统 node 2. 可以熟练使用Linux系统的基本命令 python 3. 熟练使用Linux中用户管理命令/系统相关命令/文件目录相关命令/打包压缩相关命令/比较合并相关命令/网络相关命令等linux 4. 熟练应用“搜索”进行触类旁通的学习nginx |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2、学习资源git |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 课程资料:https://www.shiyanlou.com/courses/413 实验一正则表达式 2. Linux 基础入门:https://www.shiyanlou.com/courses/1(重点,第一次课考核内容所有从这里面出) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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进行自动化 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
六、学习过程 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(提示:此处由学生填写,学习过程,学习笔记,代码编译,运行结果,思考等) 1. 重要知识点总结梳理:(参考资料:实验楼Linux基础入门) (1)Linux终端与图形界面切换 Linux 默认提供了 6 个纯命令行界面的 “terminal”来让用户登陆,在物理机系统上你能够经过使用 切换到其中一个终端后想要切换回图形界面: (2)命令解析器 核:UNIX/Linux 内核 壳Shell:是指“提供给使用者使用界面”的软件(命令解析器),隐藏了操做系统底层的细节。普通意义上的Shell 就是能够接受用户输入命令的程序。 (3)快捷键 |
变量设置方式 |
说明 |
|
从头向后开始匹配,删除符合匹配字串的最短数据 |
|
从头向后开始匹配,删除符合匹配字串的最长数据 |
|
从尾向前开始匹配,删除符合匹配字串的最短数据 |
|
从尾向前开始匹配,删除符合匹配字串的最长数据 |
|
将符合旧字串的第一个字串替换为新的字串 |
|
将符合旧字串的所有字串替换为新的字串 |
好比要修改咱们前面添加到 PATH 的环境变量。为了不操做失误致使命令找不到,咱们先将 PATH 赋值给一个新的自定义变量 path:
$ path=
$PATH
$
echo
$path
$ path=
${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多个任意字符
$ path=
${path%*/mybin}
可使用unset
命令删除一个环境变量:$
unset temp
(21)搜索文件
与搜索相关的命令经常使用的有以下几个whereis,which,find,locate
-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
(22)“数字雨”
(23)文件打包和解压缩
zip
压缩打包程序$ zip -r -q -o shiyanlou.zip /home/shiyanlou
$ du -h shiyanlou.zip
$ file shiyanlou.zip
使用-e参数能够建立加密压缩包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou
使用unzip命令解压缩zip文件
将shiyanlou.zip解压到当前目录:$ unzip shiyanlou.zip
使用安静模式,将文件解压到指定目录:
$ unzip -q shiyanlou.zip -d ziptest
(24)文件系统操做与管理
$ df
在实验楼的环境中你将看到以下的输出内容:
但在实际的物理主机上会更像这样:
cowsay
命令,可让你在终端里以一种动物说话的形式打印出一段话。
# 安装 $ sudo apt-get install cowsay # 默认是一只牛 $ cowsay hello shiyanlou # 加上'-l'参数打印全部支持的动物(其实不仅是动物)种类 $ cowsay -l # 使用'-f'参数选择动物种类 $ cowsay -f elephant hello shiyanlou # 此外它还能够结合咱们以前的做业讲过的 fortune 命令一块儿使用 $ fortune | cowsay -f daemon
一般状况下,咱们每次只能在终端输入一条命令,按下回车执行,执行完成后,咱们再输入第二条命令,而后再按回车执行…… 你可能会遇到以下使用场景:我须要使用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 # 让它本身运行
关于上面的操做,不知你有没有思考过一个问题,若是咱们在让它自动顺序执行命令时,前面的命令执行不成功,然后面的命令又依赖与上一条命令的结果,那么就会形成花了时间,最终却获得一个错误的结果,并且有时候直观的看你还没法判断结果是否正确。那么咱们须要可以有选择性的来执行命令,好比上一条命令执行成功才继续下一条,或者不成功又该作出其它什么处理,好比咱们使用which
来查找是否安装某个命令,若是找到就执行该命令,不然什么也不作(虽然这个操做没有什么实际意义,但可帮你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
打印/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
这个命令前面咱们也是用过屡次,功能很简单就是将输入按照必定方式排序,而后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。
默认为字典排序:
$ 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
tr 命令能够用来删除一段文本信息中的某些文字。或者将其进行转换。
tr [option]...SET1 [SET2]
选项 | 说明 |
---|---|
-d |
删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
-s |
去除set1指定的在输入文本中连续并重复的字符 |
# 删除 "hello shiyanlou" 中全部的'o','l','h' $ echo 'hello shiyanlou' | tr -d 'olh' # 将"hello" 中的ll,去重为一个l $ echo 'hello' | tr -s 'l' # 将输入文本,所有转换为大写或小写输出 $ cat /etc/passwd | tr '[:lower:]' '[:upper:]' # 上面的'[:lower:]' '[:upper:]'你也能够简单的写做'[a-z]' '[A-Z]',固然反过来将大写变小写也是能够的
更多 tr 的使用,你可使用--help
或者man tr
得到。
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
学过数据库的用户对这个应该不会陌生,这个命令就是用于将两个文件中包含相同内容的那一行合并在一块儿。
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
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
下面咱们简单的回顾一下咱们前面常常用到的两个重定向操做:
$ echo 'hello shiyanlou' > redirect $ echo 'www.shiyanlou.com' >> redirect $ cat redirect
固然前面没有用到的
<
和<<
操做也是没有问题的,如你理解的同样,它们的区别在于重定向的方向不一致而已,>
表示是从左到右,<
右到左。
在更多了解 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
初学者这里要注意不要将管道和重定向混淆,管道默认是链接前一个命令的输出到下一个命令的输入,而重定向一般是须要一个文件来创建两个命令的链接,你能够仔细体会一下上述第三个操做和最后两个操做的异同点。
重定向标准输出到文件,这是一个很实用的操做,另外一个很实用的操做是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,因此咱们常常看到的一个命令的输出一般是同时包含了标准输出和标准错误的结果的。好比下面的操做:
# 使用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的文件中
tee
命令同时重定向到多个文件常常你可能还有这样的需求,除了将须要将输出重定向到文件以外也须要将信息打印在终端,那么你可使用tee
命令来实现:
$ echo 'hello shiyanlou' | tee hello
你应该能够看出咱们前面的重定向操做都只是临时性的,即只对当前命令有效,那如何作到“永久”有效呢,好比在一个脚本中,你须要某一部分的命令的输出所有进行重定向,难道要让你在每一个命令上面加上临时重定向的操做嘛,固然不须要,咱们可使用exec
命令实现“永久”重定向。exec
命令的做用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:
# 先开启一个子 Shell $ zsh # 使用exec替换当前进程的重定向,将标准输出重定向到一个文件 $ exec 1>somefile # 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么作) $ ls $ exit $ cat somefile
默认在 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
如上面咱们打开的3号文件描述符,可使用以下操做将它关闭:
$ exec 3>&- $ cd /dev/fd;ls -Al;cd -
在 Linux 中有一个被成为“黑洞”的设备文件,因此导入它的数据都将被“吞噬”。
在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它一般被用于丢弃不须要的输出流,或做为用于输入流的空文件,这些操做一般由重定向完成。读取它则会当即获得一个EOF。
咱们能够利用设个/dev/null
屏蔽命令的输出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
向上面这样的操做将使你得不到任何输出结果。
xargs 是一条 UNIX 和类 UNIX 操做系统的经常使用命令。它的做用是将参数列表转换成小块分段传递给其余命令,以免参数列表过长的问题。
这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面这个命令用于将/etc/passwd
文件按:
分割取第一个字段排序后,使用echo
命令生成一个列表。
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在不少文本编辑器里,正则表达式一般被用来检索、替换那些符合某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操做。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 UNIX 中的工具软件(例如
sed
和grep
)普及开的。正则表达式一般缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。
一个正则表达式一般被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。
|
竖直分隔符表示选择,例如"boy|girl"能够匹配"boy"或者"girl"
数量限定除了咱们举例用的*
,还有+
加号,?
问号,.
点号,若是在一个模式中不加数量限定符则表示出现一次且仅出现一次:
+
表示前面的字符必须出现至少一次(1次或屡次),例如,"goo+gle",能够匹配"gooogle","goooogle"等;?
表示前面的字符最多出现一次(0次或1次),例如,"colou?r",能够匹配"color"或者"colour";*
星号表明前面的字符能够不出现,也能够出现一次或者屡次(0次、或1次、或屡次),例如,“0*42”能够匹配4二、04二、004二、00042等。()
圆括号能够用来定义模式字符串的范围和优先级,这能够简单的理解为是否将括号内的模式串做为一个总体。例如,"gr(a|e)y"等价于"gray|grey",(这里体现了优先级,竖直分隔符用于选择a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(这里体验了范围,?
将圆括号内容做为一个总体匹配)。
正则表达式有多种不一样的风格,下面列举一些经常使用的做为 PCRE 子集的适用于perl
和python
编程语言及grep
或egrep
的正则表达式匹配规则:(因为markdown表格解析的问题,下面的竖直分隔符用全角字符代替,实际使用时请换回半角字符)
PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用 C 语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE是一个轻量级的函数库,比Boost 之类的正则表达式库小得多。PCRE 十分易用,同时功能也很强大,性能超过了 POSIX 正则表达式库和一些经典的正则表达式库。
字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符。例如,“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} | 限定符 |
^、$、\任何元字符 | 定位点和序列 |
| | 选择 |
上面空谈了那么多正则表达式的内容也并无说起具体该如何使用它,实在枯燥,若是说正则表达式是一门武功话,那它也只能算得上一些口诀招式罢了,要把它真正练起来还得须要一些兵器在手才行,这里咱们要介绍的grep
命令以及后面要讲的sed
,awk
这些就该算做是这样的兵器了。
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 |
将输出中的匹配项设置为自动颜色显示 |
查找/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]'
注意:当
^
放到中括号内为排除字符,不然表示行首。
要经过grep
使用扩展正则表达式须要加上-E
参数,或使用egrep
。
# 只匹配"zo" $ echo 'zero\nzo\nzoo' | grep -E 'zo{1}' # 匹配以"zo"开头的全部单词 $ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'
# 匹配"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'
试想一下,平时咱们在使用 Windows 的时候,想要安装一个软件,咱们须要在网上去下载对应软件的安装包,接着安装的时候就是不断的去点击下一步,这些流程想必你们已经经历的无数回了,可是在 Linux 下,一个命令加回车,等待一下,软件就安装好了,这就是方便的在线安装软件的方式。在学习这种安装方式以前有一点须要说明的是,在不一样的linux发行版上面在线安装方式会有一些差别包括使用的命令及它们的包管理工具,由于咱们的开发环境是基于ubuntu的,因此这里咱们涉及的在线安装方式将只适用于ubuntu发行版,或其它基于ubuntu的发行版如国内的ubuntukylin(优麒麟),ubuntu又是基于debian的发行版,它使用的是debian的包管理工具dpkg,因此一些操做也适用与debian。而在其它一些采用其它包管理工具的发行版如redhat,centos,fedora等将不适用(redhat和centos使用rpm)。
好比咱们想安装一个软件,名字叫作 w3m
(w3m是一个命令行的简易网页浏览器),那么输入以下命令:
$ sudo apt-get install w3m
这样的操做你应该在前面的章节中看到过不少次了,它就表示将会安装一个软件包名为w3m
的软件
执行后的效果:
$ w3m www.shiyanlou.com/faq
注意:若是你在安装一个软件以后,没法当即使用Tab
键补全这可命令,你能够尝试先执行source ~/.zshrc
,而后你就可使用补全操做。
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
能正常的工做。
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给出的建议安装的软件包 |
关于安装,如前面演示的同样你只须要执行apt-get install <软件包名>
便可,除了这一点,你还应该掌握的是如何从新安装软件包。 不少时候咱们须要从新安装一个软件包,好比你的系统被破坏,或者一些错误的配置致使软件没法正常工做。
你可使用以下方式从新安装:
$ sudo apt-get --reinstall install w3m
另外一个你须要掌握的是,如何在不知道软件包完整名的时候进行安装。一般咱们是使用Tab
键补全软件包名,后面会介绍更好的方法来搜索软件包。有时候你须要同时安装多个软件包,你还可使用正则表达式匹配软件包名进行批量安装。
# 更新软件源 $ sudo apt-get update # 升级没有依赖问题的软件包 $ sudo apt-get upgrade # 升级并解决依赖关系 $ sudo apt-get dist-upgrade
# 不保留配置文件的移除 $ sudo apt-get purge w3m # 或者 sudo apt-get --purge remove # 移除再也不须要的被依赖的软件包 $ sudo apt-get autoremove
当本身刚知道了一个软件,想下载使用,须要确认软件仓库里面有没有,就须要用到搜索功能了,命令以下:
sudo apt-cache search softname1 softname2 softname3……
apt-cache
命令则是针对本地数据进行相关操做的工具,search
顾名思义在本地的数据库中寻找有关 softname1
softname2
…… 相关软件的信息。
7、遇到的问题及解决
(提示:此处由学生填写,是重要的得分点,要写出遇到的问题和解决方案以及对出现问题的思考)
1.
尝试了不少次,多是自己的问题,惟一成功的是man 1 ls:
2.不会使用toilet、filget
百度以后详见学习过程(5)
3.建立用户名输入密码没有反应?
自己的设计就是不回显的
4.
没有跳到shiyanlou:~/
5.
cd后面必定要有空格再加“~”或“..”
6. 使用wq没法退出
不知道如何解决?
8、其余
(提示:此处由学生填写,灵感,领悟等)