linux-checklist命令行

常用的linux命令行:

首先打开终端,可用 Ctrl+Alt+T 快捷键打开.

1.一些简单的命令

下面是一些常用的简单命令:

日期

date //显示当前时间
cal //显示日历(一般是一整个月)

磁盘

df //查看磁盘剩余空间
free  //显示空闲内存数量

结束终端

exit

幕后控制台

幕后控制台是和终端仿真器环境相同,不过外表不太美观,在不打开终端的情况下,也可以调用幕后

控制台.幕后控制台一共有6个,可以分别用下列命令打开:

Ctrl+Alt+F1
Ctrl+Alt+F2
Ctrl+Alt+F3
Ctrl+Alt+F4
Ctrl+Alt+F5
Ctrl+Alt+F6

2.文件系统的跳转

主要命令:

pwd        //打印输出当前工作目录
cd         //更改目录
ls         //列出目录里所包含的内容

下面对这些命令详细介绍:

2.1 pwd 和 ls 命令

pwd 和 ls 命令比较直观,只需要注意 ls 命令后面可以跟有一些参数,用以控制输出的格式和内容,具体如下表

ls -options //统一格式

ls -a       //输出所有文件,包括隐藏文件
ls -d       //目录本身的信息
ls -F       //在每个名字后加上指示符,用以区分目录和文件,若是目录,则加‘/’
ls -h       //以长格式列出时,以人们可读格式输出,例如文件大小不能以字节数显示
ls -l       //以长格式显示结果
ls -r       //以相反的顺序来显示结果,不加 -r 选项,默认按照字母升序排列
ls -S       //输出结果以文件大小来排序
ls -t       //按照修改时间排序

2.2 cd 命令

相比之下,cd 命令后跟两种路径表示法:

绝对路径

绝对路径开始于根目录,以 ‘/’ 开头表示,例如:

cd /usr/bin  //进入主目录下的 usr 目录中的 bin 目录

上面的是绝对路径表示法,下面介绍相对路径表示法:

相对路径

相对路径主要注意两个,父目录和子目录

cd ..        //进入到当前目录的上一级目录,即父目录中去
cd ./dir     //进入到当前目录的子目录 dir
cd dir       //进入到当前目录的子目录 dir

小提示:如果觉得每次输入长长的文件名和目录名很麻烦,你要记住Linux对你很贴心,所以提供了自动补全功能,输入开头几个字母,按下Tab键,即可自动补全文件名,但是要注意,Tab键只能补全唯一的名字,如果有多个文件名与开头几个字母匹配,则无法自动补全.

其它常用的 cd 命令:

cd             //切换到主目录下,即用户家目录
cd -           //切换到上一个工作目录
cd ~user_name  //切换到用户名为 user_name 的家目录下

3. 操作系统有关的命令行

file        //确定文件类型
less        //浏览文件内容

3.1 file 命令

file filename 会显示出文件内容的简单描述。如下

3.2 less 命令

less 命令用以浏览文本文件内容,用法如下:

less filename
less /etc/filename

less 程序在浏览时常用到的命令如下:

PageUp or b        //向上翻一页
PageDown or space  //向下翻一页
Up Arrow           //向上一行
Down Arrow         //向下一行
G                  //移动到最后一行
1G or g            //移动到开头一行
/characters        //向前查找制定字符串
n                  //向前查找下一个出现的字符串,与 /characters 命令配合使用
q                  //推出 less 阅览界面,回到终端

4. 文件和目录相关操作

主要命令:

cp                  //复制文件和目录
mv                  //移动or重命名文件和目录
mkdir               //创建目录
rm                  //删除文件和目录
ln                  //创建硬链接和符号链接

4.1 通配符

首先介绍通配符,相当于对文件(夹)名的模糊匹配.

通配符           意义

*               匹配任意多个字符(包括零个或一个)
?               匹配任意一个字符(不包括零个)
[characters]    匹配任意一个属于字符集中的字符
[!characters]   匹配任意一个不属于字符集中的字符
[[:class:]]     匹配任意一个属于制定字符类中的字符

常用字符类       意义

[:alnum:]       匹配任意一个字母或者数字
[:alpha:]       匹配任意一个字母
[:digit:]       匹配任意一个数字
[:lower:]       匹配任意一个小写字母
[:upper:]       匹配任意一个大写字母

匹配模式         匹配对象

*               所有文件
g*              文件名以 “g” 开头的文件
b*.txt          以“b”开头,中间有另个或者任意多个字符,并且以“.txt”结尾的文件
Data???         以"Data"开头,其后紧跟3个字符的文件
[abc]*          文件名以"a","b",或"c"开头的文件
BACKUP.[0-9]    以"BACKUP"开头,并且紧跟一个数字的文件
[[:upper:]]*    以大写字母开头的文件
[![:digit:]]    不以数字开头的文件
*[[:lower:]123] 文件名以小写字母结尾,或以"1","2",或"3"结尾的文件

------------------------------------------------------------------------------*

4.2 mkdir 创建目录命令

mkdir directory

需要注意,可以同时创建多个目录:

mkdir dir1 dir2 dir3

4.3 cp 复制文件和目录

将item1复制到item2中去

cp item1 item2

也可以将多个目录或文件复制到同一个目录下:

cp item... directory

cp命令后面也常跟一些附加选项,用以控制命令的效果. 下面列出一些常见选项:

选项                意义

-a                 复制文件和目录,以及它们的属性,包括权限信息
-i                 重写已存在文件前,提示用户确认. 若不指定,默认重写
-r                 递归复制目录以及目录中的内容,如果要复制的时目录,则需要此选项
-u                 复制时仅复制目标目录中不存在的文件,或者更新已经存在的文件
-v                 显示详实的命令操作信息

4.4 mv 移动和重命名文件

mv的用法跟cp基本相同,但是mv操作之后,原来目录下的文件不再存在.

mv item1 item2

表示把文件或者目录"item1"移动或者重命名未"item2",此时item1则被删除,只剩下item2.

如要移动或者重命名多个条目,则可用如下命令:

mv item... directory

mv 与 cp 一样,也可以附加一些选项,常见选项如下:

选项                意义

-i                 重写已有文件之前,提示用户确认信息
-u                 只更新目标文件或文件夹中没有的内容
-v                 显示详实操作信息

4.5 rm 删除文件和目录

rm item

同上面操作命令一样,rm 命令也有基本相同的选项:

选项               意义

-i                删除文件前,提示用户确认信息
-r                递归删除文件,删除目录时必须指定此选项
-f                忽视不存在的文件,不显示提示信息
-v                显示详实操作信息

例子               意义

rm file1          默默删除文件
rm -i file1       删除文件之前提示用户确认信息
rm -r file1 dir1  删除文件file1和目录dir1 以及dir1中的内容.
rm -rf file1 dir1 同上,如果file1或者dir1不存在,rm仍会执行

温馨提示:用rm命令时,尤其注意通配符的使用,有可能会删除掉大量我们不想删除的文件

4.6 ln 命令创建链接

ln命令既可以创建硬链接也可以创建符号链接,用法如下:

ln item link		  //创建硬链接
ln -s item link		//创建符号链接

注意

硬链接无法关联其所在文件系统之外的文件,不与链接在同一分区,无法关联

硬链接无法关联一个目录

符号链接

相当于一个快捷方式

ls -s fun fun-sym           //fun-sym 链接到 fun
ls -s ../fun dir1/fun-sym   //dir1文件夹下的一个fun-sym链接到上一级目录中的fun文件
ls -s ../fun dir2/fun-sym

创建符号链接,既可以使用绝对路径,也可以使用相对路径。另外,符号链接也可以关联目录。

当对链接进行操作时,我们实际上时对链接所指向的对象进行操作。但rm命令除外

rm fun-sym
rm fun-hard

都是删除链接本身,而不会删除链接指向的对象

当我们删除链接指向的对象后,与对象相关联的链接随之损坏

5 命令

常用命令以及意义如下:

命令			   	意义

type         说明一个命令的属性
which        显示会执行那个可执行程序
man          显示命令手册
apropos      显示一系列合适的命令
info         显示命令info
whatis       显示一个命令的简介描述
alias        创建命令别名

5.1 type 命令显示命令的类型

type command

例如输入一些命令名测试如下:

type type
type ls

5.2 which 命令显示一个可执行程序的位置

which ls

注意,此命令只对可执行程序有效,不包括内部命令和命令别名

例如 cd 命令,是一个shell内部命令,用 which 命令查找时得不到正确的回应

要查看一个命令的属性,可以用上面的 type 命令,如果是内部命令,会提示

built-in

5.3 help 得到内部命令的帮助文档

用法如下:

help command

许多可执行程序也支持 --help 选项,用以显示命令的用法说明:

mkdir --help

5.4 man 显示程序手册页

用法:

man command

此命令在 less 阅读程序中显示命令的参考手册,分为及部分,各部分对应如下:

章节        内容

1         用户命令名
2         程序接口的内核系统调用
3         C库函数程序接口
4         特殊文件,比如设备节点和驱动程序
5         文件格式
6         游戏娱乐,如屏幕保护程序
7         其它方面
8         系统管理命令

可以用man命令制定显示章节内容,例如

man 5 passwd

5.5 apropos 显示适当的命令

apropos search_term

用以搜寻含有search_term的参考文档

man命令加上 “-k” 选项,也能完成此项工作

5.6 whatis 显示命令的简要说明

5.7 info 显示程序 info 信息

5.8 alias 定义命令别名

如果你觉得linux常用的命令行太长或者太难记,则可以用别名来替代,这样每次只需要输入别名

即可启动命令. 别名定义方法:

alias newName='command1; command2; command3'

注意 “newName” 和 “=” 之间是没有空格存在的.

下次我们想运行 command1,comman2,command3 时,即可直接输入 newName

若要删除别名,则只需输入如下命令:

unalias newName

需要注意的是,直接在命令行中定义的别名只是暂时的,如果关闭了终端,再次打开终端时,

别名就消失了,如要长期保持别名存在,需要在系统文件中定义.

6. I/O 重定向

I/O 重定向简单来说就是将改变输入/输出的方向,例如从标准输出变为输出到指定文件等.

常见命令如下:

命令            意义

cat            连接文件
sort           排序文本行
unique         省略重复行
grep           打印匹配行
wc             打印文件中的换行符,字和字节个数
head           输出文件第一部分
tail           输出文件中最后一部分

6.1 标准输入/输出、标准错误

Unix哲学中,最核心的一点就是一切皆是文件,标准输入/输出、标准错误都是文件.

通常情况下标准输出和标准错误都连接到屏幕,标准输入连接到键盘.

I/O 重定向可以将程序的运行结果信息保存到文件中,便于后续查看.

重定向标准输出

重定向标准输出到一个文件,可以使用 “>” 重定向符, 后跟文件名.

例如:

ls -l /usr/bin > ls-output.txt

将目录 /usr/bin 的列表信息输出到文件 ls-output.txt 中去.

但是要注意, 上面的重定向符只是重定向标准输出,而对标准错误则不起作用.

例如我们让 ls 后跟一个不存在的目录,让其输出错误信息:

ls -l /bin/usr > ls-output.txt

但是我们会在屏幕上看到一条提示目录不存在的错误信息, 细想一下,我们已经将输出重定向到

文件 ls-output.txt 中了,但错误信息还是输出到了屏幕上,而且当你打开文件 ls-output.txt

时,你会发现文件是空的. 这是因为标准错误和标准输出不同,ls 指令将错误信息输送到标准错误

而非标准输出,但是我们仅仅重定向了标准输出,而没有重定向标准错误,因此错误信息输出到屏幕

另外需要注意,重定向操作会重写文件, 原来文件中的内容会被抹去,相当于删除了原来的文件

如果想把重定向的输出结果追加到文件后面,可以使用 “>>” 顶相符,如下:

ls -l /usr/bin >> ls-output.txt

如果文件 ls-output.txt 不存在,则会创建此文件.

重定向标准错误

shell 中,没有专门的重定向标准错误操作符,可以用文件描述符来定义.

标准输入、标准输出、标准错误的文件描述符分别是 0, 1, 2, 重定向标准错误可以如下:

ls -l /bin/usr 2> ls-error.txt

文件描述符 “2” ,后面紧跟重定向标准输出,组合成重定向标准错误到文件 ls-error.txt 中.

重定向标准输出和标准错误到同一文件

有两种方法:

  1. 利用 2>&1 操作符

    ls -l /bin/usr > ls-output.txt 2>&1


需要十分注意重定向的顺序,标准错误的重定向必须只能出现在标准输出重定向之后

如果上面的命令改为:

ls -l /bin/usr 2>&1 ls-output.txt

则标准错误定向到屏幕而不是文件中

  1. 利用 &> 操作符

    ls -l /bin/usr &> ls-output.txt

错误信息丢弃不输出:

2>/dev/null

6.2 cat 连接文件

cat [files]

cat 后面跟文件时,会把多个文件拼合起来,就像它们是一个文件中的内容一样.

