这是该系列第一篇。

前言

本篇博客是笔者在学习Unix课程时所积累的学习笔记。
希望对后来学习Unix的友友复习准备Unix的期末考试有帮助。

什么是UNIX

UNIX是一类操作系统。

狭义理解,UNIX是一个分时操作系统的核心,控制和分配计算机资源(软硬件),协调各应用进程的运行。

广义理解,UNIX除了其核心外,还包括一些基本的工具,如编辑器、编译器、文件操作工具、文字处理工具等。

更广义地理解,UNIX还包括用户自己开发的各种工具软件。

UNIX的历史

1965年,贝尔实验室参与由MIT和GE发起的一个计划:开发一个多用户、多任务、多层次(multi-user、multi-processor、multi-level)的操作系统MULTICS(MULTiplexed Information and Computing System)

1969年,MULTICS计划失败,贝尔实验室的工程师们退出该计划。 Ken Thompson将自己开发一款原本运行在MULTICS系统上游戏软件“Space Travel(星际之旅)”移植到GE-635的机器上(GECOS系统),但速度很慢,且GE-635的运行费用昂贵(75$/秒)

Ken Thompson决定为自己的游戏软件寻找一个替代的开发运行环境。正好有一台PDP-7(DEC公司生产)迷你计算机闲置。 Ken Thompson和Dennis Ritchie共同开发了一个简单的操作系统,仅支持两个用户,也只有两个用户(作者自己)。Brian Kernighan 参照MULTICS将这个简单的操作系统戏称为UNICS,后来人们取其谐音称UNIX。

1970年----UNIX元年。

良好的可移植性促使UNIX系统蔓延。1974年,Ken Thompson的母校U.C. Berkeley开始接触UNIX。

1977年,Bill Joy修改了部分Kernel,编写了vi、pascal编译器等,产生了1BSD(Berkeley Software Distribution)。

1978年,BSD UNIX与TCP/IP开始结合,成为最有影响力的UNIX系统。

1988年,为统一各UNIX系统编程接口,提供应用程序在各UNIX系统之间的可移植性。IEEE出台了POSIX(Portable Operating System Interface)标准,定义了UNIX系统必须提供的接口函数(在C语言头文件中定义)

Unix家族

Unix家族

系统时间

自1970年1月1日0时0分0秒以来国际标准时间所经历过的秒数累计值。

需要掌握Unix历史,这里考的比例还不低。

大事编年史

  • 1965:MULTICS
  • 1969:MULTICS失败,UNIX开始研发
  • 1970:UNIX元年(作者Ken Thompson和Dennis Ritchie)
  • 1973:C语言诞生,UNIX第一个正式版本:SYSTEM V(Dennis Ritchie)
  • 1977:Vi,Pascal编辑器,1BSD UNIX(Bill Joy)
  • 1978:BSD UNIX结合TCP/IP,成为最具影响力系统
  • 1984:X Window诞生
  • 1987:X Window最后一版(11版本)
  • 1987:MINIX(Andrew S. Tanenbaum)
  • 1988:POSIX标准
  • 1991:Linux(Linus Torvalds)
  • 1994:X Window X11
  • 1994:单一UNIX规范SUS,产生XSI,规定遵循XSI的操作系统才是Unix(Open Group)
  • 2004:Ubuntu Linux(Mark Shuttleworth)

Linux

Linux的由来

1987年,荷兰阿姆斯特丹Vrije大学Andrew S. Tanenbaum教授(MIT学士,Berkeley博士)为课堂教学编写了Minix系统。
1991年,年仅21岁的芬兰赫尔辛基大学的学生Linus Torvalds参考Minix开发了PC版的UNIX,命名为Linux。

Linux的特点

与UNIX兼容,遵从POSIX标准
自由,开源
性能高,安全性强

Linux的版本

核心版本 由Linus本人负责维护,版本号由三部分组成x.y.z,x是主版本号,y是次版本号,z是修订次数。次版本号为偶数表示稳定的版本,奇数表示测试版。
发行版 各公司推出的版本。如Red Hat,红旗Linux等等,有上百种。

Ubuntu Linux

创始人 Mark Shuttleworth,1973年生于南非,现居伦敦。2004年通过旗下的Canonical公司来资助Ubuntu Linux的开发
是目前增长势头最强劲的Linux发行版

操作系统

