系统入门 - Linux系统基础命令

1. 系统目录结构

几乎所有的计算机操作系统都是用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件, 而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树的分支, 所以该结构又被称为”目录树”。

Linux系统中也沿用了这种文件结构, 所有目录和文件都在 “根目录”下, 目录名为”/“。FHS(文件系统层次标准)定义了在根目录下的主要目录以及每个目录应该存放什么文件。

Linux系统主要目录说明

目录 说明
/etc 系统重要配置文件, 以及常用服务配置文件
/var 存放系统引导启动时产生的可变文件,文件通常动态更改的,例如: 缓存目录,日志文件
/run 系统启动后, 运行的程序产生的运行时数据, 包括进程的pid文件,锁文件等
/home 普通用户的主目录, 普通用户的家目录默认为/HOME/USERNAME
/root 超级管理员的主目录, 普通用户无权操作
/tmp 存放临时文件, 一般存放超过10天以上都会自动删除,可以更改删除临时文件的期限
/boot 存放系统引导时候需要的文件
/dev 存放设备文件
/usr 安装的软件, 共享库, 重要的子目录有
/usr/bin 用户命令目录
/usr/sbin 管理员命令目录
/usr/local 本地自定义安装的软件

注意: 在Linux7系统中, /bin, /sbin, /lib, /lib64都以软链接的形式链接到/usr/目录下,例如:

  • /bin –> /usr/bin
  • /sbin –> /usr/sbin
  • lib -> usr/lib
  • lib64 -> usr/lib64

2. 文件路径定位

路径的作用:定位文件具体位置信息

  • 你要在那里创建什么文件?
  • 你要将什么文件复制到什么地方?
  • 你要删除的文件在什么地方?

2.1 特殊目录: (.)和(..)

在每个目录下, 都会固定存在两个特殊目录, 分别是一个点(.)和两个(..)的目录。一个点代表当的是当前目录, 两个点代表的是当前目录的上层目录。注意: 在Linux下所有以点开始的文件都是”隐藏文件”, 对于这类文件, 只使用命令ls -l是看不到的, 必须要使用ls -la才可以看到,如下所示:

1
2
3
4
5
[root@liyanzhao ~]# cd /opt/
[root@liyanzhao opt]# ls

[root@liyanzhao opt]# ls -a
. ..

2.2 绝对路径

Linux系统采用了目录树的文件组织结构, 在Linux下每个目录或文件都可以从根目录处开始寻找, 比如: /usr/bin目录。这种从根目录开始的全路径被称为”绝对路径”, 绝对路径一定是以 “/“ 开头的。

如何确认当前所在的目录, 可以使用pwd命令查看:

1
2
[root@liyanzhao ~]# pwd
/root

2.3 相对路径

相对路径, 关键点在于当前在什么路径下。假设当前目录在/usr/local下, 那么它的上层目录(/usr目录)可以用../表示, 而/usr/local的下层目录(src)则可以用./src表示。所谓的(.)和(..)目录实际上也是属于相对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//进入/opt目录
[root@liyanzhao ~]# cd /opt/
[root@liyanzhao opt]# ls -la
total 76
drwxr-xr-x. 2 root root 69632 Dec 4 11:00 . #代表当前目录
dr-xr-xr-x. 33 root root 4096 Dec 4 10:40 .. #代表上层目录

//进入当前目录
[root@liyanzhao opt]# cd .

//显示当前目录
[root@liyanzhao opt]# pwd
/opt

//进入当前目录的上层目录
[root@liyanzhao opt]# cd ..

//进入上层目录,也就是/目录
[root@liyanzhao /]# pwd
/

cd命令常见用法

命令 说明
cd . 表示用户所处的当前目录
cd .. 表示上级目录
cd ~ 表示当前用户自己的家目录
cd - 切换上次所在目录
cd ~ 切换至当前用户家目录
cd 切换至当前用户家目录
cd . .代表当前目录,一般在拷贝、移动等情况下使用
cd .. 切换至当前目录的上级目录

3. 目录管理命令

3.1 目录创建命令mkdir

1
2
3
4
5
6
7
# mkdir dir1

# mkdir /home/liyanzhao/dir1 /home/liyanzhao/dir2

# mkdir /home/liyanzhao/{dir4,dir5} -v

# mkdir /home/liyanzhao/dir6/dir6-1 -pv

常用选项:

  • -p: 递归创建目录,如果父目录不存在则创建
  • -v: 显示创建过程

3.2 以树状显示目录结构命令tree

1
2
3
4
5
6
7
# 显示当前目录下的结构
tree

# 显示一级目录
tree -L 1 /