cat test_split/* > test

单独的 cat 命令会等待标准输入

cat

如果我们输入“I love Linux”,然后输入 Ctrl+d ,则此文本行重复出现. 下面命令行:

cat > test.txt

此命令会等待从标准输入读取数据,直到遇见 Ctrl+d ,然后将文本存入到 test.txt 中去.

重定向标准输入

cat < test.txt

“<” 操作符是重定向输入操作符,将标准输入源从键盘改到文件 test.txt.

6.3 管道线

一i个命令的标准输出可以作为另一个命令的标准输入

command1 | command2

例如: less 命令接受标准输入,可将 ls 输出结果作为less的标准输入:

ls -l /usr/bin | less

6.4 过滤器

多个命令放在一起组成管线的命令序列成为过滤器

ls /bin /usr/bin | sort | less

ls 命令的对于每一个目录的输出都是由有序列表组成,各自针对一个目录,经过sort之后,

该表输出数据产生一个有序列表.

6.5 uniq 忽略重复行

ls /bin /usr/bin | sort | uniq | less

输出的结果不含有重复行. 但是如果我们向看到重复的列表可在 uniq 之后加上选项 -d

ls /bin /usr/bin | sort | uniq -d | less

6.6 wc 打印行、字和字节数

wc ls-output.txt    #打印行数,字数,字节数
wc -l ls-output.txt #只打印行数

6.7 grep 打印匹配行

比如要找到文件名中包含单词“zip”的所有文件,可以用如下命令

grep zip
grep -i     #忽略大小写搜索
grep -v     #只打印不匹配的行

6.8 head / tail 打印文件开头/结尾部分

head 默认打印文件前十行,tail 默认打印文件后十行,也可添加 -n 选项来调整打印行数

head -n 5 ls-output.txt
tail -n 5 ls-output.txt

6.9 tee 从stdin读取数据,并同时输出到stdout和文件

ls /usr/bin | tee ls.txt | grep zip

上述命令均可应用在管道线中.

7. 键盘操作高级技巧

clear       #清屏
history     #显示历史列表

7.1 光标移动快捷键

按键          效果

Ctrl+a       移动光标到行首
Ctrl+e       移动光标到行尾
Ctrl+f       光标向右一个字符,相当于右箭头
Ctrl+b       光标向左一个字符,相当于左箭头
Alt+f        光标前移一个字
Alt+b        光标后移一个字
Ctrl+l       清空屏幕,相当于clear

7.2 文本修改快捷键

按键            效果

Ctrl+d         删除光标所在位置的字符
Ctrl+t         光标位置字符和
Alt+t          光标位置字和前面的字互换位置
Alt+l          光标位置到字尾的字符转成成小写字母
Alt+u          光标位置到字尾的字符转换成大写字母

7.3 剪切和粘贴文本

按键            效果

Ctrl+k         剪切从光标位置到行尾的文本
Ctrl+u         剪切从光标位置到行首的文本
Alt+d          剪切从光标位置到词尾的文本
Alt+Backspace  剪切从光标位置到词头的文本,若在一个单词词头,剪切前一个单词
Ctrl+y         粘贴文本到光标位置

需要注意的是,一些电脑上的一些Alt组合键可能不能出现上述控制效果

7.4 自动补全

按键            效果

Tab            自动补全
Alt+?          显示可能的自动补全列表,也可以按两次Tab键来实现
Alt+*          插入所有可能的自动补全

7.5 历史命令

history

默认显示最近500条历史命令.

常用的命令及意义如下:

命令                        意义

history | less             显示最近500条命令,输出到 less 程序
!88                        显示历史列表第88行内容
Ctrl+r                     递增搜索
Ctrl+j                     复制命令
Ctrl+p                     移动到上一历史命令,等同于上箭头
Ctrl+n                     移动到下一历史命令,等同于下箭头
Alt+<                      移动到历史列表开头
Alt+>                      移动到历史列表结尾,即当前命令行
Ctrl+r                     反向递增搜索,从当前命令行开始,向上递增搜索
Alt+p                      反向搜索,非递增顺序,输入要查找的字符串,Enter
Alt+n                      向前搜索,非递增顺序
Ctrl+o                     执行历史列表当前项,并移动到下一个

7.6 历史命令展开

命令                        意义

!!                         重复最后一次执行的命令,等同于上箭头
!n                         重复历史列表中第 n 行的命令
!string                    重复最近历史列表中,以这个字符串开头
!?string                   重复最近历史列表中,包含这个字符串的命令

8. 权限操作

命令                        意义

id                         显示用户身份号
chmod                      更改文件模式
umask                      设置默认的文件权限
su                         以另一个用户身份来运行shell(提高权限)
sudo                       以另一个用户的身份来执行命令(提高权限)
chown                      更改文件所有者
chgrp                      更改文件所有权

文件的权限包括 可读(r)、可写(w)、可执行(x).

8.1 chmod 改变用户对文件的访问权限

chmod命令使用符号表示法来完成命令:

影响对象+执行操作+权限类别

影响对象包括以下几种:

u                   user,文件或者目录所有者
g                   用户组
o                   others,其他所有的人
a                   all,u,g,o三者的联合

如果没有制定字符,则默认使用 a 选项.

执行操作有三种,添加(+),删除(-),指定(=,其它权限被删除)

权限类别有上面所说的 r,w,x 三种.

下面是一些组合例子

命令                    意义

u+x                    为文件所有者添加可执行权限
u-x                    删除文件所有者的可执行权限
+x                     为所有人添加可执行权限
o-rw                   除了文件所有者和用户组,删除其他所有人的读权限和写权限
go-rw                  给群组的主任和任意文件拥有者的人读写权限,并且删除执行权限
u+x,go=rw              给文件所有者可执行权限,并且给组合其他人读写权限

8.2 umask 设置掩码改变用户对文件的权限

umask 后加掩码值,可以设置用户对文件的访问权限。

掩码值是4位八进制数表示的,每一位都代表了一类使用者

掩码                      二进制数                  权限

0000                  000 000 000 000           -rw-rw-rw-
0002                  000 000 000 010           -rw-rw-r--

即:二进制中数字1出现的位置,相应的属性被删除.

8.3 更改用户身份

    命令                     作用

    su [-[1]] [user]        切换到另一个 user 用户
    su -                    切换到超级用户,切换之后,会提示输入密码并出现#提示符
    exit                    退出超级用户登陆
    su - 'command'          只对本条命令以超级用户执行

除了用 su 命令,用户还可以用 sudo 命令来允许一个普通用户以不同的身份来执行命令.

sudo 不要求使用超级用户密码, 用户可用自己的登录密码进行认证, sudo 所跟的命令不需要用‘’

包含起来,因为sudo命令不会启动一个shell.

8.4 chown 更改文件所有者和用户组

chown [owner] [:[group]] file...

例如:

参数                      结果

bob                      把文件所有者从当前属主改为用户bob
bob:users                把文件所有者噶为用户bob,文件用户组改为users
:admins                  把文件用户组改为admins,文件所有者不变

bob:                     文件所有者改为用户bob,文件用户组改为bob登陆时所属的用户组

8.5 更改用户密码

更改用户 user 的密码

passwd [user]

若要更改当前用户的密码,可直接输入 passwd,shell会提示输入旧密码和新密码


9. 进程

ps                    报告当前进程快照
top                   显示任务
jobs                  列出活跃的任务
bg                    把一个任务放到后台
fg                    把一个任务放到前台
kill                  给一个进程发送信号
killall               杀死指定名字的进程
shutdown              关机或者重启系统

9.1 ps 命令,查看进程

ps 可单独使用,也可后跟选项来构成特殊的进程查看指令

默认情况下,ps命令只列出与当前终端会话相关的进程,加上x选项,是告诉ps命令,展示所有进程

	ps aux

显示每个用户的进程详细信息

9.2 top 命令动态显示进程信息

	top

显示进程动态信息,默认情况下,每三分钟更新一次,top显示结果由系统概要和进程列表两大部分

组成,以CPU使用率排序,top程序可以接受一系列从键盘输入的命令,两个最常用的命令是h和q,

h显示程序的帮助屏幕, q为退出top程序

9.3 Ctrl+c 中断进程

	Ctrl+c

Ctrl+c 中断一个程序,注意,后台程序是不能采用此方法中断的.

9.4 bg 把进程放到后台执行

在输入命令启动程序时,可以在程序名称后面加上&符号,使得程序在后台执行,终端会返回提示

符,此时可用ps命令或者jobs命令查看进程信息

9.5 fg 进程返回到前台

fg %n

其中 %n 表示工作序号为 n 的进程,如果只有一个后台进程,则 %n 可省略.

将进程返回到前台之后,即可通过Ctrl+c来终止进程.

9.6 Ctrl+z 停止进程

停止进程不同于终止进程,停止进程只是将进程暂停,移动到后台进行等待.

Ctrl+z

进程暂停之后,可以用 fg 将进程移动到前台执行,也可以用 bg 将进程移动到后台执行

bg %n

同样,如果只有一个进程,%n 可以省略

9.7 kill 命令发送的信号

信号编号      信号名         含义

1            HUP           挂起
2            INT           中断
9            KILL          杀死(强制)
15           TERM          终止
18           CONT          继续
19           STOP          停止(暂停)

其它一些系统信号:

信号编号       信号名        含义

3             QUIT          退出
11            SEGV          段错误
20            TSTP          终端停止
28            WINCH         改变窗口大小

可以用 kill -l 来得到完整的信号列表.

9.8 killall 给多个进程发送信号

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

9.9 其它一些进程相关命令

命令                意义

pstree             输出树形进程列表
vmstat             输出系统资源使用快照,可加延时秒数(vmstat 5),Ctrl+c终止
xload              图形界面程序,画出系统负载图形
tload              在终端画出系统负载图形,使用Ctrl+c终止输出

10. Shell环境

printenv                打印部分或者所有的环境变量
set                     设置 shell 选项
export                  导出环境变量
alias                   设置命令别名

printenv | less         将环境变量输出到 less 程序中查看
printenv USER           打印变量名为 USER 的值

set | less              输出变量到 less 程序中,且变量按字母顺序排列

echo $HOME              查看 HOME 变量内容

如果一个变量既不能用set命令来显示,也不能用printenv来显示,那么这个变量是别名, 可用

不加参数的alias命令来查看

alias

10.1 shell中常见的变量

变量                    内容

DISPLAY                显示器的名字,通常是“:0”,表示登陆的第一个显示器
EDITOR                 文本编辑器的名字
SHELL                  shell程序名字
HOME                   用户家目录
LANG                   定义了字符集和语言编码方式
OLD_PWD                先前的工作目录
PAGER                  页输出程序的名字,一般为less程序
PATH                   目录列表,由冒号分开,用以命令搜索
PS1                    定义shell提示符内容
PWD                    当前工作目录
TERM                   终端类型名
TZ                     指定所在时区
USER                   用户名

10.2 常见的shell文件

文件                   内容

/etc/profile          应用于所有用户的全局配置脚本
~/.bash_profile       用户私人的启动文件
~/.bash_login         如果文件~/.bash_profile没有找到,则尝试读取此文件
~/.profile            如果~/.bash_profile和~/.bash_login都没找到,尝试读取此文件

/etc/bash.bashrc      应用于所有用户的全局配置文件
~/.bashrc             非登陆shell会话用户的私有启动文件

10.3 修改shell环境

例如,打开.bashrc文件,为保险起见,可创建.bashrc的文件副本.bashrc.bak.

用自己喜欢的编辑器打开并添加以下内容:

#change umask to make directory sharing easier
umask 0002

#ignore duplicates in command history and increases
#history size to 1000 lines

export HISTCONTROL=ignoredups
export HISTCONTROL=1000

#add some helpful aliases
alias ll='ls -l --color=auto'

shell环境修改之后,不会立即生效,还需关闭终端再打开,因为.bashrc文件只会在终端启动

时被读取. 如果想要强制bash重新读取修改,可使用如下命令:

source .bashrc

这样我们所做的修改就会体现在新的shell会话里,例如我们可以输入命令别名ll

ll

11. vi 文本编辑器

同许多程序一样,可直接从终端输入vi(或vim)启动vi(vim)

vi

vi有三种模式,命令模式,插入模式,观察者模式,下面是一些常见的命令及其含义

按键                    含义

vi                     启动vi编辑器
vi filename            打开文件,如果文件不存在,则创建文件
Esc                    退出命令模式
i                      切换到插入模式(进入vi界面时默认为命令模式)
:w                     将文本保存到文件
:q                     退出vi编辑器
:q!                    强制退出vi编辑器(放弃修改)
:wq                    将文本保存到文件并退出vi

11.1 移动光标

按键                    移动光标

l or 右箭头             向右移动一个字符
h or 左箭头             向左移动一个字符
j or 下箭头             向下移动一行
k or 上箭头             向上移动一行
0                       移动到当前行首
^                       移动到当前行的第一个非空字符
$                       移动到当前行尾
w                       移动到下一个单词或标点符号的开头
W                       移动到下一个单词的开头,忽略标点
b                       移动到上一个单词或者标点符号的开头
B                       移动到上一次单词的开头,忽略标点
Ctrl+f or PageDown      向下翻页
Ctrl+b or PageUp        向上翻页
numberG                 移动到第number行
G                       移动到文件末尾

除了G之外,其他有些命令也能在前面加上数字,表示希望重复此命令的次数,例如5j,表示希望

光标向下移动5行.

11.2 追加文本命令

11.3 新建一行

o                     在当前行下方打开一行
O                     在当前行上方打开一行

11.4 删除文本

命令                  删除的文本

x                    当前字符
3x                   当前算起向后3个字符
dd                   当前行
5dd                  当前行及随后4行文本
dW                   从光标位置开始到下一个单词的开头
d$                   从光标位置开始到当前行的行尾
d0                   从光标位置开始到当前行的行首
d^                   从光标位置开始到文本行的第一个非空字符
dG                   从当前行到文件末尾
d20G                 从当前行到第20行

u                    撤销上一步更改

11.5 剪切、复制和粘贴文本

上面d命令不仅删除文本,还能剪切文本,删除的内容暂存到剪切板,然后可以用p或P粘贴到光标前

或光标后. 复制命令用y,和d相似,下面是一些常见的组合用法:

命令                  复制内容

yy                   当前行
5yy                  当前行以及随后的4行
yW                   从当前光标位置到下一个单词的开头
y$                   从当前光标位置到当前行尾
y0                   从当前光标位置到行首
y^                   从当前光标位置到文本行的第一个分空字符
yG                   从当前光标位置到文件末尾
y20G                 从当前行到文件的第20行

复制命令:

p                    粘贴到当前行的下面
P                    粘贴到当前行的前面

11.6 连接行

J                    将后面一行和当前行连接起来

11.7 查找和替换

f                    查找一行,移动光标到下一个所指定的字符上
fa                   把光标定位到同一行中下一个出现的a字符上
/string              查找string字符串
n                    查找下一个匹配的项

要执行替换操作,可以用如下格式的命令:

:%s/Line/line/g

上面命令的含义是:

命令                含义

%                 指定要操作的行数范围,%指全文,可用1,5替代,指第1行到第5行
s                 指定操作,s指替换(查找与替代)
/Line/line        查找类型与替代文本
g                 全局,指对所有的匹配项都进行替换,若省略,则只替换第一个匹配项

11.8 编辑多个文件

可以用vi同时打开多个文件,命令形式如下:

vi file1 file2 file3...

编辑多个文件,涉及到各个文件之间的切换问题,vi可以使用命令来满足这一需求

:n                从这个文件转到下一个文件
:N                回到上一个文件

另外,为了使多个文件更容易管理,vi提供了:buffers命令来查看正在编辑的文件列表. 这时候

就可以使用:buffer命令加上缓冲区号码来切换文件

将一个文件插入到当前文件

过程:首先打开一个文件,移动光标到我们想要插入的地方,然后切换到命令模式,输入如下命令

:r insertFileName

即可将insertFileName文件的内容插入到当前位置.

复制某文件部分内容到当前文件

首先打开一个文件,移动光标到我们想要插入的地方,然后切换到命令模式,输入如下命令

:sp copyFileName

选中内容,y复制,Ctrl+W切换回原文件,p粘贴.

11.9 保存工作

:w

如果所编辑的文件是已经存在的,那我们在编辑完成之后输入 :w 命令,如果我们想将此文件

另存为不同名字的文件,那么我们可以输入命令 :w newName 即可,但是需要注意,在保存之后

我们编辑的文件仍然是原来的文件,而不是名为newName的文件;

如果所编辑的文件是不存在的,也就是文件还未被创建,那么在编辑完成之后输入 :w filename

命令,将当前文件保存为名为filename的文件.


12. 软件包管理

sudo apt-get install name                 从网上资源库安装名为name的软件
dpkg --install package_file               从软件包安装软件
sudo apt-get update;sudo apt-get upgrade  更新软件
sudo apt-get remove package_name          卸载软件
dpkg --install package_file               从软件包更新软件

dpkg --list                               列出安装的所有软件包
dpkg --status package_name                查看是否安装了某个软件
apt-cache show package_name               显示所安装软件包的信息
dpkg --search file_name                   查找安装了某个文件的软件包

13. 存储媒介

命令名                      作用

mount                       挂载一个文件系统
umount                      卸载一个文件系统
fsck                        检查和修复一个文件系统
fdisk                       分区表控制器
mkfs                        创建文件系统
fdformat                    格式化一张软盘
dd                          把面向块的数据直接写入设备
genisoimage(mkisofs)        创建一个ISO9660的镜像文件
wodim(cdrecord)             把数据写入光存储媒介
md5sum                      计算MD5检验码

13.1 挂载和卸载存储设备

执行不带参数的mount命令可查看当前挂载的文件系统


查找文件

locate                  通过名字查找文件
find                    在目录层次结构中搜索文件
xargs                   从标准输入生成执行命令行
touch                   更改文件时间
stat                    显示文件或者文件系统状态

locate 查找文件

locate bin/zip          输出包含 bin/zip 字符串的所有路径或者文件
locate zip | grep bin   将搜索到的包含zip字符串的路径管道到grep,匹配含有bin的选项

find 更复杂的文件查找命令

find ~                  输出家目录列表(~代表家目录,常用)
find ~ | wc -l          输出家目录列表,并管道进wc统计列表行数
find ~ -type d | wc -l  限制只搜索目录
find ~ -type f | wc -l  限制只搜索文件

文件类型                代表含义

b                       块设备文件
c                       字符设备文件
d                       目录
f                       普通文件
l                       符号链接

同时,我们也可以根据其他一些条件来限制搜索范围,例如下面的例子:

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

即表示我们希望有文件名以.JPG结尾和文件大小大于1M的文件

常被用来指定的测量单位有以下几种:

符号                    大小

b                       512字节块
c                       字节
w                       两个字节的字
k                       千字节(1024个字节单位)
M                       兆字节(1048576个字节单位)
G                       千兆字节(1073741824个字节单位)

find命令还有其他大量不同的测试条件,下面列出了一些常见的测试条件

测试条件                描述

-cmin n                 匹配
-cnewer file            匹配文件和目录内容或属性最后修改时间早于file
-ctime n                匹配文件和目录最后修改时间在n小时之前
-empty                  匹配空文件和目录
-group name             匹配的文件和目录属于一个组,组可用组名或组ID表示
-iname pattern          类似于-name,但不区分大小写
-inum n                 匹配的文件的inode号是n
-mmin m                 匹配的文件被修改于n分钟之前
-mtime n                匹配的文件或目录的内容被修改于n小时之前
-name pattern           用指定的通配符模式匹配的文件和目录
-newer file             匹配的文件和目录的内容早于制定的文件
-nouser                 匹配的文件和目录不属于一个有效用户
-nogroup                匹配的文件和目录不属于一个有效组
-perm mode              匹配的文件和目录的全权限已经设置为指定的mode
-samefile name          类似于-inum测试条件
-size n                 匹配大小为n的文件
-type c                 匹配文件类型是c的文件
-user name              匹配的文件或目录属于某个用户

更详细的列表可参见find命令手册

操作符

操作符                  描述

-and                    两边同时满足
-or                     只满足一个即可
-not                    不满足此条件的选项
()                      组合测试条件和操作符,控制逻辑优先级

观察如下命令:

find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

意即我们想查找权限不是0600的文件和权限不是0700的目录.

带有操作符的find查找命令通用格式如下:

( expression 1 ) -operator ( expression 2 )

需要注意的是,圆括号需要用转义符进行转义. 另外,-and命令是find默认的操作符,

通常情况下可以省略.

预定义的操作

操作                描述

-delete             删除当前匹配的文件
-ls                 对匹配的文件执行等同的 ls-dils命令
-print              把匹配文件的全路径名输送到标准输出,为默认操作
-quit               一旦找到匹配,退出

例如,如果要删除符合一定条件的文件,扩展名为“.BAK”,可使用如下命令:

find ~ -type f -name '*.BAK' -delete

需要注意,在执行删除操作之前一定要了解自己所要删除的文件,尽量防止误删

可用 -print命令代替-delete命令先查看所要删除的文件

用户定义行为

除了上述提到的预定义行为外,我们也可以在find后定制自己的命令,可通过

-exec command {} ;

的方式来对find搜索到的结果进行处理,例如可以使用rm命令来达到上述-delete

命令的效果:

find ~ -type f -name '*.BAK' -exec rm '{}' ';'

效果等同于上面的删除命令


归档和备份

gzip                压缩或者展开文件
bzip2               块排序文件压缩器

tar                 磁带打包工具
zip                 打包压缩文件

rsync               同步远端文件和目录

压缩文件

gzip & gunzip 压缩与解压缩命令

执行gzip压缩命令时,压缩文件会替代原来的文件,并以.gz作为文件后缀

gzip filename

可以在当前目录下得到filename.gz文件,而原来的文件则被替代.

再次运行gunzip命令可以得到原始文件,而压缩文件则被替代.

gunzip filename.gz

gzip命令有许多选项,常见选项如下:

选项                说明

-c                  把输出写入到标准输出,保留原始文件
-d                  解压缩,同gunzip
-f                  强制压缩,即使已经存在了压缩文件
-h                  显示用法信息,同--help
-l                  列出每个被压缩文件的压缩数据
-r                  递归压缩目录中的文件
-t                  测试压缩文件的完整性
-v                  显示压缩过程中的信息
-number             设置压缩指数,1(最快)到9(最慢)之间的整数

bzip2 & bunzip2 块排序压缩与解压缩

bzip程序用法与gzip基本相同,只是采用了不同的压缩算法,压缩后

的文件后缀不同,为.bz2

归档文件

tar

用法如下:

tar mode [options] pathname...

这里mode常见的有以下操作模式:

c                   为文件或目录列表创建归档文件
x                   抽取归档文件
r                   追加具体的路径到归档文件末尾
t                   列出归档文件的内容

例如:

首先创建一些文件夹和文件:

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

如上即可创建dir-001到dir-100的整整100个文件夹,且每个文件夹内都有

26个文件.
tar cf playground.tar playground

此命令创建了名为playground.tar的tar包,其中包含整个playground

的目录层次结果,模式c和选项f,用来指定tar包的名字,注意,

必须首先指定模式,然后才能指定其它选项

如果要查看归档内容,可以用以下命令:

tar tf playground.tar
tar tvf playground.tar

后一条指令可以显示更加详细的列表信息

抽取tar包到新位置

tar xf path/playground.tar

抽取playground.tar中的文件到当前目录下

需要注意的一点tar指令默认使用相对目录,如果在生成tar包时

原文件使用了绝对路径,则生成的tar包内包含所有的文件路径

例如:

tar cf playground2.tar ~/playground

原文件使用了绝对路径,会展开成/home/han/playground,

此时如果抽取文件playground2.tar, 如下:

tar xf playground2.tar
ls

可发现ls输出的文件列表里多出了一个home文件夹,而并不是我们

所期望的playground

从归档文件中抽取内容时,可以制定抽取的内容,例如:

tar xf archive.tar pathname

tar xf playground2.tar --wildcards 'home/han/playground/dir-\*/file-A'