用户与计算机硬件之间的界面,它是控制、管理计算机系统内各种硬件和软件资源,有效地组织多道程序运行的系统软件(或程序集合)。

X Window

历史

1984年,麻省理工学院(MIT)计算机科学研究室开始研究UNIX系统下的视窗(window)系统,他们从斯坦福(Stanford)大学得到了一套叫做W(Window的第一个字母)的实验性视窗系统,然后开始进一步开发。同年6月,发布新系统的第一个版本,取名X(W的下一个字母),连同版本号,称X1。由于X是一个视窗系统,所以又叫X Window
1985年1月,发布第六版X6,对外部公司开始授权
1985年9月,发布X9
1985年12月,发布X10
1987年9月15日,发布X11。此时X已取得明显成功,MIT退出。第11版成为最终版。
1994年5月16日,第六次发布X11,称X11R64

体系结构

  • 采用客户-服务器模型
  • X客户程序将显示请求发送给X服务程序,由X服务程序驱动硬件设备予以显示。
  • X客户与X服务器之间的接口协议叫做X协议
    X Window

    X server

  • 处理输出
    • 接受X client的输出请求,驱动硬件显示
  • 处理输入
    • 接受键盘、鼠标的输入,当作“事件”传送给适当的客户程序。

      窗口管理器

      一个特殊的X客户程序,具有改变窗口大小、位置、堆放层次等功能。

      桌面系统

      另一个特殊的X客户程序,依赖窗口管理器,控制桌面、菜单的位置、风格、效果等。

      X 协议

  • X 系统采用客户-服务器模型,带来如下优点:
    • X server屏蔽了硬件特性,使得X client和X server之间的X协议是一个完全抽象的协议,具有很强的可移植性
    • 将X协议构建在网络协议之上,X server和X client可以运行在不同的机器上,这带来了很大的灵活性。

当用户使用X协议登录远程计算机时,本地运行的是X server,远程计算机运行的应用程序是X client。

X 开发接口

  • X Library
    • 最底层的程序界面,主要功能是存取X protocol的服务
    • 常见的有:Xlib、Motif、Qt
  • X Toolkit
    • X Library基础上的拓展,提供大量函数或组件。
    • 种类很多,有Motif、OpenLook、Gimp、X foums、X Toolkit(Xt)等

指令

登录

who 显示系统中有哪些使用者正在上面
who am I/whoami 实测whoami有效 表示当前用户
write username 给Username发消息
man command 查看command的手册
w/wr 执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序 实测w有效。
logout logout指令让用户退出系统,其功能和login指令相互对应。

常用操作

行编辑器

1
2
3
4
5
6
7
$ ed                      # 打开ed编辑器
a # 表示要开始输入一个新文件
now type in… # 第一行输入
what do you want to type? # 第二行输入
. # 切到命令模式
w tmp # w 表示保存 w tmp 表示保存为tmp
q # 退出

这玩意其实挺不常用的 = =,现在可能更多的是vim和nvim等

但积累一下还是有必要的,因为假如不小心把系统玩坏了,就只能用这个编辑器来抢救系统了。

文件列表

1
2
3
4
$ ls     //普通列出当前目录所有文件
$ ls –l //详细信息列表
$ ls –t //按修改时间排序
$ ls –lt //命令选项可以组合

常用命令

cat filename 命令用于连接文件并打印到标准输出设备上。
more filename 类似于cat,但只不过是将内容分页显示
touch 参见Linux指令操作记录

但需要注意的是,touch也可以用来改变内容更新时间


mv 参见Linux指令操作记录
cp 参见Linux指令操作记录
rm 参见Linux指令操作记录

针对文本文件的命令

wc 利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-“,则wc指令会从标准输入设备读取数据。
gerp 参见Linux指令操作记录
sort 命令用于将文本文件内容加以排序。默认排序为按列第一个字符的ASCII
cmp 命令用于比较两个文件是否有差异。

当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有所差异,预设会标示出第一个不同之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为”-“,则cmp指令会从标准输入设备读取数据。

diff 命令用于比较文件的差异。
diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

diff和cmp的区别在于diff按行比较,cmp按字比较。

文件目录

1
2
3
4
5
$ pwd  显示当前路径(目录)
$ cd 改变当前工作目录,或返回个人主目录
. 和..目录
$ mkdir 创建子目录
$ rmdir 删除子目录

Shell

定位

Shell定位

Shell的版本

