TLCL学习笔记2

第十一章 进程

Ps

报告当前进程快照

Top

显示任务

Jobs

列出活跃的任务

Bg

把一个任务放到后台执行

Fg

把一个任务放到前台执行

Kill

给一个进程发送信号

Killall

杀死指定名字的进程

Shutdown

关机或重启系统

 

当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做 init 的程序。

init 再依次运行一系列 叫做init 脚本的 shell 脚本(位于/etc),它们可以启动所有的系统服务。

其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户界面。 这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务。

init的PID总是1。剩下的进程升序排列。

 

PS

只使用ps命令本身的话只会返回和当前终端相关的进程。

TTY代表teletype,指进程的终端。

[me@linuxbox ~]$ ps
PID TTY           TIME CMD
5198 pts/1    00:00:00 bash
10129 pts/1   00:00:00 ps

 

在后面加上x可以返回更多的进程。会返回很多很多结果。

STAT代表进程的状态。

状态

含义

R

运行中。这意味着,进程正在运行或准备运行。

S

正在睡眠。进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络分组。

D

不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。

T

已停止. 已经指示进程停止运行。稍后介绍更多。

Z

一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除)

<

一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。

N

低优先级进程。 一个低优先级进程(一个“好”进程)只有当其它高优先级进程被服务了之后,才会得到处理器时间。

大写字母之后的其他字符代表各种外来进程的特性。

 

另外一个流行(真的很流行)的组合是aux。输出BSD(Berkeley Software Distribution)风格的结果。

标题

含义

USER

用户 ID. 进程的所有者。

%CPU

以百分比表示的 CPU 使用率

%MEM

以百分比表示的内存使用率

VSZ

虚拟内存大小

RSS

进程占用的物理内存的大小,以千字节为单位。

START

进程启动的时间。若它的值超过24小时,则用天表示。

 

top

top命令类似windwos的“任务管理器”,输出的结果三秒刷新一次。

输出结果中上面是系统概要,下面是进程列表,以CPU占用率排序。

 

~实例说明系统概要:

行号

字段

意义

1

top

程序名。

 

14:59:20

当前时间。

 

up 6:30

这是正常运行时间。它是计算机从上次启动到现在所运行的时间。 在这个例子里,系统已经运行了六个半小时。

 

2 users

有两个用户登录系统。

 

load average:

加载平均值是指,等待运行的进程数目,也就是说,处于可以运行状态并共享 CPU 的进程个数。 这里展示了三个数值,每个数值对应不同的时间段。第一个是最后60秒的平均值, 下一个是前5分钟的平均值,最后一个是前15分钟的平均值。若平均值低于1.0,则指示计算机 工作不忙碌。

2

Tasks:

总结了进程数目和这些进程的各种状态。

3

Cpu(s):

这一行描述了 CPU 正在进行的活动的特性。

 

0.7%us

0.7% 的 CPU 被用于用户进程。这意味着进程在内核之外。

 

1.0%sy

1.0%的 CPU 时间被用于系统(内核)进程。

 

0.0%ni

0.0%的 CPU 时间被用于"nice"(低优先级)进程。

 

98.3%id

98.3%的 CPU 时间是空闲的。

 

0.0%wa

0.0%的 CPU 时间来等待 I/O。

4

Mem:

展示物理内存的使用情况。

5

Swap:

展示交换分区(虚拟内存)的使用情况。

 

Top接受键盘指令。直接按h显示帮助,直接按q退出top。

 

控制进程

输入xlogo,获取一个示例程序。

 

中断进程

首先xlogo一下,此时linux命令行没有返回;按下Ctrl-c,中断。

 

后台执行

输入xlogo &

会返回任务号和PID。并且可以输入下一条指令了。

此时可以在ps里看到xlogo。

 

通过命令jobs可以看到任务。

 

返回前台

使用fg %【任务序号】

~

[me@linuxbox ~]$ fg %1
xlogo

 

停止(而非终止)一个进程

输入xlogo,之后ctrl-z

之后你调整xlogo窗口的大小,会发现X不动了。

使用fg可以让它复活

使用bg再次把它移到后台

 

Signals

首先启动xlogo &

此时打印出了PID和jobspec

使用kill 【PID】

或者

kill %【jobspec】终止。

 

kill并不能是用来“杀死”程序,而是给它发送信号。例如ctrl-c其实是发送INT(中断)的信号,ctrl-z其实是发送TSTP(终端停止)的信号。

 