上述第二条指令表示从playground2.tar中抽取file-A文件

另外,tar命令经常与find命令同时使用,从而归档搜索到的文件

find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'

唤醒带有追加模式的tar命令

find playground -name 'file-A' | tar cf - --files-from=- | gzip > playground

在上面这个例子里面,find产生匹配文件列表,管道进入tar命令,指定"-"为

标准输入或输出,–files-from选项使得tar命令从一个文件而不是命令行来

读取其路径名列表,这里指定了文件为"-",也就是从标准输入输出来读取,

最后,tar命令生成的tar包管道到gzip命令生成playground.tgz文件

同步文件和目录

rsync options source destination

source和destination为以下选项之一:

本地文件或目录
一个远端文件或目录,以[user@]host:path的形式存在
一个远端服务器,由rsync://[user@]host[port]/path指定

注意source和destination之一必须为本地文件,rsync不支持远端到远端的复制

例如,同步playground目录和它在foo目录中相对应的副本

rsync -av playground foo

-a选项是递归和保护文件属性,-v选项是冗余输出

注意,rsync命令只会更新foo中没有的项目,如果两者已经相同,则不会有

复制更新


正则表达式

正则表达式是一种符号表示法,用来识别文本模式,与shell

匹配文件和路径的通配符比较相似