bsh, csh, ksh, bash,…

Shell命令提示符

root用户 #,普通用户$, %,…

内部命令和外部命令

shell自己完成的命令为内部命令,如cd等;调用某个程序来完成的命令为外部命令,如ed。

文件名缩写(模式)

1
2
3
4
5
6
$ ls  *.c        //匹配任意以.c为后缀的文件
$ ls a*[1-9].c //匹配任意a开头重复0次或多次,以数字1-9结尾的且以.c为后缀的文件
$ ls ?.c //匹配1-2个字符并且以.c为后缀的文件
$ echo * // 控制台输出当前目录的所有文件和目录名
$ echo \* // 控制台输出 *,这是因为\发挥了转义的作用
$ ls '*' // ls * 是查询出当前目录的文件和子目录的文件 '*'实测不识别

I/O重定向

1
2
3
4
5
6
$ ls > tmp       //将标准输出重定向到文件tmp中(清除原有文件中的数据)
$ ls -l >tmp //将标准输出重定向到文件tmp中(清除原有文件中的数据)
$ ls >> tmp //将标准输出重定向到文件tmp中(追加原有文件中的数据之后)
$ ls 2>> tmp //将错误输出重定向到文件tmp中(追加原有文件中的数据之后)
$ ls >> tmp 2>&1 //将标准输出和错误输出重定向到文件tmp中(追加原有文件中的数据之后)
$ ls &>> tmp //将标准输出和错误输出重定向到文件tmp中(追加原有文件中的数据之后)

管道

1
2
$ who | wc -l             //  计算所有用户登录的终端数
$ who | grep pts | wc -l // 计算用户所使用的仿真终端数量. 管道线上的程序是同时运行的,它们之间存在通信。

进程

1
2
3
4
5
6
7
8
9
10
11
12
$ who; whoami    //多个命令同时运行
$ 命令& //后台运行
$ ps //显示当前运行的进程
$ kill //终止某个进程
$ nohup command //nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
$ at hh:mm 定时运行某些命令
$ at hh:mm < commandfile
$ at hh:mm
command1
command2
......
Ctrl-D //在Ubutun22.04上测试失败,未找到该指令。

who && data代表只有who执行成功才会执行data,需要与;区分

环境设置

1
2
3
4
5
6
7
8
设置shell内部变量值
$ PS1=C:\\\>
$ PS1='`whoami`:`pwd` >'
$ echo $HOME
$ echo $PATH
$ PATH=$PATH:$HOME/bin
$ d=/home/lls/c
$ cd $d

文件系统

文件树

文件树

文件类型

目录文件:包含其它文件的文件。
常规文件:文本文件、二进制文件(程序、数据库等)。
设备文件:键盘、显示器、打印机、硬盘等。

一切都是文件,这个很重要!!!


1
2
$ls -l            //查看文件类型
$od -x filename //分析文件结构

主目录和当前目录

主目录:用户登录时所在的位置。($cd)
当前目录:用户或程序当前的工作位置。

绝对和相对路径

绝对路径:从根目录出发到某个文件的搜索路径。如:/home/user1/myc/p1.c
相对路径:从当前目录出发到某个文件的搜索路径。如:myc/p1.c, ./bin/prog1, ../user2/file1

文件名

字母、数字、’_’、’.’ 在shell中具有特殊含义的符号避免使用,如&*\{}[]$?%等

文件权限

综述

$ ls –l a.out
结果: -rwxr-xr-x 1 user1 users 9319 2010-02-09 23:56 a.out
rwx:读、写、运行
9个权限位,每3个为一组,分别代表文件所有者、同组用户和其他用户的权限。
具体解释:
权限位
更改文件权限可以用chmod

1
2
3
$ chmod 777 a.out
$ chmod –w a.out
$ chmod +x ldir

下面两个好理解,我解释一下777:

事实上,Linux 系统为每种权限(r、w 和 x)分配了对应的数字:

权限 数字
r 4
w 2
x 1

所以,如果我们要合并这些权限,就需要做简单的加法了:将对应的数字相加。

假如我们要分配读、写权限,那么我们就要用 4+2,就等于 6。数字 6 表示具有读和写权限。

所以777就表示为文件所有者、同组用户和其他用户赋予全部rwx权限。

目录文件权限

x: 是否可以存取目录中的文件。
r: 是否可以对目录进行文件列表。可以存取已知的文件。
w:是否可以增加、删除目录中的文件。