# -L: 显示目录树的层级

4. 文件管理命令

Linux一切皆为文件, 在对Linux进行配置时, 很大程度上就是处理文件的过程, 所以掌握文件的相关操作是非常有必要的。下面我们介绍如何对文件进行, 创建、删除、移动、重命名, 以及查看文件内容, 至于如何编辑文件, 在后面具体介绍编辑器的时候在做详细阐述。

4.1 文件创建命令touch

1
2
3
4
5
6
7
8
9
10
11
# touch filename

# touch filename_1 filename_2

# touch /home/liyanzhao/file5 file6

# touch file{1..10}

# touch file{a,b,c}

# touch file{a..z}

4.2 文件时间stat

1
2
3
4
5
6
7
8
9
10
[root@test-example ~]# stat test.txt
File: 'test.txt'
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67335626 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2018-01-21 12:12:48.949097044 +0800
Modify: 2018-01-21 12:12:35.243302963 +0800
Change: 2018-01-21 12:12:35.243302963 +0800
Birth: -

文件时间说明:

  • 访问时间(atime): 查看内容
  • 修改时间(mtime): 修改内容
  • 改变时间(ctime): 文件属性,比如权限
  • 删除时间(dtime): 文件被删除的时间

4.3 文件目录复制命令cp

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
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

//将name文件复制至/tmp目录中
# cp name /tmp/name_copy

//如果复制过想保持原文件名,不修改名称
# cp name /tmp/name

//如果复制过想保持原来的属性, -p保持原文件或目录的属性
# cp -p name /tmp/name_p

//复制目录只需要使用-r参数, 递归复制
# mkdir name_name
# cp -r name_name/ /tmp/name_tmp

//将多个文件拷贝同一个目录
# cp -rv /etc/hosts /etc/hostname /tmp
# cp -rv /etc/hosts /etc/hostname ./

//备份文件
# cp -rv /etc/hosts /etc/hosts.bak
# cp -rv /etc/{hosts,hosts.bak}
# cp -rv /etc/hosts{,-org}

常用选项:

  • -r: 递归复制目录
  • -v: 显示详细过程
  • -p: 保持原文件属性
  • -f: 强制复制

4.4 文件目录移动命令mv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

//移动文件至tmp目录
# mv file /tmp/

//移动文件至tmp目录并修改名称为file_test
# mv file /tmp/file_test

//移动目录至/tmp目录下
# mv dir/ /tmp/

//移动多个文件或多个目录至同一个目录
# touch file{1..3}
# mv file1 file2 file3 /opt/

# mkdir dir{1..3}
# mv dir1/ dir2/ dir3/ /opt

4.5 文件目录删除命令rm

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
rm [OPTION]... FILE...

-r 递归
-f 强制删除
-v 详细过程

//删除文件, 默认会提醒是否删除文件
# rm anan

//强制删除文件, 不提醒
# rm anan -f

//删除目录,会提醒
# rm -r dir/

//强制删除目录,不提醒
# rm -rf dir/

//示例
# mkdir /home/dir10
# touch /home/dir10/{file2,file3,.file4}
# rm -rf /home/dir10/* //不包括隐藏文件
# ls /home/dir10/ -a
. .. .file4

//示例2
# touch file{1..10}
# touch {1..10}.pdf
# rm -rf file*
# rm -rf *.pdf

5. 文件查看命令

5.1 cat - 查看文件内容

1
2
3
4
5
6
7
8
9
10
# 查看文件内容
cat /etc/passwd

# -n参数显示行号
cat -n /etc/passwd

# 追加数据
cat >> liyanzhao.txt <<EOF
test
EOF

5.2 head - 查看文件头部内容

1
2
3
4
5
# 查看文件头部内容,默认前十行
head /etc/passwd

# -n参数指定查看头几行
head -n5 /etc/passwd

5.3 tail - 查看文件尾部内容

1
2
3
4
5
# 查看文件尾部内容,默认最后十行
tail /etc/passwd

# -f参数跟随尾部输出而变化(实时监控)
tail -f /var/log/messages

5.4 more - 分页查看文件内容

1
2
# 按空格可翻页查看文件内容,按q可退出
more /etc/passwd

5.5 less - 分页查看文件内容

1
2
# 和more类似,但功能更强大
less /etc/passwd

6. 文件下载命令

6.1 wget - 文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 文件下载
wget http://www.baidu.com

# -O 指定下载地址,更改名称
wget -O baidu.html http://www.baidu.com

# -T 超时时间
wget -T 30 http://www.baidu.com

# -q 安静下载(关闭wget输出)
wget -q http://www.baidu.com