grep命令

grep命令前面已经学过,用于匹配特定字符串,用法如下:

grep string
ls /usr/bin | grep zip

表示列出位于目录/usr/bin中,文件名中包含zip的所有文件

grep的完整形式为

grep [options] regex [file...]

regex就是一个正则表达式,例如我们上面的zip,常见的option

选项如下:

选项                描述

-i                  忽略大小写
-v                  打印不匹配的项,即取反
-c                  打印匹配数量,而不是文本行本身
-l                  打印包含匹配项的文本名
-L                  打印不包含匹配项的文本名
-n                  在每个匹配行之前打印出其位于文件中的相应行号
-h                  应用于多文件搜索,不输出文件名

元字符和文本

正则表达式中的字符分为原义字符和元字符:

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

其它字符被认为是原义字符

. 任意字符

圆点元字符可以用来匹配任意字符,但是要注意,在此位置一定要有一个字符

例如下面表达式:

grep -h '.zip' file

表示在file文件中寻找包含正则表达式".zip"的文本行,需要注意的是,在

圆点所在的位置必须有字符存在,字符是任意的;因此,此正则表达式是不能

匹配到zip文件的,zip之前必须有其它字符存在

锚点

正则表达式中有两个锚点,一个是插入符号^,另一个是$;插入符号表示