可以认为X赋予我们访问、修改i节点的权限
W赋予我们修改目录项的权限
R赋予我们查看目录下的权限

i节点

1
2
3
4
$ ls -il 
输出:
531049 -rwxrwxr-x 1 unicorn unicorn 101 3月 22 21:27 Pycharm.sh
526278 -rw-rw-r-- 1 unicorn unicorn 38 4月 22 21:10 tmp

531049一列即为i节点。

文件的组成

文件名、i节点、文件内容。
i节点中记录文件权限、所有者、修改日期、长度、存放位置等等。
i节点

使用

1
2
3
$ ln file1 file2  //给file1所对应的i节点增加一个文件名file2
$ rm file2 //删除文件名file2。对应的i节点和文件内容依然存在。
$ rm file1 //删除文件名file1。由于没有文件名指向该i节点,系统删除该i节点及其对应的文件内容

i节点使用

设备文件

UNIX的精华思想之一就是在文件系统中处理外部设备,按普通文件来处理外设。

1
2
3
4
$ ls -l /dev                  //列出所有设备 用文件指令ls
$ echo hello! > /dev/pts/0 //结果是shell界面出现Hello! 和echo hello!一个作用
$ cat c/sig.c >/dev/pts/1 //我失败了,找不到/dev/pts/1
$ cp tmp /dev/pts/0 //tmp的文件显示在了shell界面

所以/dev/pts/0什么含义已经呼之欲出了。
只能说这个思路真的太好了。

文件编辑和流处理

ed行编辑器

简介

作者:Ken Thompson(就是Unix创始人之一)
优点:
(1)运行环境要求低,是UNIX系统最基本的编辑器。
(2)编辑命令功能强大,至今仍然使用。
(3)ed提供的正则表达式广泛使用。
(4)运行速度很快。

基本命令

之前已有介绍,这里为了保证完整性允许我再次介绍一次。

一般指令

  • a 从当前行开始添加,实际上是在该行的下一行开始输入
  • . 结束添加状态 //必须在行首输入
  • w 存盘
  • q 退出ed编辑器
  • ! 临时进入shell 实测用法为!+ 指令

显示命令

  • 显示命令p (在命令模式下输入)
    • p 显示当前行。
    • 5 将当前行改为第5行并显示当前行。
    • m,np 显示m到n行
    • .代表当前行,$代表最后一行
    • 可使用相对行,如.,.+3p(代表1-3行) or $-5,$p(代表倒数5行)
      举例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      文件内容:
      123
      1234
      12345
      123456
      1234567
      12345678
      使用:
      $-5,$p
      输出:
      1234
      12345
      123456
      1234567
      12345678

查找

/模式/ 查找下一个匹配模式的行,遇到尾行则从首行开始
?模式? 查找上一个匹配模式的行,遇到首行则从尾行开始
// 重复查找下一个匹配模式的行,模式不变
??重复查找上一个匹配模式的行,模式不变

查找会改变当前所在的行,查找本身有返回值,返回的是行号。


利用返回值可以做一些事情:
1
2
3
1,/main/p          //显示1到第一次出现main的行
/main/-1,$p //显示第一次出现main的行的上一行到最后一行
5,?int?d //删除5到最后一次出现int的行

插入删除撤销

1
2
3
4
na      //从n行后添加
ni //从n行前插入。i、a都以行首.来结束
m,nd //删除m至n行
u //撤销所做的编辑

替换

1
2
3
s/old/new/           //把当前行中第一个old替换为new
s/old/new/g //把当前行中每一个old都替换为new(g有global的意思)
1,$ s/old/new/g //把文件中所有的old都替换为new (对每一行都做global替换操作)

这里有一个助记符号:&
表示被替换的对象:

1
2
1,$s/big/very &/g  //把文件中的big都替换为very big
s/and/\&/ //把and改为&,因为&被\转义