KILL真正的语法形式:

kill [-signal] PID...

 

如果没有填入可选项,那么默认是TERM(终止)。

编号

名字

含义

1

HUP

挂起。这是美好往昔的残留部分,那时候终端机通过电话线和调制解调器连接到 远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂起”。 通过关闭一个终端会话,可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。

许多守护进程也使用这个信号,来重新初始化。这意味着,当一个守护进程收到这个信号后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。

2

INT

中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。

9

KILL

杀死。这个信号很特别。尽管程序可能会选择不同的方式来处理发送给它的 信号,其中也包含忽略信号,但是 KILL 信号从不被发送到目标程序。而是内核立即终止 这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。

15

TERM

终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个它会终止。

18

CONT

继续。在一个停止信号后,这个信号会恢复进程的运行。

19

STOP

停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。

其他常用信号

编号

名字

含义

3

QUIT

退出

11

SEGV

段错误。如果一个程序非法使用内存,就会发送这个信号。也就是说, 程序试图写入内存,而这个内存空间是不允许此程序写入的。

20

TSTP

终端停止。当按下 Ctrl-z 组合键后,终端发送这个信号。不像 STOP 信号, TSTP 信号由目标进程接收,且可能被忽略。

28

WINCH

改变窗口大小。当改变窗口大小时,系统会发送这个信号。 一些程序,像 top 和 less 程序会响应这个信号,按照新窗口的尺寸,刷新显示的内容。

 

KILALL

基本格式

killall [-u user] [-signal] name...

 

一看就懂的实例