开头匹配,$符号表示末尾匹配

grep -h '^zip' filelist
grep -h 'zip$' filelist

分别表示匹配以zip开头和结尾的文本

因此,可以推知,正则表达式’^$'表示匹配空行

利用正则表达式可以完成很多复杂的匹配,例如,如果我们想匹配一个

五个字母的单词,第三个字母是j,最后一个字母是r,则可用如下的

正则表达式:

grep -i '^..j.r$' dictionary

表示在dictionary文件中搜寻满足条件的单词

中括号表达式和字符类

[list]

中括号中的内容表示并列,表示一个集合,例如:

grep -h '[bg]zip' filelist

表示在filelist中匹配bzip或gzip的任意文件或目录

在中括号表达式中,元字符会失去特殊含义,会有两种情况出现:

"^"插入字符

插入字符放到中括号第一个位置,则插入字符变为否定字符

grep -h '[^bg]zip' filelist

表示在filelist中搜索不包含bzip和gzip的文件或者文件夹

“-” 连字符

连字符在中括号中表示范围,如下:

[a-z]

表示所有的小写字母

grep -h '^[A-Za-z0-9]' filelist

表示匹配任意以字母或者数字开头的文件或者文件夹

如果想要匹配连字符,只需将连字符放在表达式中的第一个

字符

grep -h '[-AZ]' filelist

表示匹配任意或以-开头,或以A开头,或以Z开头的文件名

POSIX标准字符集

字符集                  说明

[:alnum:]               字母数字字符
[:word:]                与上面相同,增加了下划线字符
[:alpha:]               字母字符
[:blank:]               包含空格和tab字符
[:cntrl:]               控制码
[:digit:]               数字0-9
[:graph:]               可视字符
[:lower:]               小写字母
[:punct:]               标点符号字符
[:print:]               可打印字符
[:space:]               空白字符,包括换行和回车,tab键等等
[:upper:]               大写字母
[:xdigit:]              十六进制数字字符