ed正则表达式

  • c 普通字符,与自己匹配,如a,b等。
  • \c 取消字符c的特殊意义,如\&
  • ^ 在模式起始位置时,代表行首。如^a表示行首为a
  • $ 在模式结束位置时,代表行尾。
  • . 匹配任意单个字符。
  • […] 匹配[]中任意单个字符,如[1ac][a-z], [1-9]
  • [^…] 匹配不在…中的任意单个字符
  • r*,零个或多个重复的r,r为单个字符。如a*, [ab]*, .*
  • & 仅用于替换命令s的右边,代表第一个模式 (这个参看前面的助记符 &)

    这里的正则表达式和一般意义上的正则还是几乎一样的。
    参看:正则表达式

    一些例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /^$/                 //空行
    /./ //非空行
    /^/ //任意行
    /thing/ //包含字符串thing的行
    /^thing/ //以thing开始的行
    /thing$/ //以thing结尾的行
    /^thing$/ //内容为thing的行
    /thing.$/ //以thing加任意符号结尾的行
    /thing\.$/ //以thing.结尾的行
    /\/thing\// //包含/thing/的行
    /[tT]hing/ //包含thing或Thing的行
    /thing[0-9]/ //包含thing+任意一个数字的行
    /thing[^0-9]/ //包含thing+任意一个非数字的行
    /thing[0-9][^0-9]/ //包含thing+任意一个数字+任意一个非数字的行
    /thing1.*thing2/ //包含thing1+任意内容+thing2的行
    /^thing1.*thing2$/ //以thing1开头,thing2结尾的行

全局命令

命令格式:m,ng/re/cmd,含义是从m行到n行中对于匹配re模式的行执行命令cmd. 如果作用范围是全文件(1,$),m、n可以省略。
举例:

1
2
3
4
5
6
g/…/p            //显示所有包含…的行
g/…/d //删除所有包含…的行
g/…/s//rep1/ //对于包含…的行,将其中第一个…替换成rep1
g/…/s//rep1/g //把所有的…替换成rep1
g/…/s/pat/rep1/ //对于包含…的行,将其中第一个pat替换成rep1
v/^$/p //打印所有非空行

移动,复制

命令格式:
m,nmd m到n行移到d行之后。
m,ntd m到n行拷贝到d行之后。
例子:

1
g/^/m0 //我的理解是把非空行移到0行之后,但是由于它先移动第一行到第0行,然后再移动第二行至第0行后,导致位置颠倒过来了。

sed——流编辑器

简介

直接从ed发展而来,用于处理输出流,常用于管道中。

命令的一般形式 sed -[opt] ‘ed command1;ed command2’ file.

sed从输入文件中依次读取每一行,按指定的ed命令处理,将结果送至标准输出。

例子:

1
2
3
4
5
6
7
8
$ sed 's/UNIX/Linux/g' file    //将file中的UNIX替换成Linux显示在屏幕上,但不改变file本身。
$ who | sed 's/ .*//' //显示当前登录用户,只显示用户名。
$ whoami |sed 's/ .*//' //获取我的登录名.
$ sed '10q' file //显示file文件的前10行
$ sed '/pattern/d' file //不显示包含pattern的行。
$ sed -n '/pattern/p' file //仅显示包含pattern的行。sed默认显示每一行,-n选项关闭自动显示功能。
$ sed -n ‘/pattern/p’ file //具有过滤功能,与grep pattern file功能相同。
$ ls -l | sed -n '/^d/p' //长格式列出当前目录下的子目录

由于sed处理的是输入流,一旦读入一行,前面的行就过去了,无法再次取回,因此sed不具备行运算的能力。

