前言
最近在看Shotts大神写的Linux命令行大全,写篇blog做一下笔记。已经玩Linux快1年了,基本操作和解决问题的能力还是有的,这本书也的确不错,不是那种很玄学的书,通俗易懂却又知识量丰富,适合帮助我加深对Linux命令的理解和记忆。
这篇blog按照书籍的顺序,分为4个部分进行总结,学习shell,配置与环境,常见任务和主要工具,编写shell脚本。
PS:本篇所有命令前带 。
1. 简单命令
查看当前时间
1
$ date
查看当前日期
1
$ cal
查看磁盘可用空间
1
$ df
查看内存可用空间
1
$ free
关闭终端
1
$ exit
2. 导航
查看当前工作目录
1
$ pwd
改变目录
1
$ cd
列出当前目录下的内容
1
$ ls
选项 | 长选项 | 含义 |
---|---|---|
-a | —all | 列出所有文件(含隐藏) |
-d | —directory | 查看目录本身的信息 |
-F | —classify | 名字是文件夹时,后面带斜杠/ |
-h | —human-readable | 以长格式列出 |
-l | 使用长格式列出结果 | |
-r | —reverse | 倒序显示结果 |
-S | 按文件大小对结果排序 | |
-t | 按修改时间排序 |
3. 文件系统
确定文件类型
1
$ file filename
查看文件内容
1
$ less filename
- 梗
Q: 为什么less
表示查看文件?
A: 早期是more
,后来有句less is more
,就改了233333
- 梗
4. 操作文件与目录
- 通配符
形式 | 匹配项 |
---|---|
* | 所有文件 |
g* | 以g开头的任一文件 |
b*.txt | 以b开头,中间有任意多个字符,并以.txt结尾的任一文件 |
Data??? | 以Data开头,后面跟3个字符的任一文件 |
[abc]* | 以abc中的任一个开头 |
BACKUP.[0-9][0-9][0-9] | 以BACKUP.开头,后面跟3个数字的任一文件 |
[[:upper:]1]* | 以大写字母或1开头的任一文件 |
[![:digit:]]* | 不以数字开头的任一文件 |
*[[:lower:]123] | 以小写字母或数字1,2,3中的任一个结尾的任一文件 |
创建目录
- 单个名为dir的文件夹
1
$ mkdir dir
- 多个文件夹
1
$ mkdir dir1 dir2 dir3
- 单个名为dir的文件夹
复制文件和目录
1
$ cp item1 item2
- cp命令选项
选项 | 含义 |
---|---|
-a, —archive | 复制文件和目录及其属性,包括所有权和权限,复制后的文件具有默认属性 |
-i, —interactive | 覆盖已存在文件时,会提示用户进行确认 |
-r, —recursive | 递归地复制目录及其内容,如果目标文件夹不存在,会自动创建 |
-u, —update | 只复制目标文件里不存在的文件或相应文件的更新文件 |
-v, —verbose | 复制文件时,会显示信息性消息 |
- 移除和重命名文件
1
$ mv item1 item2
- mv命令选项
选项 | 含义 |
---|---|
-i, —interactive | 覆盖已存在文件时,会提示用户进行确认 |
-u, —update | 只移动目标文件里不存在的文件或相应文件的更新文件 |
-v, —verbose | 移动文件时,会显示信息性消息 |
- 删除文件和目录
1
$ rm item
- rm命令选项
选项 | 含义 |
---|---|
-i, —interactive | 删除已存在文件时,会提示用户进行确认 |
-r, —recursive | 递归地删除目录及其内容,如果目标目录有子目录的话,自动删除 |
-f, —force | 忽略不存在的文件并无需确认,该选项存在时会覆盖-i 选项 |
-v, —verbose | 删除文件时,会显示信息性消息 |
- 创建链接
- 硬链接(早期链接)
1
$ ln file link
- 符号链接(先进一点)
1
$ ln -s file link
- 硬链接(早期链接)
5. 命令的使用
命令有哪些?
- 可执行程序
- shell内置命令
- shell函数
- alias命令
type——显示命令的类型
- which——显示可执行程序的位置
- help——获取shell内置命令的帮助文档
- man——显示程序的手册页
- apropos——显示合适的命令
- whatis——显示命令的简要描述
- info——显示程序的info条目
- 使用别名来创建自己的命令
1
$ alias name='string'
6. 重定向
标准输出&错误重定向
- 标准输出重定向或 使用
1
$ ls -l /usr/bin > ls-output.txt
>>
让输出结果添加在尾部1
$ ls -l /usr/bin >> ls-output.txt
- 标准错误重定向
1
$ ls -l /bin/usr 2> ls-error.txt
- 标准输出和标准错误输出重定向到同一个文件或
1
$ ls -l /bin/usr > ls-output.txt 2>&1
1
$ ls -l /bin/usr &> ls-output.txt
- 丢弃输出到Dev null
1
$ ls -l /bin/usr 2> /dev/null
- 标准输出重定向
标准输入重定向
cat——合并文件
1
$ cat movie.mpeg.0* > movie.mpeg
管道
|
(把标准输出作为另一个命令的标准输入)1
$ Command1 | Command2
例:
1
$ ls -l /usr/bin | less
过滤器(多个管道)
1
$ ls /bin /usr/bin | sort | less
uniq——报告或忽略文件中重复的行
- 没有重复行
1
$ ls /bin /usr/bin | sort | uniq | less
- 列出重复的行
1
$ ls /bin /usr/bin | sort | uniq -d | less
- 没有重复行
wc——打印行数,字数和字节数
1
$ wc ls-output.txt
查看已排序列表的条目数
1
$ ls /bin /usr/bin | sort | uniq | less | wc -l
grep——打印匹配行
- 搜索出文件名中包含
zip
的所有文件1
2
3
4
5
6
7
8
9
10
11
12$ ls /bin /usr/bin | sort | uniq | grep zip
~~~
| 选项 | 含义 |
| --- | --- |
| -i | 忽略大小写 |
| -v | 只输出和模式不匹配的行 |
7. head/tail——打印文件的开头部分/结尾部分
* 打印前十行
~~~bash
$ head -n 10 ls-output.txt - 打印后十行也可以应用在管道中
1
$ tail -n 10 ls-output.txt
1
2
3
4
5
6$ ls /usr/bin | tail -n 5
~~~
8. tee——从stdin读取数据,并同时输出到stdout和文件
~~~bash
$ ls /usr/bin | tee ls.txt | grep zip
- 搜索出文件名中包含
7. 透过shell看世界
扩展
1
$ echo *
路径名扩展
1
2
3
4$ echo D*
$ echo *s
$ echo [[:upper:]]*
$ echo /usr/*/share波浪线扩展
拓展当前用户的主目录名1
$ echo ~
算术扩展
1
$ echo $((expression))
例:
1
2
3
4$ echo $((2+2)) // 4
$ echo $(($((5**2))*3)) // 5^2 * 3 = 75
$ echo Five divided by two equals $((5/2)) // 2
$ echo with $((5%2)) left over // 1花括号扩展
1
2
3
4$ 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} // 摄影师图集按月份创建-骚操作参数扩展
1
2$ echo $USER // fuujiro
$ printenv | less // 查看可用变量列表命令替换
1
2
3$ echo $(ls)
$ ls -l $(which cp)
$ file $(ls /usr/bin/* | grep zip)引用
- 引用造成的问题(
$100
未定义,扩展成了空字符串)1
$ echo The total is $100.00 // The total is .00
- 双引号
1
$ ls -l "two words.txt"
- 单引号(抑制)
- 转义字符
1
$ echo "The balance for user $USER is: \$5.00"
- 引用造成的问题(
8. 高级键盘技巧
请戳->终端HHKB键盘杀手技这篇blog~
- 使用历史命令
1
2$ history | less
$ history | grep /usr/bin
9. 权限
胡扯:UNIX和MS-DOS操作系统不同,区别是UNIX不仅是多任务(multitasking)系统,而且还是多用户(multiuser)系统,这是深嵌在操作系统设计理念的一个特色功能。为啥,可以自己想想啦~
所有者,组成员和其他用户
1
2
3
4fuujiro@fuujiro-PC ~/f/test> file /etc/shadow
/etc/shadow: regular file, no read permission
fuujiro@fuujiro-PC ~/f/test> less /etc/shadow
/etc/shadow: Permission denied产生这个错误的原因是,作为一个普通用户,没有读取这个文件的权限。
1
2fuujiro@fuujiro-PC ~/f/test> id
uid=1000(fuujiro) gid=1000(fuujiro) groups=1000(fuujiro),7(lp),27(sudo),100(users),109(netdev),113(lpadmin),117(scanner),123(sambashare)读取、写入和执行
对文件和目录的访问权限是按照读访问、写访问以及执行访问来定义的。1
2fuujiro@fuujiro-PC ~/f/test> ls -l ls-output.txt
-rw-r--r-- 1 fuujiro fuujiro 99672 Aug 8 18:28 ls-output.txt列出输出结果的前10个字符表示的是文件属性(file attribute),其中第一个字符表示文件类型(file type)。
-rw-r--r--
可分为
- | rw | r | r |
---|---|---|---|
文件类型 | 所有者权限 | 组权限 | 其他用户权限 |
- 文件属性
属性 | 文件类型 |
---|---|
- | 普通文件 |
d | 目录文件 |
l | 符号链接 |
c | 字符设备文件 |
b | 块设备文件 |
- 权限属性
属性 | 文件 | 目录 |
---|---|---|
r | 打开和读取 | 如果设置了执行权限,允许列出目录 |
w | 写入和截短 | 重命名和删除由目录权限决定 |
x | 允许把文件当作程序一样执行 | 允许进入目录下 |
- chmod——更改文件模式
只有文件所有者和超级用户才可以更改文件或者目录的模式。chmod命令支持两种不同方式改变文件模式——八进制和符号表示法。
- 八进制表示法
八进制 | 二进制 | 文件模式 |
---|---|---|
0 | 000 | —- |
1 | 001 | —x |
2 | 002 | -w- |
3 | 003 | -wx |
4 | 004 | r— |
5 | 005 | r-x |
6 | 006 | rw- |
7 | 007 | rwx |
例:
1
2
3
4
5
fuujiro@fuujiro-PC ~/f/test> ls -l ls.txt
-rw-r--r-- 1 fuujiro fuujiro 15877 Aug 9 08:28 ls.txt
fuujiro@fuujiro-PC ~/f/test> chmod 600 ls.txt
fuujiro@fuujiro-PC ~/f/test> ls -l ls.txt
-rw------- 1 fuujiro fuujiro 15877 Aug 9 08:28 ls.txt
- 符号表示法
符号 | 含义 |
---|---|
u | user的简称,表示文件或目录的所有者 |
g | group的简称,文件所属群组 |
o | others的简写,表示其他用户 |
a | all的简写,是u,g,o三者的组合 |
u+x | 为文件所有者添加可执行权限 |
u-x | 删除文件所有者的可执行权限 |
+x | 相当于a+x |
o-rw | 除了我user和group外,删除其他用户的读写权限 |
go=rw | g,o具有读写权限;如果g,o之前具有可执行权限,则删除jincheng |
u+x,go=rx | 需要多种权限时,需要逗号分隔 |
采用GUI设置文件模式
GNOME和KDE桌面系统都可右击文件或目录图标,弹出GUI框设置。umask——设置默认权限
了解——>掩码操作
更改身份
- su——以其他用户和组ID的身份来运行shell
- sudo——以另一个用户的身份执行命令
chown——更改文件所有者和所属群组
更改文所有者和所属群组,需要超级用户权限。chgrp——更改文件所属群组
类似与chown。更改用户密码
1
$ passwd
10. 进程
每个进程有自己的进程ID(PID,process ID),进程ID按递增的顺序来分配,init的进程的PID始终为1
使用ps命令查看进程信息
只能得到当前终端会话的进程信息(我用的不是bash,是fish)1
2
3
4fuujiro@fuujiro-PC ~/f/test> ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
6016 pts/0 00:00:00 psps x
,ps aux
可以得反映系统运行情况的更大视图界面1
2$ ps x
$ ps aux使用top命令动态查看进程信息
1
$ top
动态(默认每3秒刷新一次),主要用于查看系统“最高(top)”进程的运行情况。
键盘控制:- h: 显示帮助界面
- q: 退出top命令
控制进程
用xlogo
测试1
$ xlogo
中断进程
按Ctrl+c
可以中断一个程序,比如上面的xlogo使进程在后台运行
1
$ xlogo &
测试:
1
2
3
4
5
6
7
8fuujiro@fuujiro-PC ~/f/test> ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
6305 pts/0 00:00:00 xlogo
6368 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> jobs
Job Group CPU State Command
1 6412 0% running xlogo &jobs
中每个启动的作业都有自己的作业编号,比如上面是1。
bg
让进程恢复在前台运行。使进程回到前台运行
1
2
3
4
5
6fuujiro@fuujiro-PC ~/f/test> jobs
Job Group CPU State Command
1 6412 0% running xlogo &
fuujiro@fuujiro-PC ~/f/test> fg %1
Send job 1, “xlogo &” to foreground
^C⏎fg命令中
%
后跟的数字是作业编号。停止(暂停)进程
Ctrl+Z
暂停进程1
$ bg %1
bg
命令让进程到后台运行。信号
kill
命令通常用来杀死进程。1
2
3
4
5
6
7
8fuujiro@fuujiro-PC ~/f/test> xlogo &
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
6942 pts/0 00:00:00 xlogo
6947 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> kill 6942除了kill信号,还有比如:
Ctrl+c
给出个INT(中断,Interrupt)的信号;
Ctrl+Z
给出个TSTP(终端暂停,Terminal Stop)的信号。使用kill命令发送信号到进程
1
$ kill [-signal] PID...
如果命令行中没有指定信号,那么默认发送TERM(终止,Terminate)信号。
信号编号 | 信号名 | 含义 |
---|---|---|
1 | HUP | 挂起命令 |
2 | INT | 中断信号 |
9 | KILL | 杀死信号 |
15 | TERM | 终止信号 |
18 | CONT | 继续运行信号 |
19 | STOP | 暂停信号 | |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7122 pts/0 00:00:00 xlogo
7127 pts/0 00:00:00 ps fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7318 pts/0 00:00:00 xlogo
7323 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> kill -INT 7318
fuujiro@fuujiro-PC ~/f/test> kill -1 7122
1
2
3
4
5
6
7
8
9
fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7318 pts/0 00:00:00 xlogo
7323 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> kill -INT 7318
使用killall命令发送信号到多个进程
1
$ killall [-u user] [-signal] name...
例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 2, “xlogo &” terminated by signal SIGINT (Quit request from job control (^C))
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
xlogo &
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7408 pts/0 00:00:00 xlogo
7413 pts/0 00:00:00 xlogo
7420 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> killall xlogo
fuujiro@fuujiro-PC ~/f/test> ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7467 pts/0 00:00:00 ps
fish: Job 2, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)更多命令
命令 | 描述 |
---|---|
pstree | 树状输出进程列表 |
vmstat | 输出系统资源使用情况的快照 |
xload | 图形化显示| |
tload | Ctrl+c退出| |