注意到上述字符集合与shell展开通配符基本相同

限定符

? 匹配零个或者一个元素

注意?表示前面的一个字符可以匹配或者不匹配,例如下面的例子

'^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'

表示可以匹配两种格式的数字:

(nnn) nnn-nnnn
nnn nnn-nnnn

当然,其实从正则表达式上来说,也可以匹配如下格式:

(nnn nnn-nnnn
nnn) nnn-nnnn

* 匹配零个或者多个元素

与?一样,*也用来表示一个可选字符,但是,*表示可以出现人一多次,而不是

仅仅一次. 例如下面匹配一句话,字符串开始于一个大写字母,然后包含任意多

个大写和小写的字母和空格,最后以句号结尾:

[[:upper:]][[:upper:][:lower:] ]*.

例如下面:

echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*.'

??? 但是经过实验也发现只要保证右端中括号数量正确,左端半中括号是多少

都无所谓,例如下面的指令也能输出正确的结果:

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

例如前面电话号的例子,可以改写为:

'^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$ '

find 结合正则表达式查找文件名

find . -regex '.*[^-\_./0-9a-zA-Z].*'

上面命令可以查找包含空格和其它潜在不规范字符的路径名

locate 查找文件

locate程序也支持正则表达式,基本的(–regexp)和扩展的(–regex)

通过将正则表达式与locate结合起来,我们可以快速执行许多操作:

locate --regex 'bin/(bz|gz|zip)'

表示搜索bin目录下的bz或gz或zip开头的目录

在less和vim中查找文本

less和vim查找文本的方法相同,按下/键,然后输入正则表达式即可

另外,vim支持基本的正则表达式,元字符集合为 ^ $ . [ ] * 其它的字

符都被认为是文本字符,因此如果要使用扩展正则表达式的元字符,要

注意字符的转义,例如搜索号码的例子,{}属于扩展正则表达式中的元

字符,在vim中需要转义:

/([0-9\{3\}]) [0-9]\{3\}-[0-9]\{4\}

注意这里的()没有像之前一样用反斜线转义,因为对于vim来说,其本来

就是文本字符,无需转义就可匹配, 而对扩展正则表达式来说,()是元

字符,需要转义成文本字符才能进行匹配.


文本处理

cat                 连接文件并且打印到标准输出
sort                给文本排序
uniq                报告或者省略重复行
cut                 从每行中删除文本区域
paste               合并文件文本行
join                基于某个共享字段来联合两个文件的文本行
comm                逐行比较两个有序的文件
diff                逐行比较文件
patch               给原始文件打补丁
tr                  翻译或者删除字符
sed                 用于删选和转换文本的流编辑器
aspell              交互式拼写检查器

直接用cat命令来创建简单的文件,以Ctrl+z来标志文件结尾

输入一句或者多句话,最后回车按下Ctrl+z结束,文件写入成功

保存成功之后可用cat命令查看foo.txt文件的内容,加上-A选项,

可查看所有字符,总体流程代码及输入输出如下:

han@han:~$ cat >foo.txt
    You are just a single dog.
^Z
[2]+  Stopped                 cat > foo.txt
han@han:~$ cat -A foo.txt
^IYou are just a single dog.$

可以看到开头多了一个^I符号,即为开头的Tab键,结尾多了一个

$符号,即为文件结尾符

cat命令有两个经常用到的选项

-n 用来给文本行添加行号

-s 用来禁止输出多个空白行

示例如下:

han@han:~$ cat > foo.txt
a



c
^Z
[1]+  Stopped                 cat > foo.txt
han@han:~$ cat -ns foo.txt
     1  a
     2
     3  c

可以看到,每行输出都有编号,且我们输入时多余的空白符在显示时被删除掉

sort 排序命令

sort命令可以对标准输入内容或者命令行中指定的一个或者多个文件进行

排序,然后把排序结果发送到标准输出,如下

han@han:~$ sort > foo.txt
c
b
a
han@han:~$ cat foo.txt
a
b
c

同时,sort,还可以接受多个文件作为参数,把多个文件合并成一个有序文件

sort file1.txt file2.txt > final_sorted_list.txt

sort程序也有一些选项,下面列出常见的几个:

选项                描述

-b                  默认整行排序,忽略开头空格
-f                  排序不区分大小写
-n                  基于字符串长度或者数字值排序
-r                  按相反顺序排序
-k                  对从field1到fiel2之间的字符排序
-m                  归并排序,把每个文件看成排好序的
-o                  把排好序的输出结果发送到文件
-t                  定义域分隔符,默认情况下为空格或制表符

下面给出几个示例进行讲解:
sort --key=1,1 --key=2n file

表示对于第一个字符(起点和终点都在第一个字段),按照字母排序,

对于第二个字段,按照数值排序; 下面再看一个例子:

sort -k 3.7nbr -k 3.1nbr -k 3.4nbr file

是指起始于第三个字段的第七个字符,到第三个字段的末尾结束;另外还

指定了第三个字段的第一个和第四个字符做反向数值排序

自定义分隔符

sort -t '/' -k 7 file

表示以斜线为分割符号,且按照第七个字段来排序

uniq 删除重复行

uniq经常和sort程序搭配使用,等于 sort -u,可以从排序结果中删除重复行
但是需要注意,uniq只会删除相邻的重复行!

同其他程序一样,uniq也有一些选项,常用的有:

选项                    说明

-c                      输出所有的重复行,每行开头显示重数
-d                      只输出重复行,而不是特有的文本行
-f n                    忽略每行开头的n个字段,字段由空格隔开
-i                      比较文本行时忽略大小写
-s n                    跳过每行开头的n个字符
-n                      只输出独有的文本行

例如与sort配合使用时:

sort foo.txt | uniq -c

删除重复行并在每行开头显示重复次数

切片和切块

cut 抽取文本

cut程序被用来从文本行中抽取文本,并把其输出到标准输出,可以接受

多个文件参数或者标准输入

一些常用的选项:

选项                    说明

-c charlist             从文本行中抽取charlist定义的文本
-f fieldlist            从文本行中抽取由fieldlist定义的字段
-d delimchar            当指定-f选项后,可使用delimchar做分隔符
-complement             抽取整个文本行,除了由-c和/或-f指定的文本

paste 添加文本到文件中

paste功能与cut功能相对应,可以认为是cut的反过程

join 往文件中添加列

其输入为多个具有一个或多个共同列元素的文件,输出为合并

重复列的合并文件,例如:

han@han:~$ head foo.txt
aan root
cheng master
zheng junior
han@han:~$ head foo2.txt
aan 111
cheng 222
zheng 333
han@han:~$ join foo2.txt foo.txt | head
aan 111 root
cheng 222 master
zheng 333 junior

这里需要注意的是,在实践过程中发现,如果共享数据域不在同一位置(开头),