# --spider 网络爬虫
wget --spider http://www.baidu.com

6.2 curl - 文件下载

1
2
3
4
5
# 文件下载
curl -o baidu.html http://www.baidu.com

# 显示下载进度
curl -O http://www.baidu.com

6.3 rz/sz - 文件上传下载

1
2
3
4
5
6
7
8
# 安装lrzsz
yum install lrzsz

# rz 文件上传
rz

# sz 文件下载
sz filename

7. 命令查找命令

7.1 locate - 查找文件或者目录

1
2
3
4
5
# 搜索etc目录下所有以sh开头的文件
locate /etc/sh

# 搜索etc目录下,所有以sh开头的文件,忽略大小写
locate -i /etc/sh

7.2 which - 查找命令绝对路径

1
2
# 查找系统PATH变量目录下的命令(绝对路径)
which ls

7.3 whereis - 查找命令相关文件

1
2
3
4
5
6
7
8
# 查找文件索引数据库下的命令、源文件、man文件。非PATH变量查找,所以查找的面比which要广
whereis ls

# -b 只查找二进制文件
whereis -b ls

# -m 只查找man文件
whereis -m ls

8. 字符处理命令

8.1 使用sort排序

很多情况下需要对无序的数据进行排序, 这时就需要用到sort排序了。

1
2
3
4
5
6
sort [OPTION]… [FILE]…

-r:倒序
-n:按数字排序
-t:指定分隔符(默认空格)
-k:指定第几列, 指定几列几字符(指定1,1 3.1,3.3)

示例:

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
32
33
34
35
36
37
38
39
40
//演示sort的用法, 首先创建一个文件:
[root@liyanzhao ~]# cat >> sort.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF

//下面对输出的内容进行排序:
[root@liyanzhao ~]# sort sort.txt
a:4
b:3
c:2
d:1
e:5
f:11

//可观察到, sort文件具有一个特点, 第一个字符是字母, 第三个字符是数字, 中间是用冒号隔开。
//这样我们可以使用-t指定分隔符, 使用-k指定用于排序的列了。

[root@liyanzhao ~]# sort -t ":" -k2 sort.txt
d:1
f:11 //第二行为什么是11?不应该按照顺序排列?
c:2
b:3
a:4
e:5

//按照排序的方式, 只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小。
//如果想要按照数字的方式进行排序, 需要使用 -n参数。

[root@liyanzhao ~]# sort -t ":" -n -k2 sort.txt
d:1
c:2
b:3
a:4
e:5
f:11

测试案例: 对下面内容进行排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
192.168.3.1 00:0F:AF:81:19:1F
192.168.3.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.1.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.1.12 00:30:15:A2:3A:A1
192.168.1.1 00:0F:AF:81:19:1F
192.168.2.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.1.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.1.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.3.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.3.12 00:30:15:A2:3A:A1

解决方案: 针对第三列的第一个字符,第四列的第一个字符到第三个字符排序才是正确

1
[root@student tmp]# sort -t. -k3.1,3.1nr -k4.1,4.3nr test.txt

8.2 使用uniq删除重复内容

如果文件中有多行完全相同的内容, 当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq命令解决这个问题(但是必须配合sort使用)。

1
2
3
uniq [OPTION]… [INPUT [OUTPUT]]

-c 计算重复的行

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//演示uniq的用法, 首先创建一个文件:
[root@liyanzhao ~]# cat uniq.txt
abc
123
abc
123

//uniq需要和sort一起使用, 先使用sort排序, 让重复内容连续在一起
[root@liyanzhao ~]# cat uniq.txt |sort
123
123
abc
abc

//使用uniq去除相邻重复的行
[root@liyanzhao ~]# cat uniq.txt |sort|uniq
123
abc

//使用-c参数, 能统计出文件中每行内容重复的次数
[root@liyanzhao ~]# cat uniq.txt |sort|uniq -c
2 123
2 abc

8.3 使用cut命令截取某一个字段

1
2
3
4
5
cut OPTION… [FILE]…

-d:指定分隔符
-f:数字,取第几列 –f3,6三列和6列
-c:按字符取(空格也算)

示例:

1
2
3
4
5
6
7
8
9
//测试数据, 过滤出文件里 liyanzhao以及552408925
#echo "Im liyanzhao, is QQ 552408925" >liyanzhao.com

//实践思路
# sed 's#,# #g' liyanzhao.txt | cut -d " " -f2,6
# sed 's#,# #g' liyanzhao.txt | awk -F " " '{print $2 " " $5}'
# awk -F '[, ]+' '{print $2,$5}' liyanzhao.txt
# awk '{print $2 $5}' liyanzhao.txt | awk -F "," '{print $1" " $2}'
# awk -F "[, ]" '{print $2 " " $6}' liyanzhao.txt