这里比较简略,只有简介,如果想系统学习推荐OSome平台(逃

sed学习

过滤器

grep

1
2
3
4
$ grep pattern file                  //pattern: ed pattern
$ grep '^void' sig.c //显示sig.c文件中以void开头的行
$ ls -l | grep '^d' //列出当前目录下的子目录
$ ls -l | grep '^d' | sed 's/.* //' //列出当前子目录名 .*后面的空格一定要有

grep学习

sort

1
$ ls | sort                          //默认排序,上面已经提到了,就是第一列Ascii

tail、head

1
2
3
4
$ tail file              //显示file的最后10行,实测确实是这样。
$ tail -5 file //显示file的最后5行
$ head file //显示file的前10行
$ head -5 file //显示file的前5行

模式匹配与处理语言awk

一般使用

1
2
$ awk 'program' filename
$ commd | awk 'program '

program的形式
pattern1 {action1} pattern2{action2}…… ,模式之间为“或”的关系
pattern: ,ed的正则表达式,逻辑表达式
action: ,如print、printf等

缺省

1
2
$ awk '/pattern/' file  //显示匹配模式的每一行,功能同grep
$ awk '{print}' //显示每一行,功能同cat

同样是一些例子:

1
2
3
awk '//' sig.c                                                    //输出sig.c全部内容
awk '{print}' sig.c //输出sig.c全部内容
awk '//{print}/main/{print "----------------------------"}'sig.c //输出全部内容的同时在main这一行下添加“-----”

记录、字段

每一行为一条记录,NR为记录数
每一个非空的字符串为一个字段,使用$1、$2、…标记,$0为整行,NF为字段数
一些例子:

1
2
3
$ awk '{print NR, $0}' file    //显示file的每一行,并在行首加上行号
$ ls -l | awk '/^d/{print}' //长格式列出当前目录下的子目录
$ ls -l | awk '/^d/{print $8}' //列出当前目录下的子目录

打印(显示)

1
2
$ ls -l | awk '{print NR, ": " $1, $8}'      //打印行号:第一列,第八列
$ awk '{printf("%d: %s\n", NR, $0)} ' sig.c //打印行号:整行

有点像C语言的风格。

pattern

一般

字段运算、模式表达式、逻辑表达式

1
2
3
4
5
$ ls -l | awk '$5~/.....*/'       //列出长度超过999字节的文件
$ ls -l | awk '$5 !~ /.....*/' //列出长度小于等于999字节的文件
$ ls -l | awk '$5=="4096"' //列出长度为4096字节的文件
$ ls -l | awk 'length($5)>3' //列出长度超过999字节的文件
$ ls -l | awk '!(length($5)>3) ' //列出长度小于等于999字节的文件

第一个允许我好好解释一下,ls -l输出如下:
ls
$5,即对应第五列,表示字节数,‘~’表示正则表达式匹配运算。后面的表达式就是要求至少有4位。

而只有1000才是4位,所以这里实现了列出长度超过999字节的文件的效果。

后面的就比较直观啦~

特殊

awk ‘BEGIN{初始化动作}’,表示在开始处理文件之前,要做的事情。
awk ‘END{结束动作}’,表示文件处理结束后,要做的事情。

变量和运算

这里举个例子,打印某个文件的行数、单词数和字符数:

1
2
3
4
5
6
7
8
$ awk '{
nw += NF;
nc +=length($0)+1;
}
END{
print NR, nw,nc;
}' sig.c
这段程序的功能与wc命令的功能完全一样。

awk在执行时,遇到自己不认识的东西,比如nw,nc就会将其隐式声明为变量。所以nw就记录了总字段数,nc记录了总字符数。

流程控制

举例

笔者用例子来解释,寻找文件中相同的相邻单词:

1
2
3
4
5
6
7
8
$ awk 'NF>0{
if ($1==lastword) //lastword为上一行最后一个单词
printf("double %s, line %d:\n%s\n", $1,NR,$0); //特判第一个和上一行最后一个单词是否相等
for (i=2; i<=NF; i++) //循环判断本行后一个和前一个是否相等
if ($i==$(i-1)) //判断是否相等
printf("double %s, line %d:\n%s\n", $i,NR,$0); //输出相等的单词,行数,本行全部内容
lastword=$NF; //记录本行最后一个单词
} ' tmp //文件名为tmp

语法

while语句:

1
2
3
4
5
while (condition){
statement1
statement2

}

break:跳出循环
continue:下一个循环
next:下一条记录,回到awk程序开始
exit:跳转至END模式或结束

内部变量

FILENAME 当前输入文件名
RS 输入记录的分割符(默认为换行符)
FS 输入字段的分隔符(默认为空格、制表符)
NF 当前记录的字段数
NR 当前记录数
OFS 输出字段的分隔符(默认为空格)
ORS 输出记录的分隔符(默认为换行)

内部函数

cos(expr) 求余弦
exp(expr) 求自然指数
index(s1,s2) 是否字符串s2位于s1中
int(expr) 取整
length(s) 求字符串长度
log(expr) 求自然对数
sin(expr) 求正玄
split(s, a, c) 按分隔符c将s放入a[1],a[2],…中
substr(s,m,n) 求s的子串,从第m个字符开始,共n个字符。

数组

1
2
3
4
5
$ awk '{line[NR] = $0}
END{
# do what you want
for (i=1; i<=NR; i++) print line[i]
} '

约定

流处理程序的约定,当给定文件名时,数据从文件中读取,否则从标准输入读取。这样便于管道和重定向的使用。