则无法使用join进行合并

比较文本

comm 比较共同项

使用方法如下:

han@han:~$ head alpha1.txt
a
b
c
d
han@han:~$ head alpha2.txt
b
c
d
e
han@han:~$ comm alpha1.txt alpha2.txt
a
        b
        c
        d
   e

上面输出结果中,第一列表示第一个文件独有的,第二列表示第二个文件独有的

第三列表示两者共同有的元素

需要注意的是,在实践过程中发现,只有当两个比较的内容都是单列时,comm才

能发挥作用,否则如下例子:

han@han:~$ head foo.txt
aan
cheng
zheng
han@han:~$ head foo2.txt
aan 111
cheng 222
zheng 333
han@han:~$ comm foo.txt foo2.txt
aan
        aan 111
cheng
        cheng 222
zheng
        zheng 333

可以看出,第一个文件和第二个文件尽管有相同的内容,但是由于第二个文件

不是单列,comm认为其两列就是一列,因此文件一和文件二的内容完全不同

diff 比较文件差异

han@han:~$ diff alpha1.txt alpha2.txt
1d0
< a
4a4
> e

diff程序使用上下文搜索模式时(-c),可以看到如下输出:

han@han:~$ diff -c alpha1.txt alpha2.txt
*** alpha1.txt  2017-05-27 09:46:37.752125763 +0800
--- alpha2.txt  2017-05-27 09:47:22.813567092 +0800
***************
*** 1,4 ****
- a
  b
  c
  d
--- 1,4 ----
  b
  c
  d
+ e

可以看到上面结果中,多出来了很多信息,

***1,4****          第一个文件1-4行
---1,4----          第二个文件1-4行

此外还有其他的指示符 - + 等

diff输出常见的指示符如下:

blank               上下文显示行,不代表差异
-                   删除行,只在第一个文件中
+                   添加行,只在第二个文件中
!                   更改行,显示某个文本行的两个版本

同时,diff也有统一模式(-u),类似于上下文模式,但更简洁

han@han:~$ diff -u alpha1.txt alpha2.txt
--- alpha1.txt  2017-05-27 09:46:37.752125763 +0800
+++ alpha2.txt  2017-05-27 09:47:22.813567092 +0800
@@ -1,4 +1,4 @@
-a
 b
 c
 d
+e

统一模式下的开头字符意义如下:

空格                两个文件都包含这一行,相同
-                   在第一个文件中删除此行
+                   添加这一行到第一个文件中

patch

patch程序常和diff配合使用,用来合并修改,例如:

han@han:~$ diff -Naur alpha1.txt alpha2.txt > diff_file
han@han:~$ cat diff_file
--- alpha1.txt  2017-05-27 09:46:37.752125763 +0800
+++ alpha2.txt  2017-05-27 09:47:22.813567092 +0800
@@ -1,4 +1,4 @@
-a
 b
 c
 d
+e
han@han:~$ patch < diff_file
patching file alpha1.txt
han@han:~$ cat alpha1.txt
b
c
d
e

从输出结果可以看出,我们在文件alpha2.txt中所做的修改应用到了

alpha1.txt中,从而使得,alpha1.txt与新文件alpha2.txt相同

tr 更改字符

例如:

han@han:~$ echo "lowercase letters" | tr a-z A-Z
LOWERCASE LETTERS

当然,也有可能这样转换:

han@han:~$ echo "lowercase letters" | tr [:lower:] A
AAAAAAAAA AAAAAAA

tr命令可以跟选项-d表示删除特定字符进行转换,如下:

tr -d '\r' < old-file > new-file

表示将old-file中的换行符\r删掉,将转换的内容保存到新文件new-file

中去.

sed 流编辑器

sed命令类似于查找替换,将输入文件中的字段替换为另一个字符段

han@han:~$ echo "front" | sed 's/front/back/'
back

可以看到sed将front替换成了back并输出

默认情况下,sed对文件中所有的文件行进行操作,我们也可以指定行号,对

其中一行进行操作:

han@han:~$ echo "front" | sed '1s/front/back/'
back
han@han:~$ echo "front" | sed '2s/front/back/'
front

在第一个命令中,我们在s前指定对第一行进行操作,实际上,我们的输入只有

一行,因此可以看到操作的结果,将front替换成back输出

在第二个命令中,我们制定操作第二行,然而我们的输入只有一行,故操作失败

输出的仍然是front

常见的指定文本行地址如下

地址                说明

n                  行号,n为整数
$                  最后一行
/regexp/           匹配基本正则表达式的行
addr1,addr2        从addr1到addr2范围内的文本行
first~step         匹配由数字first代表的文本行,然后间隔step处的文本行
addr1,+n           匹配地址addr1和随后的n个文本行
addr!              匹配除了addr外的所有文本行

sed除了上面的s查找替换模式,还有打印模式p,还有其它的编辑命令:

命令                     说明

=                       输出当前号
a                       在当前行之后追加文本
d                       删除当前行
i                       在当前行之前插入文本
p                       打印当前行,默认只打印一行
q                       退出sed
s/regexp/replacement    
y/set1/set2             执行字符转写操作,需要两个字符有相同长度

注意

sed命令默认只能替换第一个匹配项,如果有两个或以上的匹配项,则后面的忽略

使用-g选项可以使sed对文本行执行全范围查找替代,

han@han:~$ echo "front-front" | sed '1s/front/back/'
back-front
han@han:~$ echo "front-front" | sed '1s/front/back/g'
back-back

aspell 拼写检查器

基本用法如下:

aspell check textfile

此命令会输出textfile文件中拼写可以的单词,并给出可能的替换选项


格式化输出

nl              添加行号
fold            限制文件列宽
pr              让文本为打印做好准备
fmt             一个简单的文本格式转换器
printf          格式化数据并打印出来
groff           一个文件格式系统

简单的格式化工具

nl 添加行号

用来给文件添加行号,类似于cat -n

han@han:~$ nl alpha1.txt
     1  b
     2  c
     3  d
     4  e

nl可以附加一些选项

选项              含义

-b style          把body按被要求方式数行,有  
                  a(所有行),t(非空行),n(无),pregexp(正则表达式)
-f style          将footer按被要求设置数,默认无
-h style          将header按被要求设置数,默认是
-i number         将页面增加量设置为数字,默认一
-n format         格式,ln(左偏无前导零),rn(右偏无前导零),rz(右偏有零)
-p                不在没有逻辑页面的开始重设页面数
-s string         在每行的末尾加字符作分隔符号,默认为tab
-v number         将每个逻辑页面的第一行设置成数字,默认是一
-w width          设置行宽,默认是六

打印

pr              转换需要打印的文本文件
lpr             打印文件
lp              打印文件(System V)
a2ps            为PostScript打印机格式化文件
lpstat          显示打印机状态信息
lpq             显示打印机队列状态
lprm            取消打印任务
cancel          取消打印任务(System V)

7. shell 简介

你可能感兴趣的:(linux,前端,运维)