[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated                xlogo
[2]+ Terminated                xlogo

 

其他进程相关指令

命令名

命令描述

pstree

输出一个树型结构的进程列表,这个列表展示了进程间父/子关系。

vmstat

输出一个系统资源使用快照,包括内存,交换分区和磁盘 I/O。 为了看到连续的显示结果,则在命令名后加上更新操作延时的时间(以秒为单位)。例如,“vmstat 5”。 ,按下 Ctrl-c 组合键, 终止输出。

xload

一个图形界面程序,可以画出系统负载随时间变化的图形。

tload

与 xload 程序相似,但是在终端中画出图形。使用 Ctrl-c,来终止输出。

 

第十二章 shell环境

Printenv

打印部分或所有的环境变量

Set

设置 shell 选项

Export

导出环境变量,让随后执行的程序知道。

Alias

创建命令别名

 

shell 在环境中存储了两种基本类型的数据,环境变量和 shell 变量。

shell 变量是 bash 存放的少量数据,剩下的都是 环境变量。

除此之外,还存储了一些shell函数。

 

printenv打印所有环境变量

会返回很长的结果。

 

[me@linuxbox ~]$ printenv USER
Me

 

使用alias来查看别名。

[me@linuxbox ~]$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

 

这是为什么ls会带颜色。

 

环境变量列表

DISPLAY

如果你正在运行图形界面环境,那么这个变量就是你显示器的名字。通常,它是 ":0", 意思是由 X 产生的第一个显示器。

EDITOR

文本编辑器的名字。

SHELL

shell 程序的名字。

HOME

用户家目录。

LANG

定义了字符集以及语言编码方式。

OLD_PWD

先前的工作目录。

PAGER

页输出程序的名字。这经常设置为/usr/bin/less。

PATH

由冒号分开的目录列表,当你输入可执行程序名后,会搜索这个目录列表。

PS1

Prompt String 1. 这个定义了你的 shell 提示符的内容。随后我们可以看到,这个变量 内容可以全面地定制。

PWD

当前工作目录。

TERM

终端类型名。类 Unix 的系统支持许多终端协议;这个变量设置你的终端仿真器所用的协议。

TZ

指定你所在的时区。大多数类 Unix 的系统按照协调时间时 (UTC) 来维护计算机内部的时钟 ,然后应用一个由这个变量指定的偏差来显示本地时间。

USER

你的用户名

 

如何建立shell环境

当我们登录系统后, bash 程序启动,并且会读取一系列称为启动文件的配置脚本, 这些文件定义了默认的可供所有用户共享的 shell 环境。

然后是读取更多位于我们自己家目录中 的启动文件,这些启动文件定义了用户个人的 shell 环境。

有两种 shell 会话类型:一个是登录 shell 会话,另一个是非登录 shell 会话。

 

登录shell会话会提示输入用户名和密码,非shell会话通常是用GUI启动。

 

登录shell会话启动的文件

/etc/profile

应用于所有用户的全局配置脚本。

~/.bash_profile

用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。

~/.bash_login

如果文件 ~/.bash_profile 没有找到,bash 会尝试读取这个脚本。

~/.profile

如果文件 ~/.bash_profile 或文件 ~/.bash_login 都没有找到,bash 会试图读取这个文件。 这是基于 Debian 发行版的默认设置,比方说 Ubuntu。

 

非shell会话

/etc/bash.bashrc

应用于所有用户的全局配置文件。

~/.bashrc

用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。

 

看一下.bash_profile文件的内容:

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH

#export PATH让这个shell的子进程也可以使用PATH变量的内容

 

文本编辑器

 

Nano

保存:ctrl-o

例如我们可以修改.bashrc,在最后加上这么几行:

umask 0002
export HISTCONTROL=ignoredups
export HISTSIZE=1000
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'

 

它们的意思是:

文本行

含义

umask 0002

设置掩码来解决共享目录的问题。

export HISTCONTROL=ignoredups

使得 shell 的历史记录功能忽略一个命令,如果相同的命令已被记录。

export HISTSIZE=1000

增加命令历史的大小,从默认的 500 行扩大到 1000 行。

alias l.='ls -d .* --color=auto'

创建一个新命令,叫做'l.',这个命令会显示所有以点开头的目录项。

alias ll='ls -l --color=auto'

创建一个叫做'll'的命令,这个命令会显示长格式目录列表。

 

.bashrc文件只会在刚启动终端会话时读取。为了使我们刚才的操作生效,需要使用source强迫bash重新读取刚才的文件

 

source .bashrc

 

 

第十三章  vi简介

vi读作vee-eye,来源于visual。

 

一般来说,vi就是vim。(improved),但是有时一些老系统会运行在vim的兼容模式下,就很烦。这时你需要

echo “set nocp” >> ~/.vimrc

 

创建新文件: 直接

[me@linuxbox ~]$ vi foo.txt

 

每行开头的波浪线代表那一行没有文本。

 

默认我们处于命令模式。按下i或者insert进入插入模式。

插入模式下可以使用:w或者:q来保存或退出。

 

又是令人恶心的大表了:

按键

移动光标

l or 右箭头

向右移动一个字符

h or 左箭头

向左移动一个字符

j or 下箭头

向下移动一行

k or 上箭头

向上移动一行

0 (零按键)

移动到当前行的行首。

^

移动到当前行的第一个非空字符。

$

移动到当前行的末尾。

w

移动到下一个单词或标点符号的开头。

W

移动到下一个单词的开头,忽略标点符号。

b

移动到上一个单词或标点符号的开头。

B

移动到上一个单词的开头,忽略标点符号。

Ctrl-f or Page Down

向下翻一页

Ctrl-b or Page Up

向上翻一页

numberG

移动到第 number 行。例如,1G 移动到文件的第一行。

G

移动到文件末尾。

 

类似G,很多命令都可以在前面加数字。例如5j表示向下移动5行。

在命令模式下,按下大写A在行尾(本行)添加文本。(等于i+$)

 

撤销:直接按u

大写A:在当前行尾insert

 

删除命令:

命令

删除的文本

x

当前字符

3x

当前字符及其后的两个字符。

dd

当前行。

5dd

当前行及随后的四行文本。

 

复制:

命令

复制的内容

yy

当前行。

5yy

当前行及随后的四行文本。

y$

从当前光标位置到当前行的末尾。

yG

从当前行到文件末尾。

 

$和G的使用,对删除命令同样有效。

粘贴时,p粘贴到下一行,大写P粘贴到上一行。

 

由于vi不能直接删除行尾的换行符来链接两行,所以vi提供了大写 J 来连接本行和下一行。

 

替换文本

:%s/Line/line/g

看起来很难,其实很简单,实际上,只要知道%的意思是匹配全部文本,s是指定替换操作,g是指定每行的每个匹配项,就都知道了。

 

条目

含义

:

冒号字符运行一个 ex 命令。

%

指定要操作的行数。% 是一个快捷方式,表示从第一行到最后一行。另外,操作范围也 可以用 1,5 来代替(因为我们的文件只有5行文本),或者用 1,$ 来代替,意思是 “ 从第一行到文件的最后一行。” 如果省略了文本行的范围,那么操作只对当前行生效。

s

指定操作。在这种情况下是,替换(查找与替代)。

/Line/line

查找类型与替代文本。

g

这是“全局”的意思,意味着对文本行中所有匹配的字符串执行查找和替换操作。如果省略 g,则 只替换每个文本行中第一个匹配的字符串。

 

在g后加c,将在每次替换是询问是否真的要替换。

 

在文件之间切换:

:n

下一个文件

:N

上一个文件

 

或者,使用:buffers 展示所有文件

找到对应文件的编号。使用:buffers 3 跳到第三号文件。

我们知道可以用e来附加打开文件。此时无法使用:n来切换,只能使用buffers。

 

将整个文件插入(拷贝)到另一个文件中:

打开一个文件,输入:r +文件名。

 

第十四章 自定制 shell 提示符

 

[me@linuxbox ~]$

这个东西就是shell提示符。它是由环境变量$PS1决定的。(是“prompt string one” 的简写)

echo可以看到其内容:

[me@linuxbox ~]$ echo $PS1
[\u@\h \W]\$

 

序列

显示值

\a

以 ASCII 格式编码的铃声 . 当遇到这个转义序列时,计算机会发出嗡嗡的响声。

\d

以日,月,天格式来表示当前日期。例如,“Mon May 26.”

\h

本地机的主机名,但不带末尾的域名。

\H

完整的主机名。

\j

运行在当前 shell 会话中的工作数。

\l

当前终端设备名。

\n

一个换行符。

\r

一个回车符。

\s

shell 程序名。

\t

以24小时制,hours:minutes:seconds 的格式表示当前时间.

\T

以12小时制表示当前时间。

\@

以12小时制,AM/PM 格式来表示当前时间。

\A

以24小时制,hours:minutes 格式表示当前时间。

\u

当前用户名。

\v

shell 程序的版本号。

\V

Version and release numbers of the shell.

\w

当前工作目录名。

\W

当前工作目录名的最后部分。

\!

当前命令的历史号。

\#

当前 shell 会话中的命令数。

\$

这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符。

\[

标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印 的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。

\]

标志着非打印字符序列结束。

 

 

知道了这个表,就可以随便干你想干的事情了:

~

$ PS1="\A \h \$ "
17:33 linuxbox $

 

也可以改变其颜色:

Sequence

Text Color

Sequence

Text Color

\033[0;30m

Black

\033[1;30m

Dark Gray

\033[0;31m

Red

\033[1;31m

Light Red

\033[0;32m

Green

\033[1;32m

Light Green

\033[0;33m

Brown

\033[1;33m

Yellow

\033[0;34m

Blue

\033[1;34m

Light Blue

\033[0;35m

Purple

\033[1;35m

Light Purple

\033[0;36m

Cyan

\033[1;36m

Light Cyan

\033[0;37m

Light Gray

\033[1;37m

White

 

怎么使用这些鬼画符呢?只需要将它们用 [] 标记出来就好了。注意方括号要加转义,最后结果是包含2个左方括号和一个右方括号。

<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$'
<me@linuxbox ~>$

 

这样,命令也会是红色的。使用以下命令将我们输入的命令改回黑色:

<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]'

 

设置背景颜色:

\033[0;40m

蓝色

\033[1;44m

黑色

\033[0;41m

红色

\033[1;45m

紫色

\033[0;42m

绿色

\033[1;46m

青色

\033[0;43m

棕色

\033[1;47m

浅灰色

 

剩下的移动光标实在是没用。不看了。

 

第十五章 软件包管理

主要的包管理系统家族

包管理系统

发行版 (部分列表)

Debian Style (.deb)

Debian, Ubuntu, Xandros, Linspire

Red Hat Style (.rpm)

Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS

 

linux的大多数软件由发行商以包文件的形式提供,剩下的则以源码形式存在,可以手动安装。

在包管理系统中软件的基本单元是包文件。

包文件是一个构成软件包的文件压缩集合。

一个软件包可能由大量程序以及支持这些程序的数据文件组成。

 

依赖:

程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。程序所共有的活动,如输入/输出, 就是由一个被多个程序调用的子例程处理的。

这些子例程存储在动态链接库中。动态链接库为多个程 序提供基本服务。

如果一个软件包需要一些共享的资源,如一个动态链接库,它就被称作有一个依赖

现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有的依赖也被安装。

 

#【动态链接】提供了一种方法,使进程可以调用不属于其可执行代码的函数。

windows下是.dll文件,linux下是.so文件。

 

分为底层和上层工具:我理解就是底层用来执行下载的包,上层就是直接安装。

发行版

底层工具

上层工具

Debian-Style

dpkg

apt-get, aptitude

Fedora, Red Hat Enterprise Linux, CentOS

rpm

yum

 

查找:

风格

命令

Debian

apt-get update; apt-cache search search_string

Red Hat

yum search search_string

 

安装:

风格

命令

Debian

apt-get update; apt-get install package_name

Red Hat

yum install package_name

 

直接通过底层工具安装的话,就是没有通过依赖解析直接安装。

Style

Command(s)

Debian

dpkg --install package_file

Red Hat

rpm -i package_file

若发现依赖不存在,会报错退出。

 

删除

风格

命令

Debian

apt-get remove package_name

Red Hat

yum erase package_name

 

更新:

风格

命令

Debian

apt-get update; apt-get upgrade

Red Hat

yum update

 

底层软件包升级

风格

命令

Debian

dpkg --install package_file

Red Hat

rpm -U package_file

 

列出所有软件包

风格

命令

Debian

dpkg --list

Red Hat

rpm -qa

 

查看是否已经安装了:

风格

命令

Debian

dpkg --status package_name

Red Hat

rpm -q package_name

 

查看哪个软件包应该为某个文件负责:

风格

命令

Debian

dpkg --search file_name

Red Hat

rpm -qf file_name

 

第十六章 存储媒介

使用vim /etc/fstab 就可以看到启动时会挂在的设备(硬盘分区)。

其内容类似:

LABEL=/12               /               ext3        defaults        1   1
LABEL=/home             /home           ext3        defaults        1   2
LABEL=/boot             /boot           ext3        defaults        1   2

 

字段

内容

说明

1

设备名

传统上,这个字段包含与物理设备相关联的设备文件的实际名字,比如说/dev/hda1(第一个 IDE 通道上第一个主设备分区)。然而今天的计算机,有很多热插拔设备(像 USB 驱动设备),许多 现代的 Linux 发行版用一个文本标签和设备相关联。当这个设备连接到系统中时, 这个标签(当储存媒介格式化时,这个标签会被添加到存储媒介中)会被操作系统读取。 那样的话,不管赋给实际物理设备哪个设备文件,这个设备仍然能被系统正确地识别。

2

挂载点

设备所连接到的文件系统树的目录。

3

文件系统类型

Linux 允许挂载许多文件系统类型。大多数本地的 Linux 文件系统是 ext3, 但是也支持很多其它的,比方说 FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。

4

选项

文件系统可以通过各种各样的选项来挂载。有可能,例如,挂载只读的文件系统, 或者挂载阻止执行任何程序的文件系统(一个有用的安全特性,避免删除媒介。)

5

频率

一位数字,指定是否和在什么时间用 dump 命令来备份一个文件系统。

6

次序

一位数字,指定 fsck 命令按照什么次序来检查文件系统。

 

Mount

mount命令被用来挂载文件系统。执行这个不带参数的命令,将会显示 一系列当前挂载的文件系统

[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)

 

使用umount来卸载设备。

卸载一个设备需要把所有剩余的数据写入这个设备,所以设备可以被安全地移除。

如没有卸载设备,就移除了它,就有可能没有把注定要发送到设备中的数据输送完毕。

在某些情况下, 这些数据可能包含重要的目录更新信息,这将导致文件系统损坏,这是发生在计算机中的最坏的事情之一。

 

使用

ls /dev

命令,来查看本机上的设备。Dev for devices.

 

[me@linuxbox ~]$ sudo tail -f /var/log/messages

查看系统日志。tail将文件输出到标准输出。-f可以循环读取(实时查看变化)。

 

Fdisk

fdisk用来操作分区。

[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb

首先卸载一个设备,并调用fdisk程序。

 

程序启动后会出现提示。

每个字母代表了不同的操作。

P

打印分区表

l

查看可用的分区类型列表

t

更改一个分区的id号码

w

将此前修改应用。

 

/dev/sdb 指整个设备,/dev/sdb1指这个设备的第一分区

 

mkfs

创建新的文件系统。

sudo mkfs -t ext3 /dev/sdb1

这表示在设备/dev/sdb1中,创建一个新的文件系统。系统类型由参数-t ext3指定。

 

 fsck

检查磁盘。使用这个命令通常意味着磁盘坏了(物理意义上)。

 

CD-ROM部分略。用到再看。

 

使用md5sum可以计算hash。

 

第十七章 网络系统

Ping

不说了

 

Traceroute

1 ipcop.localdomain (192.168.1.1) 1.066 ms 1.366 ms 1.720 ms

输出的每一行会如上所示。包含跳数,主机名,IP地址,和性能。

被隐藏起来的路由去信息会用星号*显示。

 

Netstat

很重要,用来查看网络设置。

使用-ie选项:

[me@linuxbox ~]$ netstat -ie
eth0    Link encap:Ethernet HWaddr 00:1d:09:9b:99:67
        inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
        inet6 addr: fe80::21d:9ff:fe9b:9967/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
        RX packets:238488 errors:0 dropped:0 overruns:0 frame:0
        TX packets:403217 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:100 RX bytes:153098921 (146.0 MB) TX
        bytes:261035246 (248.9 MB) Memory:fdfc0000-fdfe0000

lo      Link encap:Local Loopback
        inet addr:127.0.0.1 Mask:255.0.0.0
...

 

至少有两个网络接口:eth0和lo,分别代表以太网接口和local。

首先查看第四行显示的UP,证明有在正常工作。

以及第二行的IP地址,证明DHCP正常工作。

 

使用-r选项查看路由表

[me@linuxbox ~]$ netstat -r
Kernel IP routing table
Destination     Gateway     Genmask         Flags    MSS  Window  irtt Iface

192.168.1.0     *           255.255.255.0   U        0    0          0 eth0
default         192.168.1.1 0.0.0.0         UG       0    0          0 eth0

第一行显示了目的地 192.168.1.0。IP 地址以零结尾是指网络,而不是独立主机, 所以这个目的地意味着局域网中的任何一台主机。

下一个字段,Gateway, 是网关(路由器)的名字或 IP 地址,用它来连接当前的主机和目的地的网络。 若这个字段显示一个星号,则表明不需要网关。

 

Wget

不仅实现了ftp的基本功能,还能下载网页,下载多个文件。

 

Ssh

SSH 由两部分组成。SSH 服务端运行在远端主机上,在端口 22 上监听收到的外部连接,而 SSH 客户端用在本地系统中,用来和远端服务器通信。

如果当前客户端的用户名和远端服务器的用户名不同,可以使用以下形式指定用户:

ssh bob@remote-sys

 

Scp

从服务器上拷贝一个交document.txt的文件到我家

scp remote-sys:document.txt .

 

第十八章 查找文件

Locate

locate实属简单。

[me@linuxbox ~]$ locate zip | grep bin

 

find

而 find 程序能基于各种各样的属性 搜索一个给定目录。

例如find ~会列出~下的所有文件。

Find -type b

可以只列出指定类型的文件。参数表如下。

文件类型

描述

b

块特殊设备文件

c

字符特殊设备文件

d

目录

f

普通文件

l

符号链接

 

find ~ -type f -name "*.JPG" -size +1M | wc -l

还可使用-name和-size来指定名字和大小。

+1M表示大于1M,-1M表示小于,没有符号表示正好。

-size参数列表

字符

单位

b

512 个字节块。如果没有指定单位,则这是默认值。

c

字节

w

两个字节的字

k

千字节(1024个字节单位)

M

兆字节(1048576个字节单位)

G

千兆字节(1073741824个字节单位)

 

find的其它参数

测试条件

描述

-cmin n

匹配内容或属性最后修改时间正好在 n 分钟之前的文件或目录。 指定少于 n 分钟之前,使用 -n,指定多于 n 分钟之前,使用 +n。

-cnewer file

匹配内容或属性最后修改时间晚于 file 的文件或目录。

-ctime n

匹配内容和属性最后修改时间在 n*24小时之前的文件和目录。

-empty

匹配空文件和目录。

-group name

匹配属于一个组的文件或目录。组可以用组名或组 ID 来表示。

-iname pattern

就像-name 测试条件,但是不区分大小写。

-inum n

匹配 inode 号是 n的文件。这对于找到某个特殊 inode 的所有硬链接很有帮助。

-mmin n

匹配内容被修改于 n 分钟之前的文件或目录。

-mtime n

匹配的文件或目录的内容被修改于 n*24小时之前。

-name pattern

用指定的通配符模式匹配的文件和目录。

-newer file

匹配内容晚于指定的文件的文件和目录。这在编写执行备份的 shell 脚本的时候很有帮。 每次你制作一个备份,更新文件(比如说日志),然后使用 find 命令来判断哪些文件自从上一次更新之后被更改了。

-nouser

匹配不属于一个有效用户的文件和目录。这可以用来查找 属于被删除的帐户的文件或监测攻击行为。

-nogroup

匹配不属于一个有效的组的文件和目录。

-perm mode

匹配权限已经设置为指定的 mode的文件或目录。mode 可以用 八进制或符号表示法。

-samefile name

类似于-inum 测试条件。匹配和文件 name 享有同样 inode 号的文件。

-size n

匹配大小为 n 的文件

-type c

匹配文件类型是 c 的文件。

-user name

匹配属于某个用户的文件或目录。这个用户可以通过用户名或用户 ID 来表示。

 

~可以使用括号(要加上转义符),-not -or来控制逻辑。逻辑存在短路。

[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

 

使用以下参数来对find到的文件进行操作。

操作

描述

-delete

删除当前匹配的文件。

-ls

对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。

-print

把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。

-quit

一旦找到一个匹配,退出。

除了表中的行为,也可以使用下列命令自定义行为:

-exec rm '{}' ';'

注意要使用单引号转义。

 

find的结果是无序的,取决于实际存储。

 

提高find的效率:

低效率:

ls -l file1
ls -l file2

高效率:

ls -l file1 file2

 

xargs

find ~ -type f -name 'foo*' -print | xargs ls -l

xargs 会为 ls 命令构建 参数列表,然后执行 ls 命令。

 

批量创建文件/文件夹:

[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}

 touch 命令通常被用来设置或更新文件的访问,更改,和修改时间。

如果一个文件名参数是一个 不存在的文件,则会创建一个空文件。

 

Stat

超级加强版的ls。

 

第十九章 归档和备份

Gzip

使用gzip来压缩文件,之后会用压缩后的文件取代之前的文件。

使用gunzip来解压。压缩后会加上.gz的后缀。

 

[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me     me 15738 2008-10-14 07:15 foo.txt
[me@linuxbox ~]$ gzip foo.txt
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me     me 3230 2008-10-14 07:15 foo.txt.gz

 

Bizip2

舍弃压缩速度,获得更好的压缩率。使用方法和gzip一样

 

Tar

Tar c/x/r/t +z/v/f

模式

说明

c

为文件和/或目录列表创建归档文件。

x

抽取归档文件。

r

追加具体的路径到归档文件的末尾。

t

列出归档文件的内容。

 

注意不能使用绝对路径,只能使用相对路径。

 

Zip

windows上的那个zip,不多说

 

rsync

对应rsync协议,在本机和服务器上同步数据,会自动传输最小量的数据。

可以在本机到服务器,也可以服务器到本机,可以本机到本机,但总之不能服务器到服务器。

 

例如:

Rsync -av foo1 foo2

会将foo1拷贝到同目录下,命名为foo2。 -a代表递归和保护文件,-v代表输出提示语句。

 

增加--delete,来允许其删除在源目录中不存在的文件。适合备份。

 

第二十章 正则表达式

Grep

查找文本中的行。

选项

描述

-i

忽略大小写。不会区分大小写字符。也可用--ignore-case 来指定。

-v

不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序只会打印不包含匹配项的文本行。也可用--invert-match 来指定。

-c

打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。 也可用--count 选项来指定。

-l

打印包含匹配项的文件名,而不是文本行本身,也可用--files-with-matches 选项来指定。

-L

相似于-l 选项,但是只是打印不包含匹配项的文件名。也可用--files-without-match 来指定。

-n

在每个匹配行之前打印出其位于文件中的相应行号。也可用--line-number 选项来指定。

-h

应用于多文件搜索,不输出文件名。也可用--no-filename 选项来指定。

 

简单的查找:

[me@linuxbox ~]$ grep bzip dirlist*.txt
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover

 

同时,使用-l输出查找到的文件,而非行:
 

[me@linuxbox ~]$ grep -l bzip dirlist*.txt
dirlist-bin.txt

 

原意字符

以bzip为例,这代表文中确实出现了这四个字符,并且是连续的。

除了以下的元字符,都是原意字符:

^ $ . [ ] { } - ? * + ( ) | \

 

.

一个圆点被用来匹配有且仅有的一个字符。

 

^和$

^zip表示zip在行首,可以理解为每行都是^abc$表示的,这样就可以将这两个锚定字符理解为原意字符。

 

[]

方括号中的字符串中的任意一个会被匹配。也就是说从方括号中选一个。

grep -h '[bg]zip' dirlist*.txt

bzip2
bzip2recover
gzip

 

方括号中的元字符除了^和-,都会被解释为原意。

 

^作为否定

[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
bunzip2
gunzip
funzip
gpg-zip

这里在方括号中的第一处填入^,使得匹配了除了b和g之外的字符。

如果不是第一处就是^,那么会被当作原意字符处理。

 

-

连字符用来方便地在方括号中节约时间。

[me@linuxbox ~]$ grep -h '^[A-Za-z0-9]' dirlist*.txt

这表示所有数字或者字母开头的文件名。

方括号中是完备的,^和-如果位置正确,不会查不到。如果我们想把-作为原意使用,将其放在第一个就好了。

[me@linuxbox ~]$ grep -h '[-AZ]' dirlist*.txt

 

posix字符集

有时使用A-Z不能得到预期的结果,因为并不全是按照ASCII码编写的。

按照以下的字符集可以得到预期的结果,但是这不是正则表达式,而是shell展开。

字符集

说明

[:alnum:]

字母数字字符。在 ASCII 中,等价于:[A-Za-z0-9]

[:word:]

与[:alnum:]相同, 但增加了下划线字符。

[:alpha:]

字母字符。在 ASCII 中,等价于:[A-Za-z]

[:blank:]

包含空格和 tab 字符。

[:cntrl:]

ASCII 的控制码。包含了0到31,和127的 ASCII 字符。

[:digit:]

数字0到9

[:graph:]

可视字符。在 ASCII 中,它包含33到126的字符。

[:lower:]

小写字母。

[:punct:]

标点符号字符。在 ASCII 中,等价于:[-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~]

[:print:]

可打印的字符。在[:graph:]中的所有字符,再加上空格字符。

[:space:]

空白字符,包括空格、tab、回车、换行、vertical tab 和 form feed.在 ASCII 中, 等价于:[ \t\r\n\v\f]

[:upper:]

大写字母。

[:xdigit:]

用来表示十六进制数字的字符。在 ASCII 中,等价于:[0-9A-Fa-f]

 

bre和ere

BRE是基本的正则表达式,ERE是扩展的。

之前提到的

^ $ . [ ] *

属于基本正则表达式元字符,而这些是扩展的:

( ) { } ? + |

一个更怪的地方就是,

大小括号,在ERE中,只有被\转义之后才是元字符。

真是不能更怪了。

 

使用ere时,需要给grep加上-E,或者直接使用egrep。

 

|

使用 | 来表示或。逻辑不清时,使用小括号分隔。

grep -Eh '^(bz|gz|zip)' dirlist*.txt

 

问号? 使前面的元素可有可无。

[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567

 

*

和.的使用方法类似,但是要宽松的多:不必匹配恰好一个,0个或者多个也可以。

 

+

用来限定,前面的匹配项必须出现。

[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'
a b c
[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$ echo "abc  d" | grep -E '^([[:alpha:]]+ ?)+$'

 

 

{}

限定前面的匹配项匹配到的字符个数

[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567

 

{n}

匹配前面的元素,如果它确切地出现了 n 次。

{n,m}

匹配前面的元素,如果它至少出现了 n 次,但是不多于 m 次。

{n,}

匹配前面的元素,如果它出现了 n 次或多于 n 次。

{,m}

匹配前面的元素,如果它出现的次数不多于 m 次。

 

应用

查找不正确的电话号码:

[me@linuxbox ~]$ cat phonelist.txt
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440

 

[me@linuxbox ~]$ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$'    phonelist.txt
(292) 108-518
(129) 44-1379

-v用来取反,[0-9]表示数字,{3}表示匹配出三个字符。最好正则都用单引号括起来。

 

在vim中使用/+正则可以起到同样的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章