具体学习

awk学习

vi编辑器

由BSD UNIX的作者Bill Joy编写
分两种工作模式:命令模式、编辑模式。a、i、o、O命令进入编辑模式,ESC退出编辑模式。
在命令模式下,可使用所有的ed命令。

系统管理

特殊管理

超级用户

此为Ubuntu特有的管理:
每个UNIX系统都有一个默认的用户root,该用户为管理员,具有不受限制的权限,通常称为“超级用户”。在进行操作系统配置时使用该用户登录。为了安全,一般情况下,不使用该用户登录。

  • 为了安全,Ubuntu Linux默认禁用root用户。使用sudo命令可以提升权限,只是有些麻烦。
  • 当然,也可以使用su命令。临时转换为超级用户身份,此时shell提示符会给出超级用户的提升符#。

    那么如何打开Root用户?

    1
    $ sudo vi /etc/gdm/gdm.conf  //首先提升权限,再利用vi打开gdm.conf 
    1.将其中一行“AllowRoot=false”改为“AllowRoot=true”,就可以成功打开Root用户。
    当然,如果是具有图形界面的Ubuntu Linux,可以通过主菜单“系统”->“系统管理”->“登录窗口”进入“登录窗口首选项”,在“安全”选项页中选中“允许本地系统管理员登录”。
    1
    $ sudo passwd root  //更改root用户口令
    重启系统即可完成更改。

    软件源

    有些时候,软件源在国外,下载速度简直逆天,我们需要更改国内的软件源来加快速度。
  • /etc/apt/sources.list是一个文本文件,其中记录了用于系统升级的软件源地址。由于用户所在的网络环境的不同,这些地址可能不是最优的。
  • 使用搜索引擎(如百度)搜索“Ubuntu 教育网 软件源”会搜索出很多合适的地址。
  • vi /etc/apt/sources.list 修改软件源地址
  • apt-get update 软件源生效,下载更新列表信息

网络配置

IP地址

简介

计算机要实现网络通信,就必须要有一个用于快速定位的网络地址。IP地址就是计算机在网络中的唯一身份ID,与现实世界中快递的配送需要有具体的住宅地址是一个道理。

ip地址以圆点分隔号的四个十进制数字表示,每个数字从0到255,如某一台主机的ip地址为:128.20.4.1

组成

IP地址 = 网络地址 + 主机地址

这就引入了一个新的问题,如果不指定位数,我怎么知道哪几位是网络地址,哪几位是主机地址呢?这就需要子网掩码

子网掩码

子网掩码又叫网络掩码、地址掩码、子网络遮罩,是一个 4 * 8bit(1字节)由 0/1 组成的数字串。

它的作用是屏蔽(遮住)IP地址的一部分以划分成网络地址和主机地址两部分,并说明该IP地址是在局域网上,还是在远程网上。

通过子网掩码,可以把网络划分成子网,即VLSM(可变长子网掩码),也可以把小的网络归并成大的网络即超网。(了解)

子网掩码不能单独存在,它必须结合IP地址一起使用。(了解)

默认网关

什么是网关?

连接两个不同的网络的设备都可以叫网关设备;网关的作用就是实现两个网络之间进行通讯与控制。

网关设备可以是 交互机(三层及以上才能跨网络)、路由器、启用了路由协议的服务器、代理服务器、防火墙等

网关地址就是网关设备的IP地址。

作用

来一张电子包浆的图:
网关
要实现这两个网络之间的通信,则必须通过网关。

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。网络A向网络B转发数据包的过程。

修改这三者

1
$ vi /etc/network/interfaces

打开后文本如下:
auto eth0
iface eth0 inet static # or dhcp
address xxx.xxx.xxx.xxx
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
第一行的意思是:eth0接口会在系统启动时被自动配置;
第二行的意思是:eth0接口具有一个静态的(static)IP配置;
第三行到第六行分别设置设置eth0接口的ip、网络号、掩码、广播地址和网关;

域名服务器DNS

我们访问一个网站的时候,往往使用的是域名(相对IP来说更加语义清晰、更加容易记忆,例如 www.baidu.com)。

域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。

然而计算机之间的通信网络通信是通过IP进行的, 因此需要将域名解析为对应的IP,DNS就是进行域名解析的服务器。

DNS 维护着 域名(domain name)和IP地址 (IP address)的对照表表,以解析消息的域名。

