Linux常用命令整理

Linux命令总结,涵盖了90%+常用命令(sed和awk见另外两篇文章),进行了分类整理,便于记忆,但仅仅列出了命令的常用选项,而不是跟手册一样罗列全部选项。linux命令主要还是靠平时应用来练习,推荐安装ubuntu单系统(可以先用虚拟机熟悉系统配置,但虚拟机各种不方便,容易被搁置)来强迫自己学习,熟能生巧。

系统相关命令

终端

快捷键:Ctrl+Alt+T

终端中快捷复制粘贴:在终端中双击或拖动选中文本,即将内容存放到了粘贴板,按鼠标中间粘贴到当前光标处。

date

date命令是显示或设置系统时间与日期。

用法示例:

1
date +"%Y-%m-%d %H:%M:%S"

cal

显示日历信息

df

显示剩余磁盘空间

1
df -h       #以易读形式显示空间大小

du

显示当前目录大小,-s选项不递归显示

1
du -sh ~/*  #显示用户目录下各子目录及文件大小

file

查看文件类型,“一切皆文件”。

free

查看内存使用情况。

目录跳转

pwd

显示当前工作路径

cd

切换工作目录

1
cd [dirName]

特殊用法:

cd 进入用户主目录;

cd ~ 进入用户主目录;

cd - 返回进入此目录之前所在的目录;

cd .. 返回上级目录(若当前目录为“/“,则执行完后还在“/“;”..”为上级目录的意思);

ls

显示目录下的子目录或文件信息

-l 显示详细信息,等价于ll

-t 按修改时间排序

-r 反序

-S 按文件大小排序

-h 以 可读形式显示大小

文件和目录操作

通配符

形式 描述
* 任意多个字符
? 任意一个字符
[chars] 字符集中任意一个,eg:[abc]
[!chars] 非字符集中任意一个
[[:alnum:]] 任意一个字母或数字
[[:alpha:]] 任意一个字母
[[:digit:]] 任意一个数字
[[:upper:]] 任意一个大写字母
[[:lower:]] 任意一个小写字母

mkdir

创建目录,可一次建多个

cp

复制命令

1
2
cp item1 item2
cp item... directoy #目标是目录时,目录必须已存在

-a 连同属性和权限信息一并复制

-i 交互式,询问是否重写,不带默认重写

-r 递归目录及子目录

-u 仅复制目标不存在或内容比目标新的文件

-v 显示详细信息

mv

移动或重命名,同样有-i,-u,-v选项

1
2
mv item1 item2
mv item... directoy

目标是文件且存在时,会重写

目标是目录时,若不存在,会创建目录并移动;若存在,直接移动到该目录。

rm

删除命令,用之前手要抖一下。同样有-i,-r,-v选项,-f选项会强制删除。

执行rm命令,尤其带通配符时,先用ls命令测试!

ln

创建链接。

硬链接:硬链接是有着相同 inode 号仅文件名不同的文件。

默认每个文件都有一个硬链接用来命名,删除硬链接互不影响,跟源文件大小一样。

硬链接不能关联不在同一个磁盘分区的文件,不能关联目录。

1
ln file link

软链接(符号链接):存放的内容是原文件的路径名的指向。

文件类型为l,使用起来跟操作本身几乎一样。但删除软链接不会删除原文件;删除原文件,其软链接会变为坏链接。

1
ln -s item link

locate

按文件名查找文件位置

find

在指定目录下查找

1
find dir [option]

-type 类型

-name 名称

-size +1M #大小

-mtime n #最后 修改时间在n×24小时前

xargs

从标准输入构建参数表,也可以将单行或多行文本输入转换为其他格式,示例

1
2
3
4
5
cat test.txt | xargs	#单行输出
cat test.txt | xargs -n3 #多行输出每行3个参数
echo "nameXnameXnameXname" | xargs -dX #指定分隔符为X
ls *.jpg | xargs -n1 -I {} cp {} /data/images #xargs的一个选项-I,使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz #构建tar命令的参数表

命令相关

命令类型

命令可以是下面四种形式之一:

  1. 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。
  2. 是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,cd 命令,就是一个 shell 内部命令。
  3. 是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。
  4. 是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。

type

显示命令类型

which

显示可执行程序的位置

whereis

包含命令的目录

whatis

命令的简要描述信息

help

shell内部命令文档,等价于–help

man

可执行程序的文档

alias

给命令设置别名,方便再次使用。多个命令在同一行可用;分割

1
2
alias name='command' 	#等号两边不能有空格
unalias name #删除别名

重定向

覆盖 追加 描述
< << stdin
> >> stdout
2> 2>> stderr

输出标准错误:&>

/dev/null: 位存储桶(空设备、黑洞),接收输入,但不做任何处理

> file: 可以用来清空文件内容,或创建空文件

文本操作

管道符|

管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。

cat

显示文件内容,-n选项添加行号输出,不加参数可接收标准输入,按ctrl+d结束输入

利用文件合并示例:

1
cat file1 file2 > file3

-n显示文件前n行

tail

-n显示文件最后n行,-f选项可实时滚动显示文件内容(用来看日志很方便)

more

对于大文件可增量显示文件内容,基本不用,下面的less更强大

less

也是增量显示文件内容,但支持前翻后翻、字符串匹配等复杂功能

G、shift+G 跳到结尾

1G、g、shift+g 跳到开头

ng 跳到第n行

/XXX 查找字符串,按n下一个,shift+n上一个

Page Up、ctrl+u、b 上页

Page Down、ctrl+d、space 下页

sort

按行排序,默认从第一个字符升序排列

-b 忽略每行开头空格

-f 不区分大小写

-n 按数值排序,或字符串长度

-r 反序

-o 输出到文件

-t 定义分隔符,默认空格或tab

-k field1[,field2] 对从field1到field2的字段排序

示例(通常跟在管道符后):

1
2
3
sort -k 1,1 	#对第一个字段排序
sort -k 3.7 #对第三个字段的第七个字符排序
sort -k 3.4nbr

uniq

相邻行去重,常配合sort

-c 显示重复次数

-d 只输出重复行

-i 忽略大小写

-s n 忽略开头n个字符

-f n 忽略开头n个字段(空格分隔)

cut

按行抽取文本。

-d 指定分隔符,默认单个tab

-f field_list 抽取一个或多个字段

-c char_list 抽取字符个数区间内的文本,如抽取第七个到第十个字符,-c 7-10

paste

与cut相反,添加文本列,可接受多个文件参数

join

与paste类似,但多个文件参数必须有 共享键值,类似数据库表连接

comm

比较两个文本,第一列1文件独有,第二列2独有,第三列共有

diff

与comm类似,更复杂

-c 上下文模式

-u 统一模式

常用选项,diff -Naur file1 file2

patch

与diff配合,打补丁,较老文件更新为新文件

1
2
diff -Naur file1 file2 > patchfile
patch < patchfile #file会更新为file2

tr

字符集转换,如tr a-z A-Z

-d ‘char’ 删除字符

-s char-list 删除相邻重复字符

aspell

拼写检查

wc

打印行数、字数、字节数

-l 只打印行数

grep

1
grep pattern [file...]

打印匹配行,pattern为基本正则表达式

-i 忽略大小写

-v 打印不匹配的行

-E 使用扩展正则表达式

sed与awk

这两个都可以用来文本处理,sed是流编辑命令,awk更复杂一些(一门脚本语言,可以单独一本书介绍),两个命令都是Linuxer必备技能,详见sed与awk

字符串展开

路径展开

1
2
3
echo *	#显示当前目录的所有文件名
echo D* #显示当前目录以D开头的文件名
echo [[:upper]]* #显示当前目录以大写字母开头的文件名

算术展开

1
$((expression))

花括号展开

一个花括号可对应多个字符串,如

{A,B,C} #分别用A、B、C替代该展开式

{A..Z} #分别用所有大写字母代替该展开式

参数展开

${parameter},$1,详见另一篇shell脚本对参数展开的介绍参数展开

命令替换

1
$(command)	#command为linux命令,展开为执行结果

双引号字符串

除$,,`这三个字符,其他特殊字符都失效,为字符本身。参数展开、算术展开、命令替换仍然执行。

单引号字符串

所有特殊字符失效,禁止任何展开

权限

权限类型

对于文件和目录的访问权力是根据读访问,写访问,和执行访问来定义的。如果我们看一下 ls 命令的输出结果,我们能得到一些线索,这是怎样实现的:

1
2
3
4
5
[me@linuxbox ~]$ > foo.txt

[me@linuxbox ~]$ ls -l foo.txt

-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt

ls显示的列表的前十个字符是文件的属性。这十个字符的第一个字符表明文件类型。下表是你可能经常看到的文件类型(还有其它的,不常见类型):

属性 文件类型
- 一个普通文件
d 一个目录
l 一个符号链接。注意对于符号链接文件,剩余的文件属性总是”rwxrwxrwx”,而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。
c 一个字符设备文件。这种文件类型是指按照字节流,来处理数据的设备。 比如说终端机,或者调制解调器
b 一个块设备文件。这种文件类型是指按照数据块,来处理数据的设备,例如一个硬盘,或者 CD-ROM 盘。

剩下的九个字符,叫做文件模式,代表着文件所有者,文件组所有者,和其他人的读,写,执行权限。

权限属性如下所示:

Owner Group Others

rwx rwx rwx

当设置文件模式后,r,w,x 模式属性对文件和目录会产生以下影响:

属性 文件 目录
r 允许打开并读取文件内容。 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。
w 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。
x 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 允许进入目录,例如:cd directory 。

chmod

1
2
chmod XXX file	#使用三位8进制数更改文件权限,常见八进制数含义:7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。
chmod u+r file #使用符号表示法更改文件权限,下面讲下chmod的具体符号表示法

chmod 命令支持一种符号表示法,来指定文件模式。符号表示法分为三部分:更改会影响谁, 要执行哪个操作,要设置哪种权限。通过字符 “u”,“g”,“o”,和 “a” 的组合来指定 要影响的对象,如下所示:

符号 说明
u “user”的简写,意思是文件或目录的所有者。
g 用户组。
o “others”的简写,意思是其他所有的人。
a “all”的简写,是”u”, “g”和“o”三者的联合。

如果没有指定字符,则假定使用”all”。执行的操作可能是一个“+”字符,表示加上一个权限, 一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。

权限由 “r”,“w”,和 “x” 来指定。这里是一些符号表示法的实例:

示例 说明
u+x 为文件所有者添加可执行权限。
u-x 删除文件所有者的可执行权限。
+x 为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x。
o-rw 除了文件所有者和用户组,删除其他人的读权限和写权限。
go=rw 给群组的主人和任意文件拥有者的人读写权限。如果群组的主人或全局之前已经有了执行的权限,他们将被移除。
u+x,go=rw 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。

特殊权限

其中之一是 setuid 位(八进制4000)。当应用到一个可执行文件时,它把有效用户 ID 从真正的用户(实际运行程序的用户)设置成程序所有者的 ID。这种操作通常会应用到 一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根用户(root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以 访问普通用户禁止访问的文件和目录。很明显,因为这会引起安全方面的问题,所有可以 设置 setuid 位的程序个数,必须控制在绝对小的范围内。

第二个是 setgid 位(八进制2000),这个相似于 setuid 位,把有效用户组 ID 从真正的 用户组 ID 更改为文件所有者的组 ID。如果设置了一个目录的 setgid 位,则目录中新创建的文件 具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说, 当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时, 那么设置 setgid 位很有用处。

第三个是 sticky 位(八进制1000)。这个继承于 Unix,在 Unix 中,它可能把一个可执行文件 标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但是如果一个目录设置了 sticky 位, 那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是 超级用户。这个经常用来控制访问共享目录,比方说/tmp。

这里有一些例子,使用 chmod 命令和符号表示法,来设置这些特殊的权限。首先, 授予一个程序 setuid 权限。

chmod u+s program

下一步,授予一个目录 setgid 权限:

chmod g+s dir

最后,授予一个目录 sticky 权限:

chmod +t dir

当浏览 ls 命令的输出结果时,你可以确认这些特殊权限。这里有一些例子。首先,一个程序被设置为setuid属性:

-rwsr-xr-x

具有 setgid 属性的目录:

drwxrwsr-x

设置了 sticky 位的目录:

drwxrwxrwt

chown

更改文件或目录的所有者和组

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

id

显示用户的uid、gid、groups

passwd

1
passwd [user]	#更改密码

su

1
su [-] user

切换用户,-选项会加载user用户的shell环境,并将工作目录切换到user的家目录。要求输入user用户密码

sudo

以另一个用户身份执行命令,通常是root用户。要求输入当前用户密码,比su更常用

进程

ps

显示进程信息

1
2
3
4
5
6
[me@linuxbox ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2136 644 ? Ss Mar05 0:31 init
root 2 0.0 0.0 0 0 ? S&lt; Mar05 0:00 [kt]

and many more...

VSZ 虚拟内存大小

RSS 物理内存大小

TTY 控制终端

STAT 进程状态

TIME 占用cpu时间

COMMAND 启动命令

top

top 程序连续显示系统进程更新的信息(默认情况下,每三秒钟更新一次),”top”这个名字 来源于 top 程序是用来查看系统中“顶端”进程的。top 显示结果由两部分组成: 最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。

1
2
3
4
5
6
7
8
9
top - 14:59:20 up 6:30, 2 users, load average: 0.07, 0.02, 0.00
Tasks: 109 total, 1 running, 106 sleeping, 0 stopped, 2 zombie
Cpu(s): 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si
Mem: 319496k total, 314860k used, 4636k free, 19392k buff
Swap: 875500k total, 149128k used, 726372k free, 114676k cach

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6244 me 39 19 31752 3124 2188 S 6.3 1.0 16:24.42 trackerd
....

其中系统概要包含许多有用信息。下表是对系统概要的说明:

行号 字段 意义
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% of the CPU is being used for user processes. 这意味着进程在内核之外。
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。h,显示程序的帮助屏幕,q, 退出 top 程序。

jobs

显示活跃任务

kill

给进程发送信号

1
kill [-signal] PID...

如果在命令行中没有指定信号,那么默认情况下,发送 TERM(终止)信号。kill 命令被经常 用来发送以下命令:

编号 名字 含义
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 程序会响应这个信号,按照新窗口的尺寸,刷新显示的内容。

网络

ping

最基本的网络命令是 ping。这个 ping 命令发送一个特殊的网络数据包,叫做 ICMP ECHO_REQUEST,到 一台指定的主机。大多数接收这个包的网络设备将会回复它,来允许网络连接验证。

traceroute

这个 traceroute 程序(一些系统使用相似的 tracepath 程序来代替)会显示从本地到指定主机 要经过的所有“跳数”的网络路由列表。

netstat

netstat 程序被用来检查各种各样的网络设置和统计数据。通过此命令的许多选项,我们 可以看看网络设置中的各种特性。

使用“-ie”选项,我们能够查看系统中的网络接口;

使用“-r”选项会显示内核的网络路由表。

ftp

登录服务器,用get命令下载文件,示例

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
[me@linuxbox ~]$ ftp fileserver
Connected to fileserver.localdomain.
220 (vsFTPd 2.0.1)
Name (fileserver:me): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub/cd\_images/Ubuntu-8.04
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-rw-r-- 1 500 500 733079552 Apr 25 03:53 ubuntu-8.04- desktop-i386.iso
226 Directory send OK.
ftp> lcd Desktop
Local directory now /home/me/Desktop
ftp> get ubuntu-8.04-desktop-i386.iso
local: ubuntu-8.04-desktop-i386.iso remote: ubuntu-8.04-desktop-
i386.iso
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for ubuntu-8.04-desktop-
i386.iso (733079552 bytes).
226 File send OK.
733079552 bytes received in 68.56 secs (10441.5 kB/s)
ftp> bye

lftp

更好的ftp,虽然 lftp 工作起来与传统的 ftp 程序很相似,但是它带有额外的便捷特性,包括 多协议支持(包括 HTTP),若下载失败会自动地重新下载,后台处理,用 tab 按键来补全路径名,还有很多。

sftp

正如其名字所示,它是 ftp 程序的安全替代品。sftp 工作起来与我们 之前使用的 ftp 程序很相似;然而,它不用明码形式来传递数据,它使用加密的 SSH 通道。sftp 有一个 重要特性强于传统的 ftp 命令,就是 sftp 不需要远端系统中运行 FTP 服务器。它仅仅要求 SSH 服务器。 这意味着任何一台能用 SSH 客户端连接的远端机器,也可当作类似于 FTP 的服务器来使用。

wget

下载文件或网页

ssh

安全远程登录。

通过网络来远程操控类 Unix 的操作系统已经有很多年了。早些年,在因特网普遍推广之前,有 一些受欢迎的程序被用来登录远程主机。它们是 rlogin 和 telnet 程序。然而这些程序,拥有和 ftp 程序 一样的致命缺点;它们以明码形式来传输所有的交流信息(包括登录命令和密码)。这使它们完全不 适合使用在因特网时代。

为了解决这个问题,开发了一款新的协议,叫做 SSH(Secure Shell)。 SSH 解决了这两个基本的和远端主机安全交流的问题。首先,它要认证远端主机是否为它 所知道的那台主机(这样就阻止了所谓的“中间人”的攻击),其次,它加密了本地与远程主机之间 所有的通讯信息。

scp

scp(安全复制)被用来复制文件,与熟悉的 cp 程序非常相似。最显著的区别就是 源或者目标路径名要以远端主机的名字,后跟一个冒号字符开头。

和 ssh 命令一样,如果你所期望的远端主机帐户与你本地系统中的不一致, 则可以把用户名添加到远端主机名的开头。

1
[me@linuxbox ~]$ scp bob@remote-sys:document.txt .

rsync

同步本地和远程文件或目录,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

1
rsync options source destination

-av a递归,v显示详细信息

–delete 删除目标机上不存在于源机器的文件

–rsh=ssh 指定ssh协议

归档和压缩

zip/gzip/bzip2

压缩命令,linux常用gzip,bzip2压缩率更高但速度慢,具体不同百度吧, -d参数解压缩

tar

归档命令,常用选项zcvf创建归档,或zxvf抽取归档,z表示指定gzip压缩方式

参考文献

[1]、《The Linux Command Line》

[2]、 http://www.runoob.com/linux/linux-command-manual.html

[3]、《鸟哥的Linux私房菜》

坚持原创技术分享,您的支持将鼓励我继续创作!
分享到: