第一部分 学习shell
第1章 shell是什么
date:显示当前系统的时间和日期
cal:显示当月的日历
df:显示磁盘驱动器当前的可用空间
free:显示可用内存
exit:结束终端会话
第2章 导航
pwd:查看当前工作目录
cd:改变目录
ls:列出目录内容
.代表工作目录,..代表工作目录的父目录,几乎所有情况下都可以省略./
cd:将工作目录改变成主目录
cd-:将工作目录改变成先前的工作目录
cd~username:将工作目录改变成username的主目录
ls-a:列出以.字符开头的隐藏的文件
第3章 Linux系统
ls:列出目录内容
file:确定文件类型
less:查看文件内容
ls命令的常用选项:
-a --all 列出所有文件,包括以点号开头的文件,这些文件通常不列出来
-d --directory 查看目录的信息,而不是目录中的内容
-F --classify 在每个所列出的名字后面加上类型指示符,例如,如果名字是目录名,则会加上一个斜杠
-h --human-readable 以长格式列出,以人们可读的方式而不是字节数来显示文件的大小
-l 以长格式显示结果
-r --reverse 以相反的顺序显示结果,通常,ls命令按照字母升序排列显示结果
-S 按文件大小对结果排序
-t 按修改时间排序
ls长列表字段:-rw-r-- 1 root root 32059 2012-04-03 11:05 oo-cd-cover.odf
-rw-r-r 对文件的访问权限。第一个字符表示文件的类型。在不同类型之间,开头的-表示该文件是一个普通文件,d表示目录。接着的三个字符表示文件所有者的访问权限,再接着的三个字符表示文件所属组中成员的访问权限,最后三个字符表示其他所有人的访问权限。
1 文件硬连接数目
root 文件所有者的用户名
root 文件所属用户组的名称
32059 以字节数表示的文件大小
2012-04-03 11:05 上次修改文件的日期和时间
oo-cd-cover.odf 文件名
less命令:
PAGE UP或b 后翻一页
PAGE DOWN或Spacebar 前翻一页
向上箭头键 向上一行
向下箭头键 向下一行
G 跳转到文本文件的末尾
1G或g 跳转到文本文件的开头
/charecters 向前查找指定的字符串
n 向前查找下一个出现的字符串,这个字符串是之前所指定查找的
h 显示帮助屏幕
q 推出less
第4章 操作文件与目录
cp:复制文件和目录
mv:移动或重命名文件和目录
mkdir:创建目录
rm:移除文件和目录
in:创建硬链接和符号链接
通配符:
* 匹配任意多个字符(包括0个和1个)
? 匹配任一单个字符(不包括0个)
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个不属于字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符
常用字符类:
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit:] 匹配任意一个数字
[:lower:] 匹配任意一个小写字母
[:upper:] 匹配任意一个大写字母
midir dir1:创建单个dir1目录
mkdir dir1 dir2 dir3:创建3个目录,分别命名为dir1,dir2和dir3
cp item1 item2:将单个文件或目录item1复制到文件或目录item2中
cp item... directory:将多个项目(文件或目录)复制进一个目录中
cp命令选项:
-a --archive 复制文件和目录及其属性,包括所有权和权限。通常来说,复制的文件具有用户所操作文件的默认属性
-i --interactive 在覆盖一个已存在的文件前,提示用户进行确认。如果没有指定该选项,cp会默认覆盖文件
-r --recursive 递归地复制目录及其内容。复制目录时需要这个选项(或-a选项)
-u --update 当将文件从一个目录复制到另一个目录时,只会复制那些目标目录中不存在的文件或是目标目录相应文件的更新文件
-v --verbose 复制文件时,显示信息性消息
mv item1 item2:将文件(或目录)item1移动(或重命名)为item2
mv item... directory:将一个或多个条目从一个目录移动到另一个目录下
mv选项:
-i --interactive 覆盖一个已存在的文件之前,提示用户确认。如果没有指定该选项,mv会默认覆盖文件
-u --update 将文件从一个目录移动到另一个目录,只移动那些目标目录中不存在的文件或是目标目录里相应文件的更新文件
-v --verbose 移动文件时显示信息性消息
rm选项:
-i --interactive 删除一个已存在的文件前,提示用户确认。如果没有指定这个选项,rm命令会默认删除文件
-r --recursive 递归地删除目录。要删除一个目录,则必须指定该选项。
-f --force 忽略不存在的文件并无需提示确认。该选项会覆盖--interactive选项
-v --verbose 删除文件时显示信息性消息
ln file link:创建硬链接
ln -s item link:创建符号链接
第5章 命令的使用
type:显示命令的类型
which:显示可执行程序的位置
man:显示命令的手册页
apropos:显示一系列合适的命令
info:显示命令的info条目
whatis:显示一条命令的简述
alias:创建一条命令的别名,(在命令行定义的别名当shell会话结束时也随之消失)
手册文档的组织结构:
1 用户命令
2 内核系统调用的程序接口
3 C库函数程序接口
4 特殊文件,如设备节点和驱动程序
5 文件格式
6 游戏和娱乐,例如屏幕保护程序
7 其他杂项
8 系统管理命令
info命令:
? 显示命令帮助
PAGE UP or BACKSPACE 返回上一页
PAGE DOWN or Spacebar 翻倒下一页
n Next-显示下一个节点
p Previous-显示上一个节点
u Up-显示目前显示节点的父节点(通常是一个菜单)
ENTER 进入光标所指的超链接
q 退出
alias foo='cd /usr; ls; cd -':将cd /usr; ls; cd - 这三条命令整合成一条新命令foo
第6章 重定向
cat:合并文件,将它们复制到标准输出文件中
sort:对文本行排序
uniq:报告或删除文件中重复的行
wc:打印文件中的换行符,字和字节的个数
grep:打印匹配行
head:输出文件的第一部分内容
tail:输出文件的最后一部分内容
tee:读取标准输入的数据,并将其内容输出到标准输出和文件中
>:重定向操作符,后接文件名,可以把标准输出重定向到另一个文件中,而不是显示在屏幕上。
ls -l /usr/bin > ls-output.txt:创建/usr/bin目录的一个长列表信息,并把结果输出到ls-output.txt文件中
> ls-output.txt:删除ls-output.txt文件的内容,或创建空的ls-output.txt文件
>>:重定向符,不从文件的首位开始覆盖文件,而是从文件的尾部开始添加输出内容
ls -l /usr/bin >> ls-output.txt:将结果添加到ls-output.txt文件末尾
ls -l /usr/bin 2> ls-error.txt:将标准错误重定向到ls-error.txt文件中(shell在内部将标准输入文件,标准输出文件和标准错误文件分别索引为0,1和2)
ls -l /bin/usr &> ls-output.txt:将标准输出和错误输出重定向到ls-output.txt文件中
ls -l /bin/usr 2> /dev/null:将错误信息丢弃
cat ls-output.txt:显示ls-output.txt文件的内容
cat movie.mpeg.0* > movie.mpeg:将movie.mpeg.001 movie.mpeg.002...movie.mpeg.099连接在一起
cat > lazy_dog.txt:把标准输入复制到文件lazy_dog.txt中
cat < lazy_dog.txt:把文件lazy_dog.txt中的内容输入到标准输出中
ls -l /usr/bin | less:通过管道|将ls -l /usr/bin命令的结果输出到less中
ls -l /bin /usr/bin | sort | less:将/bin和/usr/bin目录下的所有可执行程序合并成一个列表,并按照顺序排列,并查看这个列表;把多个命令合在一起构成一个管道,称为过滤器
ls -l /bin /usr/bin | sort | uniq | less:忽略列表中重复的行
ls -l /bin /usr/bin | sort | uniq -d | less:查看重复的行
wc ls-output.txt:显示ls-output.txt文件中包含的行数,字数和字节数
ls /bin /usr/bin | sort | uniq | wc -l:查看已排序好的列表中的条目数
ls /bin /usr/bin | sort | uniq | grep zip:从列表中搜索出文件名中包含zip的所有文件(-i,搜索时忽略大小写;-v,只输出和模式不匹配的行)
head -n 5 ls-output.txt:输出文件ls-output.txt的前5行,默认是前10行
tail -n 5 ls-output.txt:输出文件ls-output.txt的后5行,默认是后10行
ls /usr/bin | tail -n 5:显示命令ls /usr/bin的后5行结果
tail -f /var/log/messages:显示目录/var/log下的messages文件,-f表示tail将持续监视这个文件,直到按下Ctrl-C才停止
ls /usr/bin | tee ls.txt | grep zip:将目录列表输出到ls.txt文件中,再用grep命令过滤管道中内容
第7章 透过shell看世界
echo:显示一行文本
echo *:将*扩展为当前目录下的所有文件名,然后echo将其显示出来
echo D*:显示当前目录下以D开头的文件名
echo *s:显示当前目录下以s结尾的文件名
echo [[:upper:]]*:显示当前目录下以大写字母开头的文件名
echo /usr/*/share:查看主目录之外的目录,结果为/usr/kerberos/share /usr/local/share
ls -d .* | less:显示以.开头的文件名
ls -d .[!.]?*:显示以.开头的文件名,文件名中并不包含第二个点字符,但包含至少一个额外的字符,后面也可跟着其它字符
echo ~:显示当前用户的主目录
echo ~foo:显示foo用户的主目录
echo $((2+2)):算术扩展,显示2+2的结果,其格式为$((expression))
算术运算符:
+ 加
- 减
* 乘
/ 除
% 求余
** 取幂
echo Front-{A,B,C}-Back:花括号扩展,显示为Front-A-Back Front-B-Back Front-C-Back
echo Number_{1..5}:显示Number_1 Number_2 Number_3 Number_4 Number_5
echo {Z..A}:显示Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
echo a{A{1,2},B{3,4}}b:显示aA1b aA2b aB3b aB4b
mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12}:创建目录2009-01 2009-02 .. 2011-12
echo $USER:显示变量USER中包含的用户名
printenv | less:查看可用的变量列表
echo $(ls):把命令ls的输出作为扩展模式使用
ls -l $(which cp):显示cp所在路径的详细列表
file $(ls /usr/bin/* | grep zip):将管道的输出为file命令的参数列表
echo this is a test:输出this is a text
echo The total is $100.00:输出The total is 00.00,因为$1是一个未定义的变量,所以参数扩展把$1的值替换为空字符串
ls -l "two words.txt":使用双引号可以阻止单词分割,但参数扩展、算术扩展和命令替换在双引号中依然生效,没有用双引号包含起来的空格、制表符和换行符不会被当成文本的一部分,而只是被当成分割符
echo $(cal):输出为五月 2016 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
echo "$(cal)":输出为
五月 2016
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
单词分割机制会把换行符当成界定符
echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER:输出为text /home/me/ls-output.txt a b foo 4 me
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER:输出为text ~/*.txt {a,b} foo 4 me
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER:输出为text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER,单引号能抑制所有扩展,随着引用级别加强,越来越多的扩展将被抑制
echo "The balance for user $USER is: \$5.00":输出为The balance for user me is: $5.00,转义字符常用来消除文件名中某个字符的特殊含义,注意单引号中的反斜杠将失去它的特殊含义
反斜杠转义字符序列:
\a 响铃(警告声-计算机发出的哔哔声)
\b 退格
\n 新的一行
\r 回车
\t 制表
sleep 10; echo -e "Time's up\a":等待10秒,显示Time's up并响铃,在echo命令中带上-e选项,就能够解释转义字符序列
第8章 高级键盘技巧
clear:清屏
history:显示历史列表的记录
光标移动命令:
Ctrl-A: 移动光标至行首
Ctrl-E: 移动光标至行尾
Ctrl-F: 光标向前移动一个字符,和右箭头作用一样
Ctrl-B: 光标向后移动一个字符,和左箭头作用一样
Alt-F: 光标向前移动一个字
Alt-B: 光标向后移动一个字
Ctrl-L:清屏并把光标移到左上角,和clear命令的作用一样
文本编辑命令:
Ctrl-D: 删除光标处的字符
Ctrl-T: 使光标处的字符和它前面的字符对调位置
Alt-T: 使光标处的字和它前面的字对调位置
Alt-L: 把从光标到字尾的字符转换成小写字母形式
Alt-U: 把从光标到字尾的字符转换成大写字母形式
剪切和粘贴命令:
Ctrl-K:剪切从光标到行尾的文本
Ctrl-U:剪切从光标到行首的文本
Alt-D: 剪切从光标到当前词尾的文本
Alt-Backspace: 剪切从光标到词头的文本,如果光标在一个单词的开头,则剪切前一个单词
Ctrl-Y: 把kill-ring缓冲区中的文本粘贴到光标位置
自动补齐:在输入命令时,按Tab键将触发自动补齐功能
自动补齐命令:
Alt-$: 显示所有可能的自动补齐列表,在大多数系统中,可通过按两次Tab键实现
Alt-*: 插入所有可能的匹配项
history | less:查看使用过的命令的历史记录
history | grep /usr/bin:显示包含/usr/bin的历史记录
!88:bash将把!88扩展为历史列表中第88行的命令
历史记录命令:
Ctrl-P: 移动到前一条历史记录,相当于向上箭头键
Ctrl-N: 移动到后一条历史记录,相当于向下箭头键
Alt-<: 移动到历史记录列表的开始处
Alt->: 移动到历史记录列表的结尾处,即当前命令行
Ctrl-R: 逆向递增地搜索。从当前命令行向前递增搜索
Alt-P: 逆向非递增地搜索。按下这个组合键,接着输入待搜索的字符串,按Enter键后,搜索才真正开始执行
Alt-N: 向前非递增地搜索
Ctrl-O: 执行历史记录列表中的当前项,执行完跳到下一项。若要把历史记录中的一系列命令重新执行一遍,使用该组合键将很方便
历史记录扩展命令:
!!: 重复最后一个执行的命令。按向上箭头键再按Enter键也可以实现相同的功能,而且操作简单
!number: 重复历史记录中第number行的命令
!string: 重复最近的以string开头的历史记录
!?string: 重复最近的包含string的历史记录
第9章 权限
id: 显示用户身份标识
chmod: 更改文件的模式(权限)
umask: 设置文件的默认权限
su: 以另一个用户的身份运行shell
sudo: 以另一个用户的身份来执行命令
chown: 更改文件所有者
chgrp: 更改文件所属群组
passwd: 更改用户密码
文件类型:
- 普通文件
d 目录文件
l 符号链接,其剩下的文件属性始终是rwxrwxrwx,它是伪属性值
c 字符设备文件,表示以字节流形式处理数据的设备,如终端或调制解调器
b 块设备文件,表示以数据块方式处理数据的设备,如硬盘驱动或光盘驱动
权限属性:
r 允许打开和读取文件;如果设置了执行权限,则允许列出目录下的内容
w 允许写入或截短文件,如果也设置了执行权限,则目录中的文件允许被创建、删除和重命名;但不允许重命名或者删除文件,是否能重命名和删除文件由目录权限决定
x 允许把文件当作程序一样执行,用脚本语言写的程序文件必须设置为可读;允许进入目录下
以二进制和八进制方式表示文件模式:
八进制 二进制 文件模式
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwx
chmod 600 foo.txt:将foo.txt文件设置为所有者具有读写权限,而取消组用户和其他所有用户的所有权限。即文件模式改为-rw-------
chmod命令符号表示法:
u user的简写,表示文件或目录的所有者
g 文件所属群组
o others的简写,表示其他所有用户
a all的简写,是'u','g'和'o'三者的组合
chmod命令符号表示法实例:
u+x 为文件所有者添加可执行权限
u-x 删除文件所有者的可执行权限
+x 为文件所有者、所属群组和其他所有用户添加可执行权限,等价于a+x
o-rw 删除其他所有用户的读写权限
go=rw 设置所属群组和其他所有用户具有读写权限,如果其已具有可执行权限,则删除其可执行权限
u+x, go=rw 为文件所有者添加可执行权限,同时设置所属群组和其他所有用户具有读权限和可执行权限
umask: 显示默认权限的掩码值(八进制,默认为0002)
umask 0000: 将默认权限的掩码值设置为0000
掩码值0002与默认权限对比:
原始文件模式 --- rw- rw- rw-
掩码 000 000 000 010
结果 --- rw- rw- r--
su [-[l]] [user]: 用来以另一个用户的身份启动shell
su -: 以超级用户的身份启动shell
sudo backup_script: 运行超级用户下的backup_script程序,而不需要输入超级用户密码
sudo -l: 查看sudo命令可以授予哪些权限
chown命令参数实例:
参数 结果
bob 把文件所有者从当前所有者更改为用户bob
bob:users 把文件所有者从当前所有者更改为用户bob,并把文件所属群组更改为users组
:admins 把文件所属群组更改为admins组,文件所有者不变
bob: 把文件所有者从当前所有者更改为用户bob,并把文件所属群组更改为用户bob登录系统时所属的组
sudo chown tony: ~tony/myfile.txt: 把文件myfile.txt的所有者改为tony,并把文件所属群组改为tony登录系统时所属群组
passwd: 更改用户自己的密码
第10章 进程
ps: 显示当前所有进程的运行情况
top: 实时显示当前所有任务的资源占用情况
jobs: 列出所有活动作业的状态信息
bg: 设置在后台中运行作业
fg: 设置在前台中运行作业
kill: 发送信号给某个进程
killall: 杀死指定名字的进程
shutdown: 关机或者重启系统
ps: 输出和当前终端会话相关的进程信息
ps x: 显示所有进程
进程状态:
R 运行状态,程序正在运行或准备运行
S 睡眠状态,进程不在运行,而是在等待某事件发生,如键盘输入或收到网络报文
D 不可中断的睡眠状态,进程在等待I/O操作,如磁盘驱动
T 暂停状态,进程被指示停止(后续还可继续运行)
Z 无效或僵尸进程,子进程被终止,但是还没有被其父进程彻底释放掉
< 高优先级进程,进程可以被赋予更多的重要性,分配更多的CPU时间
N 低优先级进程,只有在其他更高优先级的进程使用完处理器后才能够获得使用处理器的时间
ps aux: 显示属于每个用户的进程信息
BSD模式下ps命令输出的列标题:
USER 用户ID
%CPU CPU使用百分比
%MEM 内存使用百分比
VSZ 虚拟耗用内存大小
RSS 实际使用的内存大小,进程使用的物理内存大小
START 进程开启时间
top信息中的字段:
行 字段 含义
1 top 程序名
14:59:20 当前时间
up 6:30 正常运行时间,系统已经运行6.5小时
2 users 有两个用户已登录
load average 负载均值指等待运行的进程数,第一个对应前60秒的均值,第二个对应前5分钟的均
值,第三个对应前15分钟的均值,小于1.0表示机器不忙
2 tasks 统计进程数及各个进程的状态信息
3 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: 显示物理RAM(随机存取内存)的使用情况
5 Swap: 显示交换空间(虚拟内存)的使用情况
xlogo: 运行xlogo程序
Ctrl-C键: 关闭xlogo程序
xlogo &: 在后台运行xlogo程序
jobs: 显示终端启动的所有作业
fg %1: 将作业编号为1的进程从后台返回到前台
Ctrl-Z键: 暂停xlogo程序
bg %1: 让作业编号为1的进程移到后台运行
kill 28401: 终止进程号(PID)为28401的进程
kill命令常用信号:
信号编号 信号名 含义
1 HUP 挂起信号
2 INT 中断信号,与Ctrl-C效果一样
9 KILL 杀死信号,KILL信号不会真正意义上发送到目标程序,而是内核立即终止该程序
15 TERM 终止信号,kill命令默认发送的信号类型,程序接受信号,然后终止
18 CONT 继续运行信号,恢复接受STOP信号暂停的进程
19 STOP 暂停信号,与KILL信号类似,不会被发送给目标进程
3 QUIT 退出信号
11 SEGV 段错误信号,如果程序非法使用了内存空间,即程序试图在没有写权限的空间执行写操作,那么系统将发送该信号
20 TSTP 终端暂停信号,在按下Ctrl-Z键时终端将发出该信号,与STOP信号不同,TSTP信号由程序接受,但程序可以选择忽略该信号
28 WINCH 窗口改变信号,当窗口改变大小时,系统将发送该信号
kill -1 13546: 向进程13546发送HUP信号,使进程挂起
kill -INT 13601: 向进程13601发送INT信号,使进程中断
kill -SIGINT 13608: 同上
kill -l: 显示kill命令完整的信号列表
killall xlogo: 终止多个xlogo进程
其他与进程相关的命令:
pstree: 以树状的模式输出进程列表,该模式显示了进程间的父/子关系
vmstat: 输出系统资源使用情况的快照,包括内存、交换空间和磁盘IO。若在命令后面加上间隔时间(以秒为单位),将按间隔时间动态更新内容,Ctrl-C可终止输出
xload: 用来绘制显示系统时间负载情况图形的一种图形化界面程序
tload: 类似于xload,但是图形是在终端上绘制,Ctrl-C终止输出
第二部分 配置与环境
第11章 环境
printenv: 打印部分或全部的环境信息
set: 设置shell选项
export: 将环境导出到随后要运行的程序中
alias: 为命令创建一个别名
printenv | less: 显示环境变量
printenv USER: 显示变量USER的值
set | less: 显示shell变量、环境变量以及任何已定义的shell函数
echo $HOME: 显示变量HOME的值
alias: 显示环境变量中的别名
环境变量:
DISPLAY 运行图形界面环境时界面的名称,通常为:O
EDITOR 用于文本编辑的程序名称
SHELL 本机shell名称
HOME 本机主目录的路径名
LANG 定义了本机语言的字符集和排序规则
OLD_PWD 先前的工作目录
PAGER 用于分页输出的程序名称
PATH 以冒号分割的一个目录列表,当用户输入一个可执行程序的名称时,会查找该目录列表
PS1 提示符字符串1
PWD 当前工作目录
TERM 终端类型的名称
TZ 用于指定本机所处的时区
USER 用户名
login shell的启动文件:
/etc/profile 适用于所有用户的全局配置脚本
~/.bash_profile 用户的个人启动文件,可扩展或重写全局配置脚本中的设置
~/.bash_login 若~/.bash_profile缺失,则bash尝试读取此脚本
~/.profile 若~/.bash_profile与~/.bash_login均缺失,则bash尝试读取此文件
non-login shell的启动文件:
/etc/bash.bashrc 适用于所有用户的全局配置脚本
~/.bashrc 用户的个人启动文件,可扩展或重写全局配置脚本中的设置
source .bashrc: 命令bash重新读取.bashrc文件
第12章 VI简介
vi: 启动vi
:q: 退出vi
:q!: 强制退出vi
vi foo.txt: 启动vi,并创建foo.txt文件
i键: 进入插入模式
esc键: 退出插入模式,返回命令模式
:w: 将文件写入硬盘
:wq:保存并退出vi
vi光标移动功能键:
L或右方向键 右移一位
H或左方向键 左移一位
J或下方向键 下移一位,5j下移5行
K或上方向键 上移一位
数字0 至本行开头
Shift-6(^) 至本行第一个非空字符
Shift-4($) 至本行末尾
W 至下一单词或标点的开头
Shift-W(W) 至下一单词的开头,忽略标点
B 至上一单词或标点的开头
Shift-B(B) 至上一单词的开头,忽略标点
Ctrl-F或Page Down 下翻一页
Ctrl-B或Page Up 上翻一页
number-Shift-G 至第number行,1G会移动到文件的第一行
Shift-G 至文件的最后一行
o键: 当前行的下方插入一行
O键: 当前行的上方插入一行
U键: 撤销最后一次操作
文本删除命令:
命令 删除内容
x 当前字符
3x 当前字符和之后2个字符
dd 当前行
5dd 当前行和之后4行
dW 当前字符到下一单词的起始
d$ 当前字符到当前行的末尾
d0 当前字符到当前行的起始
d^ 当前字符到当前行下一个非空字符
dG 当前行到文件末尾
d20G 当前行到文件第20行
复制命令:
命令 复制内容
yy 当前行
5yy 当前行和之后4行
yW 当前字符到下一单词的起始
y$ 当前字符到当前行的末尾
y0 当前字符到当前行的起始
y^ 当前字符到当前行下一个非空字符
yG 当前行到文件末尾
y20G 当前行到文件第20行
p键:将缓存中的内容粘贴到光标之后
P键:将缓存中的内容粘贴到光标之前
J键:将当前行与下一行合并
fa: 将光标移动到本行下一处出现字符a的地方,输入分号可重复上次搜索
/Line: 搜索整个文件中的Line字符串,输入n可重复上次搜索
:%s/Line/line/g: 将文件中的所有Line替换为line
全局搜索和替换语法范例:
组成 含义
: 分号用于启动一条ex命令
% 确定操作作用范围,%代表从文件第1行到最后1行,1,5代表从第1行到第5行,1,$代表从第1行到最后一行,若不指定范围则命令只在当前行生效
s 指定具体的操作-本次为替换
/Line/line 搜索和替换的文本
g 代表global,对搜索到的每一行的每一个实例进行替换,若g缺失,则只替换每一行第一个符合条件的实例
:%s/line/Line/gc: 命令末尾添加c,则在每次替换之前请求用户确认
替换确认功能键:
功能键 行为
y 执行替换
n 跳过此次替换
a 执行此次替换和之后的所有替换
q或ESC 停止替换
l 执行此次替换并退出替换
Ctrl-E, Ctrl-Y 分别是向下滚动和向上滚动,用于查看替换处的上下文
:n: vi打开多个文件时从一个文件切换到下一个文件,加!则为放弃保存强制切换
:N: vi打开多个文件时从一个文件切换到上一个文件,加!则为放弃保存强制切换
:e ls-output.txt: vi打开一个文件时,打开另一个文件
:r foo.txt: 将foo.txt中的内容插入到光标处
:w foo1.txt: 将文件另存为foo1.txt
第13章 定制提示符
echo $PS1: 显示定义提示符的环境变量PS1的值
shell提示符中使用的转义字符:
转义字符 含义
\a ASCII铃声
\d 当前日期,星期、月、日
\h 本地机器的主机名,不带域名
\H 完整的主机名
\j 当前shell会话中进行的任务数
\l 当前终端设备的名称
\n 换行符
\r 回车符
\s shell程序的名称
\t 当前时间(24小时制),时:分:秒
\T 当前时间(12小时制)
\@ 当前时间(12小时制),AM/PM
\A 当前时间(24小时制),时:分
\u 当前用户的用户名
\v shell的版本号
\V shell的版本号和发行号
\w 当前工作目录名
\W 当前工作目录名的最后一部分
\! 当前命令的历史编号
\# 当前shell会话中输入的命令数
\$ 在非管理员权限下输出"$",在管理员权限下输出"#"
\[ 标志一个或多个非打印字符序列的开始
\] 标志非打印字符序列的结束
设置文本颜色的转义字符:
字符序列 文本颜色
\033[0;30m 黑色
\033[0;31m 红色
\033[0;32m 绿色
\033[0;33m 棕色
\033[0;34m 蓝色
\033[0;35m 紫色
\033[0;36m 青色
\033[0;37m 淡灰色
\033[1;30m 深灰色
\033[1;31m 淡红色
\033[1;32m 淡绿色
\033[1;33m 黄色
\033[1;34m 淡蓝色
\033[1;35m 淡紫色
\033[1;36m 淡青色
\033[1;37m 白色
PS1="\[\033[0;31m\]<\u@\h \W>\$ ": 将提示符设为红色
PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\] ": 将提示符设为红色,之后字符设为原来颜色
设置背景颜色的转义字符:
字符序列 背景颜色
\033[0;40m 黑色
\033[0;41m 红色
\033[0;42m 绿色
\033[0;43m 棕色
\033[0;44m 蓝色
\033[0;45m 紫色
\033[0;46m 青色
\033[0;47m 淡灰色
PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] ": 将提示符背景设为红色,之后字符设为原来颜色
光标移动转义序列:
转义序列 动作
\033[1;1H 将光标移动至1行1列
\033[nA 将光标向上移动n行
\033[nB 将光标向下移动n行
\033[nC 将光标向前移动n个字符
\033[nD 将光标向后移动n个字符
\033[2J 清空屏幕并将光标移动至左上角(第0行第0列)
\033[K 清空当前光标位置到行末的内容
\033[s 存储当前光标为至
\033[u 恢复之前存储的光标位置
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ ": 提示符出现时,屏幕上方绘制出一个红色横条,横条中有黄色文本显示的时间
第三部分 常见任务和主要工具
第14章 软件包管理
yum search search_string: 包搜索命令
yum install package_name: 软件包安装命令,从库源中下载
rpm -i package_file: 低级软件包安装命令,从非库源中下载
yum erase package_name: 软件包移除命令
yum update: 软件包更新命令
rpm -U package_file: 低级软件包更新命令,从非库源中下载
rpm -qa: 软件包列表命令
rpm -q package_name: 判断软件包是否安装
yum info package_name: 显示已安装软件包的相关信息
rpm -qf file_name: 查看某具体文件是由哪个软件包安装得到
第15章 存储介质
mount: 挂载文件系统
unmount: 卸载文件系统
fdisk: 硬盘分区命令
fsck: 检查修复文件系统
fdformat: 格式化软盘
mkf: 创建文件系统
dd: 向设备直接写入面向块数据
genisoimage(mkisofs): 创建一个ISO9600映像文件
wodim(cdrecord): 向光存储介质写入数据
md5sum: 计算MD5校验码
mount: 显示已经挂载的文件系统列表
umount /dev/hdc: 卸载hdc设备
mount -t iso9660 /dev/hdc /mnt/cdrom: 将hdc设备挂载到/mnt/cdrom目录上
sudo fdisk /dev/sdb: 启动fdisk程序
p: 显示设备的分区表
l: 显示分区类型对照表
t: 改变分区ID
w: 向设别写入修改后的分区表
sudo mkfs -t ext3 /dev/sdb1: 在/dev/sdb1上创建ext3文件系统
sudo mkfs -t vfat /dev/sdb1: 在/dev/sdb1上创建fat32文件系统
sudo fsck /dev/sdb1: 检查/dev/sdb1设备
dd if=/dev/sdb of=/dev/sdc: 将/dev/sdb中的内容全部复制到/dev/sdc中
第16章 网络
ping: 向网络主机发送ICMP ECHO_REQUEST数据包
traceroute: 显示数据包到网络主机的路由路径
netstat: 显示网络连接、路由表、网络接口数据、伪连接以及多点传送成员信息
ftp: 文件传输命令
lftp: 改善后的文件传输命令
wget: 非交互式网络下载器
ssh: OpenSSH版的SSH客户端(远程系统登录命令)
scp: secure copy,远程复制文件命令
sftp: secure file transfer program,安全文件传输程序
pint linuxcommand.org:向linuxcommand.org发送IMCP ECHO_REQUEST数据包,Ctrl-C结束
traceroute slashdot.org: 显示文件传送到slashdot.org过程中所有停靠点的列表
netstat -ie: 查看系统中的网络接口信息
netstat -r: 查看网络之间传送数据包时网路的配置情况
ssh remote-sys: 连接远程主机remote-sys
ssh bob@remote-sys: 登录远程系统bob@remote-sys
ssh remote-sys 'ls *' > dirlist.txt: 在远程系统中执行ls命令后将结果输出到本地系统文件中
ssh remote-sys 'ls * > dirlist.txt': 在远程系统中执行ls命令后将结果输出到远程系统文件中
scp remote-sys:document.txt .: 从远程系统的home目录中将document.txt文件复制到本地系统的当前工作目录下
scp bob@remote-sys:document.txt .: 同上
第17章 文件搜索
locate: 通过文件名查找文件
find: 在文件系统目录框架中查找文件
xargs: 从标准输入中建立、执行命令行
touch: 更改文件的日期时间
stat: 显示文件或文件系统的状态
locate bin/zip: 查找以zip开头且目录名以bin/结尾的文件
locate zip | grep bin: 查找包含zip且包含目录中包含bin的文件
find ~: 列出主目录(~)下的文件列表清单
find ~ | wc -l: 计算主目录(~)下文件数
find ~ -type d | wc -l: 对目录进行搜索
find ~ -type f | wc -l: 对普通文件进行搜索
find支持搜索的文件类型:
b 块设备文件
c 字符设备文件
d 目录
f 普通文件
l 符号链接
find ~ -type f -name "*.JPG" -size +1M | wc -l: 查找所有符合*.JPG通配符格式以及大小超过1MB的普通文件
find支持的计量单位:
b 512字节的块(没有具体说明时的默认值)
c 字节
w 两个字节的字
k KB
M MB
G GB
find命令的test项参数:
test参数 描述
-cmin n 匹配n分钟前改变状态(内容或属性)的文件或目录,如果不到n分钟,就用-n,如果超过n分钟,就用+n
-cnewer file 匹配内容或属性的修改时间比文件file更晚的文件或目录
-ctime n 匹配系统中n*24小时前文件状态被改变的文件或目录
-empyt 匹配空文件或空目录
-group name 匹配属于name组的文件或目录,name为组名或ID号
-iname pattern 与-name test类似,只是不区分大小写
-inum n 匹配索引结点是n的文件
-mmin n 匹配n分钟前内容被修改的文件或目录
-mtime n 匹配n*24小时前只有内容被更改的文件或目录
-name pattern 匹配有特定通配符模式的文件或目录
-newer file 匹配内容的修改时间比file文件更近的文件或目录
-nouser 匹配不属于有效用户的文件或目录
-nogroup 匹配不属于有效组的文件或目录
-perm mode 查找访问权限与既定模式匹配的文件或目录,既定模式可以是八进制或符号形式
-regex pattern 把find输出的整个结果作为要匹配的对象
-samefile name 匹配与file文件用相同的inode号的文件
-size n 匹配n大小的文件
-user name 匹配属于name用户的文件和目录,name可以是用户名或ID号
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \): 查找访问权限不是0600的文件和访问权限不是0700的子目录
find命令的逻辑操作符:
-and 与操作,简写为-a
-or 或操作,简写为-o
-not 非操作,简写为-!
() 括号操作,需用引号引起来,或用反斜杠
预定义的find命令操作:
-delete 删除匹配文件
-ls 以标准格式输出其文件名以及所要求的其他信息
-print 将匹配的文件的全路径以标准形式输出,当没有指定任何操作时,该操作是默认操作
-quit 匹配成功便退出
find ~ -type f -name '*.BAK' -delete: 查找并删除以.BAK后缀的文件
find ~ -type f -name 'foo*' -ok ls -l '{}' ';': 查找并列出以foo开头的文件,ls执行前会询问用户是否执行
find ~ -type f -name 'foo*' -exec ls -l '{}' ';': 同上,只是不再询问用户
find ~ -type f -name 'foo*' -exec ls -l '{}' +: 每次找到匹配文件后执行一次ls命令
find ~ -type f -name 'foo*' -print | xargs ls -l: 同上
find ~ -iname '*.jpg' -print0 | xargs --null ls -l: 可以查找文件名中包含空格的文件,-print0产生以空字符作为参数之间分隔符的输出,--null接收以空字符为参数分隔符的输入
touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}: 设定或更新文件的修改时间,若文件不存在时,则创建一个空文件
stat playground/timestamp: 显示文件timestamp的所有信息和属性
find命令的option选项:
-depth 引导find程序处理目录前先处理目录内文件,当指定-delete操作时,该参数选项会自动调用
-maxdepth levels 当执行测试条件行为时,设置find程序陷入目录数的最大级别数
-mindepth levels 在应用测试条件和行为之前,设置find程序陷入目录数的最小级别数
-mount 引导find不去遍历挂载在其他文件系统上的目录
-noleaf 指导find程序不要基于“正在搜索类UNIX文件系统”的假设来优化它的搜索
第18章 归档和备份
gzip: 压缩和解压缩文件工具
bzip2: 块排序文件压缩工具
tar: 磁带归档工具
zip: 打包和压缩文件
rsync: 远程文件和目录的同步
gzip foo.txt: 压缩文件foo.txt
gunzip foo.txt: 解压缩文件foo.txt
gzip的选项:
-c 将输出内容写到标准输出端口并保持原有文件
-d 解压缩
-f 强制压缩,即便原文件的压缩版本已经存在
-h 显示有用信息
-l 列出所有压缩文件的压缩统计
-t 如果操作参数用有一个或多个目录,则递归压缩包含在目录中的文件
-r 检验压缩文件的完整性
-v 在压缩时显示详细信息
-number 设定压缩级别,1是速度最快,压缩比最小,9是速度最慢,压缩比最大,gzip默认的压缩级别是6
bzip2 foo.txt: 压缩文件foo.txt,牺牲速度以换取高质量
bunzip2 foo.txt.bz2: 解压缩文件foo.txt.bz2
tar命令的操作模式:
c 创建文件和/或目录列表的归档文件
x 从归档文件中提取文件
r 在归档文件末尾追加指定路径名
t 列出归档文件的内容
f 指定归档文件名
tar cf playground.tar playground: 将playground文件夹归档到playground.tar文件中
tar tf playground.tar: 列出playground.tar中的内容
tar tvf playground.tar: 列出playground.tar中的详细内容
tar xf ../playground.tar: 提取playground.tar中的内容到当前目录
tar xf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A': 提取playground2.tar中与通配符相符的文件到当前目录
find playground -name 'file-A' -exec tar rf playground.tar '{}' '+': 将查找到的文件添加到playground.tar中
find playground -name 'file-A' | tar cf - --files-from=- | gzip > playground.tgz: 将查找到的文件归档后压缩为playground.tgz
find playground -name 'file-A' | tar czf playground.tgz -T -: 同上
find playground -name 'file-A' | tar cjf playground.tbz -T -: 将查找到的文件归档后压缩为playground.tbz
zip -r playground.zip playground: 将playground中的内容压缩进playground.zip
unzip ../playground.zip: 将playground.zip中的内容提取到当前目录
unzip -l playground.zip playground/dir-087/file-Z: 将playground.zip中文件file-Z的内容列出
unzip ..playground.zip playground/dir-087/file-Z: 将playground.zip中文件file-Z提取到当前目录
find playground -name 'file-A' | zip -@ file-A.zip: 将查找到的文件压缩进file-A.zip中
ls -l /etc | zip ls-etc.zip -: 将/etc的列表信息压缩进ls-etc.zip中
unzip -p ls-etc.zip | less: 将ls-etc.zip中的内容提取到less中
rsync -av playground foo: 将playground同步到foo,-a递归归档并保留文件属性,-v详细输出
sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup: 将/etc /home /usr/local同步到/backup,--delete移除残留于备份设备中而源设备中已经不存在的文件
sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup: 将/etc /home /usr/local同步到远程系统remote-sys中的backup中,--rsh=ssh使用ssh命令作为其远程shell命令
第19章 正则表达式
ls /usr/bin | grep zip: 搜索/usr/bin中包含zip的所有文件
grep选项:
-i 忽略大小写,--ignore-case
-v 不匹配,输出不包含匹配项的所有行,--invert-match
-c 输出匹配项数目,--count
-l 输出匹配项文件名,--files-with-matches
-L 输出不匹配项文件名,--files-without-match
-n 在每个匹配行前面加上该行在文件内的行号, --line-number
-h 进行多文件搜索时,抑制文件名输出,--no-filename
grep bzip dirlist*.txt: 在多个文件dirlist*.txt中搜索包含bzip的行
grep -l bizp dirlist*.txt: 只列出包含bzip的文件的文件名
grep -L bizp dirlist*.txt: 只列出不包含匹配项的文件的文件名
grep -h '.zip' dirlist*.txt: 点字符用于匹配任意一个字符,即查找包含四个字符且后三个字符为zip的行
grep -h '^zip' dirlist*.txt: 插入符(^)表示只与开头内容进行比较
grep -h 'zip$' dirlist*.txt: 美元符号($)表示只与末尾内容进行比较
grep -h '^zip$' dirlist*.txt: 表示搜索行开头和末尾都有zip的行
grep -i '^..j.r$' /usr/share/dict/words: 查找长度为5、第3个字母是j以及末尾是r的所有单词
grep -h '[bg]zip' dirlist*.txt: 中括号用于匹配指定字符集中的单个字符,查找包含bzip或gzip的行
grep -h '[^bg]zip' dirlist*.txt: 中括号中的^表示否定,^之后的字符被当作不应该在指定位置出现的字符集,且^必须出现在中括号表达式的第一个字符位置,若果不是第一个则只是普通字符
grep -h '^[A-Z]' dirlist*.txt: 连字符(-)表示字符范围,即查找以大写字母开头的行
grep -h '^[A-Za-z0-9]' dirlist*.txt: 查找以字母和数字开头的行
grep -h '[-AZ]' dirlist*.txt: 查找包含连字符(-)、A或Z的行
POSIX字符类:
[:alnum:] 字母字符和数字字符
[:word:] 基本与[:alnum:]一样,只是多了一个下划线(_)字符
[:alpha:] 字母字符
[:blank:] 包括空格和制表符
[:cntrl:] ASCII控制码,包括ASCII字符0~31以及127
[:digit:] 数字0~9
[:graph:] 可见字符,在ASCII中,包括数字33~126
[:lower:] 小写字母
[:punct:] 标点符号字符
[:print:] 可打印字符,包括[:graph:]和空格字符
[:space:] 空白字符,如空格符、制表符、回车符、换行符、垂直制表符以及换页符
[:upper:] 大写字母
[:xdigit:] 用于表示十六进制的字符
echo "AAA" | grep -E 'AAA|BBB': 将echo的输出结果送至grep进行匹配搜索,"|"表示或,-E表示扩展正则表达式
grep -Eh '^(bz|gz|zip)' dirlist*.txt: 查找以bz、gz或zip开头的行
grep -Eh '^bz|gz|zip' dirlist*.txt: 查找以bz开头或包含gz或zip的行
?--匹配某元素0次或1次
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]$': 括号字符后面“?”表示括号字符只能匹配一次或零次,由于括号字符在ERE中通常是元字符,故在前面加上了反斜杠告诉shell此括号为文字字符
*--匹配某元素多次或零次
echo "This works." | grep -E '^[[:upper:]][[:upper:][:lower:] ]*\.': 匹配是否是一句话,即是否以大写字母开头而以句号结束,且中间内容是任意数目的大小写字母和空格
+--匹配某元素一次或多次
echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$': 匹配由单个空格分隔的一个或多个字符组成的行
{}--以指定次数匹配某元素
指定匹配次数:
{n} 前面的元素恰好出现n次则匹配
{n,m} 前面的元素出现的次数在n~m次之间则匹配
{n,} 前面的元素出现的次数超过n次则匹配
{,m} 前面的元素出现的次数不超过m次则匹配
echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$': 匹配电话号码形式,(nnn) nnn-nnnn和nnn nnn-nnnn
find . -regex '.*[^-_./0-9a-zA-Z].*': 查找包括[-_./0-9a-zA-Z]字符集之外字符的文件,.代表当前目录,-regex要求整个路径名与正则表达式的描述完全一样
locate --regex 'bin/(bz|gz|zip)': 查找路径名中包含bin/bz、bin/gz或bin/zip等字符串的文件,--regex表示支持扩展正则表达式
第20章 文本处理
cat: 连接文本并打印到标准输出
sort: 对文本行排序
uniq: 报告并省略重复行
cut: 从每一行中移除文本区域
paste: 合并文件文本行
join: 基于某个共享字段来联合两个文件的文本行
comm: 逐行比较两个已经排序好的文件
diff: 逐行比较文件
patch: 对原文件打补丁
tr: 转换或删除字符
sed: 用于过滤和转换文本的流编辑器
aspel: 交互式拼写检查器
cat > foo.txt: 向foo.txt中输入内容,Ctrl-D表示到达文件末尾
cat -A foo.txt: 显示foo.txt中的内容,-A显示非打印字符
cat -ns foo.txt: -n对行编号,-s禁止输出多个空白行
sort > foo.txt: 将标准输入的行进行排序后写入too.txt
sort file1.txt file2.txt file3.txt > final_sorted_list.txt: 将多个文件融合为一个排序好的文件
常见的sort选项:
选项 全局选项 描述
-b --ignore-leading-blanks 忽略行开头的空格,并且从第一个非空白字符开始排序
-f --ignore-case 排序时不区分字符的大小写
-n --numeric-sort 基于字符串的长度进行排序
-r --reverse 逆序排序
-k --key=field1[,field2] 对field1与field2之间的字符排序,而不是整个文本行
-m --merge 将每个输入参数当作已排好序的文件名,将多个文件合并为一个排好序的文件,而不执行额外的排序操作
-o --output=file 将排序结果输出到文件而不是标准输出
-t --field-separator=char 定义字段分隔符,默认情况下,字段是由空格或制表符分开的
du -s /usr/share/* | head: 列出一个以路径名顺序排列的列表,head只输出前10项
du -s /usr/share/* | sort -nr | head: 列出按数值逆序排列的列表
ls -l /usr/bin | sort -nr -k 5 | head: 根据每行第5个字符串进行逆序排序
sort --key=1,1 --key=2n distros.txt: --key=1,1指定对第一个字段排序,--key=2n指定第二个字段是排序的键值,并且按照数值排序,也可以使用-k 1 -k 2n格式
sort -k 3.7nbr -k 3.1nbr -k3.4nbr distros.txt: -k 3.7nbr从第3个字段的第7个字符开始排序,nr进行逆序数值排序,b删除第3个字段中开头的空格(行与行之间的空格字符数量不同,会影响排序结果)
sort -t ':' -k 7 /etc/passwd | head: -t指定':'字符作为字段分隔符
sort foo.txt | uniq: uniq只对已排好序的文本其作用,即只能移除相邻的重复行
常见uniq选项:
-c 输出重复行列表,并且重复行前面加上其出现的次数
-d 只输出重复行,而不包括单独行
-f n 忽略每行前n个字段,字段之间以空格分开
-i 行与行之间比较时忽略大小写
-s n 跳过(忽略)每行的前n个字符
-u 仅输出不重复的行,该选项是默认的
cut选项:
-c char_list 从文本行中提取char_list定义的部分内容
-f field_list 从文本行中提取field_list定义的一个或多个字段
-d delim_char 指定-f选项后,使用delim_list作为字段的分界符,默认时,字段必须以单个Tab制表符隔开
--complement 从文本中提取整行,除了那些由-c或-f指定的部分
cut -f 3 distros.txt: 提取第3个字段
cut -f 3 distros.txt | cut -c 7-10: 提取第3个字段中第7至第10个字符
cut -d ':' -f 1 /ect/passwd | head: 指定':'为分界符,提取每行的第1个字段
paste distros-dates.txt distros-versions.txt: 读取两个文件并将每个文件中提取的字段结合为一个整体的标准输出流
join distros-key-names.txt distros-key-vernums.txt | head: 文件必须以共有字段排好序,且按共有字段进行拼接
comm file1.txt file2.txt: 比较两个已排序好的文件,结果中第一列为第一个文件中独有的行,第二列为第二个文件中独有的行,第三列为两个文件共有的行
comm -12 file1.txt file2.txt: 省略结果中第1列和第2列的内容,-3则为省略结果中第3列的内容
diff file1.txt file2.txt: 检测两文件的并不同
diff改变命令:
r1ar2 将第二个文件中r2位置的行添加到第一个文件中的位置r1处
r1cr2 用第二个文件r2处的行替代第一个文件r1处的行
r1dr2 删除第一个文件r1处的行,并且删除的内容作为第二个文件r2行范围的内容
diff -c file1.txt file2.txt: 以上下文格式输出比较结果
diff上下文格式差异标识符:
(无) 该行表示上下文文本,表示两个文件共有的行
- 缺少的行,指此行内容只在第一个文件中出现,第二个文件中则没有
+ 多余的行,指此行内容只有第二个文件才有,第一个文件则没有
! 改变的行,两个版本的内容都后显示出来,每一个都各自出现在差异组中相应的部分
diff -u file1.txt file2.txt: 以统一格式输出比较结果
diff统一格式差异标识符:
(无) 两个文件共有的行
- 相对于第二个文件而言,第一个文件中没有的行
+ 第一个文件中多余的行
diff -Naur file1.txt file2.txt > patchfile.txt: 创建将file1.txt更新为file2.txt的diff文件
patch < patchfile.txt: 将file1.txt修补为file2.txt
tr--替换或删除字符
echo "lowercase letters" | tr a-z A-Z: 将小写字母替换为相应的大写字母
echo "lowercase letters" | tr [:lower:] A: 将小写字母全部替换为A
echo "secret text" | tr a-zA-Z n-za-mN-ZA-M: 将每个字母在字母表中向上移动13位,成为POT13编码
echo "frperg grkg" | tr a-zA-Z n-za-mN-ZA-M: 再向上移动13位则得到源码
echo "aaabbbccc" | tr -s ab: 删除重复出现的字符,且重复的字符必须时毗邻的
sed--用于文本过滤和转换的流编辑器
echo "front" | sed 's/front/back/': s指替换,front为被替换的字段,back为用于替换的字段
echo "front" | sed 's_front_back_': 任意字符均可作为分界符
echo "front" | sed '1s/front/back/': 1代表替换操作只对输入流的第一行起作用
sed的地址表示法:
n n是正整数,表示行号
$ 最后一行
/regexp/ 用POSIX基本正则表达式描述的行
addr1,addr2 行范围,表示从addr1至addr2的所有行
first~step 代表行号从first行开始,以step为间隔的所有行
addr1,+n addr1行以及其后的n行
addr! 除了addr行之外的所有行
sed -n '1,5p' distros.txt: 显示distros.txt文件中第1行到第5行的内容,-n为禁止自动打印,p命令为输出指定匹配行的内容
sed -n '/SUSE/p' distros.txt: 使用正则表达式/SUSE/,查找包含SUSE字符串的文本行
sed -n '/SUSE/!p' distros.txt: 显示那些与正则表达式不匹配的行
sed基本编辑指令:
= 输出当前行号
a 在当前行后附加文本
d 删除当前行
i 在当前行前输入文本
p 打印当前行
q 退出sed不再处理其他行,如果没有指定-n,就会输出当前行
s/regexp/replacement/ 将regexp的内容替换为replacement代表的内容
y/set1/set2 将字符集set1转换为字符集set2,sed要求两字符集等长
sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' distros.txt:将distros.txt中12/07/2006格式的字段改为2006-12-07格式,其中( { / 前要用\转义,\1\2\3分别代表之前用括号括起来的相应字段
echo "aaabbbccc" | sed 's/b/B/g': g代表对每行的所有匹配项进行替换
sed -f distros.sed distros.txt: -f表示运行命令脚本文件distros.sed
aspell check foo.txt: 检查文件的拼写错误
aspell -H check foo.txt: 检查HTML文件的拼写错误
第21章 格式化输出
nl: 对行进行标号
fold: 设定文本行长度
fmt: 简单的文本格式化工具
pr: 格式化打印文本
printf: 格式化并打印数据
grof: 文档格式化系统
nl distros.txt | head: 对行进行标号
nl标记:
\:\:\: 逻辑页页眉开头
\:\: 逻辑页正文开头
\: 逻辑页页脚开头
nl常用选项:
-b style 按照style格式对正文进行编号,style是下面类型中的一种
a 对每行编号
t 仅仅对非空白行编号,此选项是默认的
n 不对任何行进行编号
pregexp 只对与基本正则表达式匹配的行进行编号
-f style 以style的格式对页脚进行编号,默认选项是n(无)
-h style 以style的格式对标题进行编号,默认选项是n(无)
-i number 设置页编号的步进值为number,默认值是1
-n format 设置编号格式为format,format是下面类型中的一种
ln 左对齐,无缩进
rn 右对齐,无缩进,这是默认选项
rz 右对齐,有缩进
-p 在每个逻辑页的开始不再进行页编码重置
-s string 在每行行号后面增加string作为分隔符,默认情况下是一个简单的tab制表符
-v number 将每个逻辑页的第一个行号设置为number,默认是1
-w width 设置行号字段的宽度为width,默认值是6
sort -k 1,1 -k 2n distros.txt | sed -f distros-nl.sed | nl: 结合sort、sed和nl创建的一个增强版的报告
echo "The quick brown fox jumped over the lazy dog." | fold -w 12: 将文本行以指定的长度分解,-w指定宽度,默认是80个字符
echo "The quick brown fox jumped over the lazy dog." | fold -w 12 -s: -s指定在到达width字符数前最后一个有效空格处将原文本行断开
fmt -w 50 fmt-info.txt | head: 每行50字符格式化输出文本
fmt -cw 50 fmt-info.txt | head: -c保留段落前两行的缩进,随后的行都与第二行的缩进对齐
fmt选项:
-c 保留段落前两行的缩进,随后的行都与第二行的缩进对齐
-p string 只格式化以前缀字符串string开头的行,格式化后,string的内容仍然会作为每一个格式化行的前缀
-s "仅截断行"模式,只根据指定的列宽阶段行,而短行并不会与其他行结合
-u 字符间隔统一,字符之间间隔一个空格字符,句子之间间隔两个空格字符
-w width 格式化文本使每行不超过width个字符,默认值是75
fmt -w 50 -p '# ' fmt-code.txt: 格式化注释内容而不改变代码行
pr -l 15 -w 65 distros.txt: 格式化为一系列包含15行每行65个字符的页
printf "I formatted the string: %s \n" foo: 格式化输出,结果为I formatted the string: foo
常用pringf数据类型指定符:
D 将一个数字格式化为有符号的十进制表示形式
F 格式化数字并以浮点数的形式输出
O 将一个整数格式化为八进制格式的整数
s 格式化字符串
x 将一个整数格式化为十六进制的数,并且在使用字母时,用小写字母a~f表示
X 与x类似,只是字母用大写字母表示
% 打印文字符号"%"
printf转换规范的组成部分:
flags 总共5个flag
# 使用替代格式输出,o类输出结果以0开头,x和X类输出结果以0x和0X开头
0 用0填充输出,如000380
- 输出左对齐,默认情况下是右对齐
(空格) 为正数产生一个前导空格
+ 输出正数符号,默认情况只会输出负数的符号
width 一个数字,该数字指定了最小字段宽度
.precision 对于浮点数,指定小数点后的小数精确度,对于字符串转换,指定输出字符的个数
zcat /usr/share/man/man1/ls.1.gz | groff -mandoc -T ascii | head: 指定为mandoc“宏包”以及ASCII的输出
zcat /usr/share/man/man1/ls.1.gz | groff -mandoc | head: 未指定输出格式时,默认格式为PostScript
zcat /usr/share/man/man1/ls.1.gz | groff -mandoc > ~/Desktop/foo.ps: 将groff命令的输出结果存于foo.ps中
ps2pdf ~/Desktop/foo.ps ~/Desktop/foo.pdf: 将foo.ps转换成pdf格式
sort -k 1,1 -k 2n distros.txt | sed -f distros-tbl.sed | groff -t -T ascii 2> /dev/null: -t表示先用tbl预处理文本流,-T则输出ASCII格式的数据
第22章 打印
pr: 转换文本文件,从而进行打印操作
lpr: 打印文件
lp: 打印文件(System V)
a2ps: 格式化文件,以在PostScript打印机上打印
lpstat: 显示打印状态信息
lpq: 显示打印机队列状态
lprm: 取消打印任务
cancel: 取消打印任务(System V)
常见的pr选项:
+first[:last] 输出一个从first开始以last结束的页范围
-columns 将页的内容分成指定的columns列
-a 默认情况下,多列输出是垂直列出的,-a选项时内容是水平列出的
-d 隔行打印输出
-D format 用format格式来格式化页眉的显示日期
-f 使用换页符而不是回车符作为页与页之间的分隔符
-h header 在页眉的中间部分,使用header代替正在处理的文件名
-l length 将页的长度设为length,默认是66行
-n 对行进行编号
-o offset 创建一个有offset字符宽度的左页边距
-w width 设定页面宽度为width,默认是72个字符
-t 省略页眉页脚
ls /usr/bin | pr -3 -w 65 | head: 用pr将结果格式化为分页的、三列输出
ls /usr/bin | pr -3 | lpr: 将结果送至系统默认打印机
lpstat -a: 查看系统打印机列表
常用lpr选项:
-# number 打印number份副本
-p 每一页都将包括日期、时间、工作名称和页码的页眉用阴影打印出来
-P printer 指定用于打印输出的打印机名,如未指定则用系统默认打印机
-r 打印结束后删除文件
常见lp选项:
-d printer 设置目标打印机为printer,如果未指定则使用系统默认打印机
-n number 打印number份副本
-o landscape 将输出设置为横向
-o fitplot 根据页面大小缩放文件
-o scaling=number 设置文件缩放比为number,100时正好填充一页纸,如果小于100,则一页纸填不满,大于100则打印内容将打印在多个页面上
-o cpi=number 设置每英寸输出字符数位number,默认是10
-o lpi=number 设定每英寸输出指定number的行,默认是6
-o page-bottom=points
-o page-left=points
-o page-right=points 设置页边距
-o page-top=points
-P pages 指定页列表,如1,3,5,7-10
ls /usr/bin | pr -4 -w 90 -l 88 | lp -o page-left=36 -o cpi=12 -o lpi=8
ls /usr/bin | pr -3 -t | a2ps -o ~/Desktop/ls.ps -L 66: 将内容转换成PostScript文件,-t省略页眉页脚,-o输出到文件,-L每页66行
a2ps选项:
--center-title text 将中心页标题设为text
--columns number 将页分成n列,默认值是2
--footer text 设置页脚内容为text
--guess 给出输入文件的类型
--left-footer text 将左页脚内容设为text
--left-title text 将左页标题设为text
--line-numbers=interval 每interval的间隔对输出文件进行编号
--list=defaults 显示默认设置
--list=topic 显示topic设置
--pages range 打印range范围内的内容
--right-footer text 设置右页脚内容为text
--right-title text 设置右页标题内容为text
--rows number 将页面分成number行,默认值是1
-B 无页眉
-b text 设置页眉内容为text
-f size 使用size点的字体
-l number 设置每行有number个字符
-L number 设置每页有number行
-M name 使用名为name的纸张大小
-n number 打印n份副本
-o file 将输出内容送至file文件,file是1,则是标准输出
-P printer 使用printer打印机,若未指定则使用默认打印机
-R 纵向排版
-r 横向排版
-T number 设置制表符tab作为每一个数字字符的结尾
-u text 采用底图(水印)技术
常用lpstat选项:
-a [printer...] 显示printer打印机的打印队列状态
-d 显示系统默认打印机名
-p [printer...] 显示指定的printer状态
-r 显示打印服务器的状态
-s 显示状态汇总报告
-t 显示一个完整的状态报告
lpq: 查看打印机队列状态及其所包含的打印任务
cancel 603: 将603打印任务终止并移除
第23章 编译程序
make--维护程序的工具
tar xzf diction-1.11.tar.gz: 解压缩源代码
./configure: 分析生成环境,配置build程序,其中最重要的是Makefile文件
make: 使用Makefile文件编译程序
sudo make install: 在系统目录下安装最后生成的可执行程序,通常会安装在目录/usr/local/bin下
第四部分 编写shell脚本
第24章 编写第一个shell脚本
#!:称为shebang,告知操作系统,执行后面的脚本需使用的解释器的名字
chmod 755 hello_world: 设置可执行权限,755脚本每个人都可以执行,700脚本只有脚本所有人才能执行
./hello_world: 为了使脚本运行,必须显式指定脚本文件的路径
第25章 启动一个项目
变量的命名规则:
变量名应由字母、数字和下划线组成
变量名的第一个字符必须是字母或下划线
变量名中不允许空格和标点
here文档的工作方式:
command << token
text
token
其中,command是接受标准输入的命令名,token是用来指示嵌入文本结尾的字符串
第26章 自顶向下设计
第27章 流控制:IF分支语句
test expression或[ expression ]: test命令,执行各种检查和比较
x=5
if [ $x = 5 ]; then echo "equals 5"; else echo "does not equal 5"; fi: 判断是否等于5
测试文件的表达式:
表达式 成为true的条件
file1 -ed file2 file1和file2拥有相同的信息节点编号(这两个文件通过硬链接指向同一个文件)
file1 -nt file2 file1比file2新
file1 -ot file2 file1比file2旧
-b file file存在并且是一个块(设备)文件
-c file file存在并且是一个字符(设备)文件
-d file file存在并且是一个目录
-e file file存在
-f file file存在并且是一个普通文件
-g file file存在并且设置了组ID
-G file file存在并且属于有效组ID
-k file file存在并且有“粘滞位”属性
-L file file存在并且是一个符号链接
-O file file存在并且属于有效用户ID
-p file file存在并且是一个命名管道
-r file file存在并且可读(有效用户有可读权限)
-s file file存在并且其长度大于0
-S file file存在并且是一个网络套接字
-t fd fd是一个定向到终端/从终端定向的文件描述符,可以用来确定标准输入/输出错误是否被重定向
-u file file存在并且设置了setuid位
-w file file存在并且可写(有效用户拥有可写权限)
-x file file存在并且可执行(有效用户拥有执行/搜索权限)
测试字符串表达式:
表达式 成为true的条件
string string不为空
-n string string的长度大于0
-z string string的长度等于0
string1=string2 string1和string2相等
string1==string2 同上
string1!=string2 string1和string2不相等
string1>string2 在排序时,string1在string2之后
string1<string2 在排序时,string1在string2之前
整数判断操作:
表达式 成为true的条件
integer1 -eq integer2 integer1和integer2相等
integer1 -ne integer2 integer1和integer2不相等
integer1 -le integer2 integer1小于等于integer2
integer1 -lt integer2 integer1小于integer2
integer1 -ge integer2 integer1大于integer2
integer1 -gt integer2 integer1大于integer2
[[]]--符合命令,用于操作字符串
FILE=foo.bar
if [[ $FILE == foo.* ]]; then
> echo "$FILE matches pattern 'foo.*'"
> fi :符合命令[[]]包括“=~”字符串匹配与“==”模式匹配
(())--符合命令,用于操作整数,当算术计算的结果是非零值时,算术真值测试为true
逻辑操作符:
Operation test [[]]and(())
AND -a &&
OR -o ||
NOT ! !
mkdir temp && cd temp: 创建temp,成功后进入temp
[ -d temp ] || mkdir temp: 检测temp是否存在,只有检测失败时,才后创建这个目录
[ -d temp ] || exit 1: 检测temp是否存在,检测失败时,退出
第28章 读取键盘输入
read--从标准输入读取输入值,读取一行
read选项:
-a array 将输入值从索引为0的位置开始赋给array
-d delimiter 用字符串delimiter的第一个字符标志输入的结束,而不是新的一行的开始
-e 使用Readline处理输入,使用户使用命令行模式的相同方式编辑输入
-n num 从输入中读取num个字符,而不是一整行
-p prompt 使用prompt字符串提示用户进行输入
-r 原始模式,不在屏幕显示输入的字符
-t seconds 超时,在seconds秒后结束输入,若输入超时,read命令返回一个非0的退出状态
-u fd 从文件说明符fd读取输入,而不是从标准输入读取
第29章 流控制:WHILE和UNTIL循环
第30章 故障诊断
-x: 激活对脚本的追踪
export PS4='$LINENO + ': 修改追踪提示符包括脚本行号
set -x:激活追踪
set +x:解除追踪
第31章 流控制:case分支
case模式范例:
a) 若关键字为a则吻合
[[:alpha:]]) 若关键字为单个字母则吻合
???) 若关键字为三个字符则吻合
*.text) 若关键字以.txt结尾则吻合
*) 与任何关键字吻合
第32章 位置参数
$#: 命令行参数的数目
shift: 每执行一次shift命令,变量$2的值就赋给变量$1,$3的值就赋给$2,一次类推,变量$#的值同时减1
basename $0: 移除路径名的起始部分,只留下基本的文件名
特殊的位置参数:
$* 可扩展为从1开始的位置参数列,当包括在双引号内时,扩展为双引号引用的由全部位置参数构成的字符串
$@ 可扩展为从1开始的位置参数列,当包括在双引号内时,将每个位置参数扩展为双引号引用的单独单词
第33章 流控制:for循环
for i in {A..D}; do echo $i; done:传统shell形式
for (( i=0; i<5; i=i+1 )); do
echo $i
done :c语言形式
第34章 字符串和数字
a="foo"
echo "$a_file":无法扩展a,而是试图扩展a_file
echo "${a}_file":扩展a
${parameter:-word}:如果parameter为空,则扩展为word,如果parameter非空,则扩展为parameter
${parameter:=word}:如果parameter为空,则扩展为word,且word赋给parameter,如果parameter非空,则扩展为parameter
${parameter:?word}:如果parameter为空,则脚本出错退出,并且word输出到标准错误,如果parameter非空,则扩展为parameter
${parameter:+word}:如果parameter为空,则不进行扩展,若parameter非空,word将取代parameter,但parameter的值并不发生变化
${!prefix*}:返回当前以prefix开头的变量名
${!prefix@}:同上
${#parameter}:扩展为parameter字符串的长度,如果parameter是@或*,那么扩展为位置参数的个数
${parameter:offset}:扩展以offset字符开始,直到字符串末尾
${parameter:offset:length}:扩展以offset字符开始,包括length长度的字符串,如果offset的值为负,表示它从字符串末尾开始
${parameter#pattern}:除去parameter中匹配pattern的最短匹配
${parameter##pattern}:除去parameter中匹配pattern的最长匹配
${parameter%pattern}:同上#,只是从parameter中末尾除去文本
${parameter%%pattern}:同上##,从末尾除去
${parameter/pattern/string}: 第一个与pattern匹配的部分被替换为string
${parameter//patter/string}: 所有与pattern匹配的部分被替换为string
${parameter/#patter/string}:只有开头与pattern匹配时开头被替换为string
${parameter/%pattern/string}: 结尾部分与pattern匹配时结尾部分被替换为string
time longest_word2 dirlist_usr_bin.txt: 获取程序运行时间,real:实际运行时间,user:用户CPU时间,sys:系统CPU时间
不同的数字进制:
Number 默认十进制
0Number 八进制
0xNumber 十六进制
base#Number base进制
位操作:
~ 按位取反
<< 逐位左移
>> 逐位右移
& 按位与
| 按位或
^ 按位异或
bc -q
2+2
4
quit :使用bc命令进行计算
第35章 数组
declare -a a: 创建数组a
days=(Sun Mon Tue Wed Thu Wed Thu Fri Sat)
for i in ${animals[*]}; do echo $i; done: 访问数组中的每个元素,并对单词拆分
for i in ${animals[@]}; do echo $i; done: 同上
for i in "${animals[*]}; do echo $i; done: 将所有内容放在一个字中
for i in "${animals[@]}; do echo $i; done: 访问数组中的每个元素
a[100]=foo
echo ${#a[@]}: 显示数组长度,长度为1
echo ${#a[100]}: 显示元素a[100]的长度
foo=([2]=a [4]=b [6]=c)
for i in "${!foo[@]}"; do echo $i; done: 查找数组中使用的下标
foo+=(d e f): 在数组末尾增加元素
unset foo: 删除数组
unset 'foo[2]': 删除单个元素
foo=: 对数组赋空值时,删除第一个元素
foo=A: 对数组符值时,赋给的是第一个元素
第36章 其他命令
{ command1; command2;...}: 组命令,在当前shell中执行所有命令
(command1; command2;...): 子shell,在当前shell的子拷贝中执行命令
ls -l > output.txt
echo "Listing of foo.txt" >> output.txt
cat foo.txt >> output.txt
{ ls -l; echo "Listing of foo.txt"; cat foo.txt; } > output.txt: 将三条命令组合成一条命令
echo "foo" | read
echo $REPLY: REPLY变量中的内容总是为空,因为read是在子shell中执行的,子shell终止时,REPLY变量也消失了
<(list)与>(list):实现进程替换
read < <(echo "foo")
echo $REPLY: 将子shell的输出当作一个普通文件,用来重定向
echo <(echo "foo"):结果为/dev/fd/63,文件/dev/fd/63正为子shell提供输出
trap argument signal [signal..]:当检测到signal信号时,执行argument命令
wait $pid: 等待进程$pid结束
mkfifo pipe1: 创建命名管道pipe1
process1 > named_pipe
process2 < named_pipe :使用命名管道的方式