查询

如图展示了DNS的查询过程:
DNS

修改本地

/etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。

该文件是由域名解析 器(resolver,一个根据主机名解析IP地址的库)使用的配置文件。它的格式很简单,每行以一个关键字开头,后接一个或多个由空格隔开的参数。

1
$ vi /etc/resolv.conf //使用vi打开resolv.conf文件

有如下内容:
Generated by NetworkManager
nameserver xxx.xxx.xxx.xxx //add it
nameserver xxx.xxx.xxx.xxx

添加完毕后,可以使用:

1
$ /etc/init.d/networking restart

来重启网络,使得配置生效。
可使用ifconfig,route等命令查看配置结果。

网络应用

创建WebServer

1
$ apt-get install apache2

使用:http://xxx.xxx.xxx.xxx(Ubuntu Host IP Address) 来访问

共享文件

1
$ apt-get install samba

建一个共享文件夹,设权限为777,在文件管理器中使用鼠标右键共享之。

用户管理

概述

UNIX是多用户类型的操作系统,其多用户特征通过多个用户帐号来体现。每个用户可以获得不同的权限和资源,完成不同类型的工作

用户账号管理

  • 命令 useradd、adduser、userdel、usermod、passwd
  • 使用图形界面
  • 增、删、改、查。
  • 修改用户密码、权限。

useradd和adduser有什么区别?

1.在root权限下,useradd只是创建了一个用户名,如 (useradd +用户名 ),它并没有在/home目录下创建同名文件夹,也没有创建密码,因此利用这个用户登录系统,是登录不了的,为了避免这样的情况出现,可以用 (useradd -m +用户名)的方式创建,它会在/home目录下创建同名文件夹,然后利用( passwd + 用户名)为指定的用户名设置密码。

2.可以直接利用adduser创建新用户(adduser +用户名)这样在/home目录下会自动创建同名文件夹

组管理

  • 命令 groupadd、addgroup、groupdel、groupmod、gpasswd
  • 使用图形界面
  • 增、删、改、查。
  • 修改组权限、成员。

磁盘管理

概述

磁盘包括软盘、光盘、硬盘。设备文件分别为:/dev/fd[01](标准输入、输出)、/dev/hd[abcd](IDE硬盘)、/dev/sd[abcd](SCSI硬盘)、/dev/cdrom(光盘)

硬盘必须分区和格式化才可使用。硬盘分区后,每个分区对应的设备名为“硬盘设备名”[1256],例如/dev/sda1代表第一块SCSI硬盘的第一个分区。

硬盘分区

一块硬盘最多可分4个分区,需要分更多的区时,可分一个扩展分区,然后将扩展分区再分为若干逻辑分区。
管理硬盘分区的命令为fdisk。
例如:

1
$ fdisk /dev/sdb    //对第二块SCSI硬盘进行分区管理

sd代表SCSI硬盘,b代表第二块。

格式化分区(创建文件系统)

1
2
3
4
5
# mkfs  分区名              //分区名:如/dev/sdb1
# mkfs -t 文件格式 分区名 //指定文件格式,默认文件格式为ext2
# mount 分区名 路径 //将某硬盘分区挂载到某个目录下,通常该目录为空目录
# umount 分区名或路径 //将某硬盘分区和挂载点脱钩
# df //查看分区挂载情况

这里用#不是用$是因为这些命令只能在超级用户下进行

进程管理

进程:简单地说,就是一个正在运行的程序。(很不精确的说法)
进程包括系统核心进程、系统服务进程和普通用户进程
进程可强制结束

查看进程

1
2
3
4
5
6
$ ps             //查看当前终端启动的进程
$ ps -t 终端名 //显示某个终端启动的进程
$ ps -u 用户名 //显示某个用户启动的进程
$ ps -e //显示所有进程
$ ps -f //显示进程完整信息
$ ps –ef |grep 'pattern' //显示你想看到的进程

结束进程

kill命令语法 kill [-signal] pid
用来给一个进程发信号,但常用的功能是结束某个进程(发一个可以结束某个进程的信号)。
kill -l //列出可用的信号选项

1
2
3
$ kill -2 pid
$ kill -14 pid
$ kill -9 pid

在这里需要注意的是,并不是所有的负数都可以kill掉进程,有些负数可以被用作他用,但-9是一定可以杀死进程的,这个信号无法被用作他用。