此类问题是运维工作中最常见的问题。可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@student tmp]# cat web.log
http://www.liyanzhao.com/index.html
http://www.liyanzhao.com/1.html
http://post.liyanzhao.com/index.html
http://mp3.liyanzhao.com/index.html
http://www.liyanzhao.com/3.html
http://post.liyanzhao.com/2.html

[root@student tmp]# awk -F '/' '{print $3}' web.log|sort -rn|uniq -c
3 www.liyanzhao.com
2 post.liyanzhao.com
1 mp3.liyanzhao.com

[root@student tmp]# cut -d / -f3 web.log|sort -rn|uniq -c
3 www.liyanzhao.com
2 post.liyanzhao.com
1 mp3.liyanzhao.com

8.4 使用wc统计

1
2
3
4
5
6
7
8
wc - print newline, word, and byte counts for each file
显示文件的行、单词与字节统计信息

wc [OPTION]… [FILE]…

-l:显示文件行数
-c:显示文件字节
-w:显示文件单词

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
//统计fstab有多少行
[root@student ~]# wc -l /etc/fstab
15 /etc/fstab

//显示/etc/services 文件行号
[root@student ~]# wc -l /etc/services
10774 /etc/services

//扩展方法
[root@student ~]# grep -n "." /etc/services | tail -1
[root@student ~]# awk '{print NR $0}' /etc/services | tail -1
[root@student ~]# cat -n /etc/services | tail -1
[root@student ~]# sed '=' /etc/services | tail -2

9. 练习如下命令

用普通用户身份登陆虚拟机上完成练习

练习步骤

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
# 1. 在用户家目录下创建6个文件 song1.mp3 ~ song6.mp3
touch ~/song{1..6}.mp3

# 2. 把上出创建的songX.mp3文件移动到Music目录下(不存在则创建)
mkdir -p ~/Music
mv ~/song{1..6}.mp3 ~/Music/

# 3. 在用户家目录下创建三个目录,分别为 friends,family,work
mkdir ~/friends ~/family ~/work

# 4. 切换到friends目录下,把Music目录下的song1.mp3 ~ song3.mp3 拷贝到当前目录
cd ~/friends
cp ~/Music/song{1..3}.mp3 .

# 5. 切换到family目录下,把Music目录下的song4.mp3 ~ song6.mp3 移动到当前目录
cd ~/family
mv ~/Music/song{4..6}.mp3 .

# 6. 切换到用户主目录
cd ~

# 7. 删除family目录
rm -rf ~/family

# 8. 切换到friends目录,把目录下的所有文件删除
cd ~/friends
rm -f *

# 9. 切换到主目录,把friends目录删除
cd ~
rm -rf ~/friends

完整命令序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建文件
touch ~/song{1..6}.mp3

# 创建Music目录并移动文件
mkdir -p ~/Music && mv ~/song{1..6}.mp3 ~/Music/

# 创建三个目录
mkdir ~/friends ~/family ~/work

# 复制文件到friends目录
cp ~/Music/song{1..3}.mp3 ~/friends/

# 移动文件到family目录
mv ~/Music/song{4..6}.mp3 ~/family/

# 返回主目录并删除family目录
cd ~ && rm -rf ~/family

# 删除friends目录下的所有文件
rm -f ~/friends/*

# 删除friends目录
rm -rf ~/friends

10. 命令总结

10.1 目录管理命令

命令 功能 常用选项
mkdir 创建目录 -p 递归创建, -v 显示过程
tree 树状显示目录 -L 指定层级
cd 切换目录 . 当前目录, .. 上级目录, ~ 家目录
pwd 显示当前目录

10.2 文件管理命令

命令 功能 常用选项
touch 创建文件
cp 复制文件/目录 -r 递归, -v 详细, -p 保持属性
mv 移动/重命名
rm 删除文件/目录 -r 递归, -f 强制, -v 详细
stat 查看文件信息

10.3 文件查看命令

命令 功能 常用选项
cat 查看文件内容 -n 显示行号
head 查看文件头部 -n 指定行数
tail 查看文件尾部 -f 实时监控
more 分页查看
less 分页查看

10.4 字符处理命令

命令 功能 常用选项
sort 排序 -r 倒序, -n 数字排序, -t 分隔符, -k 指定列
uniq 去重 -c 统计重复次数
cut 截取字段 -d 分隔符, -f 字段, -c 字符
wc 统计 -l 行数, -c 字节, -w 单词