1. 系统⽬录结构

image.png
⼏乎所有的计算机操作系统都是⽤⽬录结构组织⽂件。具体来说就是在⼀个⽬录中存放⼦⽬录和 ⽂件, ⽽在⼦⽬录中⼜会进⼀步存放⼦⽬录和⽂件,以此类推形成⼀个树状的⽂件结构,由于其 结构很像⼀棵树的分⽀, 所以该结构⼜被称为“⽬录树”。

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

  1. /etc 系统重要配置⽂件, 以及常⽤服务配置⽂件
  2. /var 存放系统引导启动时产⽣的可变⽂件,⽂件通常动态更改的,例如: 缓存⽬录,⽇志⽂件
  3. /run 系统启动后, 运⾏的程序产⽣的运⾏时数据, 包括进程的pid⽂件,锁⽂件等
  4. /home 普通⽤户的主⽬录, 普通⽤户的家⽬录默认为/HOME/USERNAME
  5. /root 超级管理员的主⽬录, 普通⽤户⽆权操作
  6. /tmp 存放临时⽂件, ⼀般存放超过10天以上都会⾃动删除,可以更改删除临时⽂件的期限
  7. /boot 存放系统引导时候需要的⽂件
  8. /dev 存放设备文件(磁盘、光驱、声卡等)
  9. /usr 安装的软件, 共享库, 重要的⼦⽬录
  10. /usr/bin ⽤户命令⽬录
  11. /usr/sbin 管理员命令⽬录
  12. /usr/local 本地⾃定义安装的软件
  13. //注意:在Linux7系统中, /bin, /sbin, /lib, /lib64都以软链接的形式链接到/usr/⽬录下,例如:
  14. /bin --> /usr/bin
  15. /sbin --> /usr/sbin
  16. lib -> usr/lib
  17. lib64 -> usr/lib64

2. ⽂件路径定位

路径的作⽤:定位⽂件具体位置信息
你要在那⾥创建什么⽂件?
你要将什么⽂件复制到什么地⽅?
你要删除的⽂件在什么地⽅?

image.png

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

[root@xmh ~]# cd /opt/
[root@xmh opt]# ls
[root@xmh opt]# ls -a
.  ..

//. 和 ..的含义,跟inode相关
[root@xmh ~]# ll -id /root/
33574977 dr-xr-x---. 2 root root 141 Feb 10 16:43 /root/
[root@xmh ~]# ll -id /root/.
33574977 dr-xr-x---. 2 root root 141 Feb 10 16:43 /root/.

[root@xmh ~]# ll -id /
64 dr-xr-xr-x. 17 root root 224 Jan 31 15:01 /
[root@xmh ~]# ll -id /root/..
64 dr-xr-xr-x. 17 root root 224 Jan 31 15:01 /root/..

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

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

[root@xmh ~]# pwd
/root

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

//进入/opt目录
[root@xmh ~]# cd /opt/
[root@xmh opt]# ls -la
total 0
drwxr-xr-x.  2 root root   6 Nov  5  2016 .  #代表当前目录
dr-xr-xr-x. 19 root root 272 Feb  3 15:41 .. #代表上层目录

//进入当前目录
[root@xmh opt]# cd .
//显示当前目录
[root@xmh opt]# pwd
/opt

//进入当前目录的上层目录
[root@xmh opt]# cd ..
//进入上层目录,也就是/目录
[root@xmh /]# pwd
/

cd命令常见用法:

. 表示用户所处的当前目录
.. 表示上级目录
~ 表示当前用户自己的家目录

cd -    #切换至上次所在目录
cd ~    #切换至当前用户家目录
cd      #切换至当前用户家目录
cd .    #.代表当前目录,一般在拷贝、移动等情况下使用
cd ..   #切换至当前目录的上级目录

目录管理命令
1.⽬录创建命令mkdir

-p:递归创建目录或创建多个递归目录(当文件存在时也不会报错)
-v:显示目录创建过程

// mkdir dir1
// mkdir -p /home/xiongminghao/dir1 /home/xiongminghao/dir2
// mkdir /home/xiongminghao/{dir4,dir5} -v
// mkdir /home/xiongminghao/dir6/dir6-1 -pv

2.以树状显示⽬录结构命令tree

-L: 显示⽬录树的层级

//显示当前⽬录下的结构 
# tree

//显示⼀级⽬录 
# tree -L 1 /

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

1.⽂件创建命令touch
如果文件/目录存在则更新文件/目录的所有时间戳(aime、mtime、ctime)

# touch filename 
# touch filename_1 filename_2 
# touch /home/xiongminghao/file5 file6 
# touch /home/xiongminghao/{file5,file6} 
# touch file{1..10} 
# touch file{a,b,c} 
# touch file{a..z}
# touch file$(date +%F)

2.文件时间stat

[root@xmh ~]# stat test.txt
  File: ‘test.txt’
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d    Inode: 33654120    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-02-04 01:38:18.689507768 +0800
Modify: 2019-02-04 01:38:18.689507768 +0800
Change: 2019-02-04 01:38:18.689507768 +0800
 Birth: -

访问时间:atime,查看内容 
修改时间:mtime,修改内容 
改变时间:ctime,⽂件属性,⽐如权限 
删除时间:dtime,⽂件被删除的时间

3.⽂件⽬录复制命令cp

-a:此参数的效果和同时指定"-dpr"参数相同;
-r:递归处理,将指定目录下的所有文件与子目录一并处理(复制目录);
-p:保留源文件/目录的属性不变;
-d:若源文件为链接文件(link file),则复制链接文件属性而非档案本身;
-f:强行复制文件或目录,不论目标文件或目录是否已存在

cp [OPTION]... [-T] SOURCE DEST 
cp [OPTION]... SOURCE... DIRECTORY 
cp [OPTION]... -t DIRECTORY SOURCE...

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

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

//如果复制过程中想保持原来的属性, -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 /etc/hosts  /tmp/
/bin/cp /etc/hosts  /tmp/

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

4.⽂件⽬录移动命令mv

-b:若需覆盖文件,则覆盖前先行备份
-f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i:若目标文件已经存在时,就会询问是否覆盖
-u:若目标文件已经存在,且source(源文件)比较新,才会更新(update)目标文件

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 dir{1..3} /opt/

提示:如果希望带目录拷贝,尽量不要mv /data/root/,移动目录时,源目录结尾不要多余斜线。

5.文件目录删除命令rm

rm [OPTION]... FILE...
-r 递归,删除目录
-f 强制删除文件
-v 详细过程

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

//强制删除⽂件, 不提示
rm anan -f

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

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

//示例1
mkdir /home/dir10
touch /home/dir10/{file2,file3,file4}
rm -f /home/dir10/*   #删除文件,但不包含隐藏文件
ls /home/dir10/ -a
.  ..

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

6.查看文件或目录命令ls

-l:long=长格式,显示文件以及详细信息
-d:directorys查看当前目录的路径
-a:all 显示所有文件(包括隐藏文件),默认.开头的文件都是隐藏,不显示
-F:给不同文件结尾加不同标识
-p:给显示的目录结尾加斜线
-t:按修改时间排序
-r:反转排序,倒序
-i:inode 打印每个文件的索引号
-h:人类可读(以KB为单位显示文件大小)
--time-style=long-iso:格式化时间属性

//显示/tmp目录下的详细信息
ls -l /tmp/

//显示/tmp目录下的隐藏文件
ls -la /tmp/

3. 文件查看命令

1.查看文件内容cat

-A:显示all,等价于-vET
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。

//直接查看文本内容
cat /etc/passwd

//查看文本内容并显示每行的结束符号和TAB符号
cat -A /etc/passwd

// -n 参数查看文本内容并显示行号
cat -n /etc/passwd

//追加数据,(EOF表示文本结束符,可用别的单词表示)
cat >>xmh.txt <<EOF
test
EOF

提示:不能使用cat去查看目录

2.查看文件内容head

-n:数字,指定显示头部内容的行数,可忽略n
-v:总是显示文件名的头信息(例如:==> /etc/passwd <==)
-q:不显示文件名的头信息(默认不显示)

// 直接查看文件头部内容,默认前十行
head /etc/passwd

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

3.查看文件内容tail

-n:数字,指定显示头部内容的行数,可忽略n

//查看文本尾部内容,默认最后十行
tail /etc/passwd

// -f 参数跟随尾部输出而变化
tail -f /var/log/messages

// -n 参数指定查看最后几行
tail -n 5 /etc/passwd

4.查看文件内容more

// 按页一次一屏显示,回车一次一行,空格一次一屏,按q可退出
# more /etc/passwd

5.查看文件内容less
less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。

-N:为内容显示行号

// 回车一次一行,空格一次一屏,按b可以一次回退一屏,按q可退出
less /etc/passwd

// 显示行号方式浏览内容
less -N /etc/passwd

4. 文件下载命令

1.文件下载命令wget

-q:安静的下载(关闭wget输出)
-O:指定下载地址,更改名称
-T:指定超时时间
--spider:网络爬虫
--limit-rate:限速下载

//从网络上下载zabbix3.4的rpm包保存在当前目录
wget https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

//-O 参数下载并以不同的文件名保存
wget -O zabbix-3.4.rpm \
https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

//限速下载网页站点
wget --limit-rate=1K www.baidu.com

2.文件下载命令curl

-I:查看响应header信息
-a:安静的下载
-w:获取状态码

// -o需指定保存的文件名
curl -o zabbix-release-3.4-2.el7.noarch.rpm \
https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

3.文件下载/上传命令sz/rz

rz  #文件上传
sz  #文件下载

5. 命令查找

1.locate查看文件或者目录

//搜索/etc目录下,所有以sh开头的文件
locate /etc/sh

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

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

//查找ls命令所在的绝对路径
which ls

3.whereis查找文件索引数据库下的命令、源文件、man文件。非PATH变量查找,所以查找的面比which要广

whereis ls
whereis -b ls

6. 字符处理命令

1.使用sort排序
很多情况下需要对⽆序的数据进⾏排序, 这时就需要⽤到sort排序了。

sort [OPTION]... [FILE]...
-r:倒序
-n:按数字排序
-t:指定分隔符(默认空格)
-k:指定第⼏列, 指定⼏列⼏字符(指定1,13.1,3.3)

//演示sort的用法,首先创建一个文件
[root@xmh ~]# cat >> sort.txt <<EOF   
b:3
c:2
a:4
e:5
d:1
f:11
EOF

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

//可观察到, sort⽂件具有⼀个特点, 第⼀个字符是字⺟, 第三个字符是数字, 中间是⽤冒号隔开。
//这样我们可以使⽤-t指定分隔符, 使⽤-k指定⽤于排序的列了。
[root@xmh ~]# sort -t ":" -k 2 sort.txt
d:1
f:11        #第⼆⾏为什么是11?不应该按照顺序排列?
c:2
b:3
a:4
e:5

//按照排序的⽅式, 只会看到第⼀个字符,11的第⼀个字符是1, 按照字符来排序确实⽐2⼩。
//如果想要按照数字的⽅式进⾏排序, 需要使⽤ -n参数。
[root@xmh ~]# sort -t ":" -n -k 2 sort.txt
d:1
c:2
b:3
a:4
e:5
f:11

//测试案例,对下面内容进行排序
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

//针对第三列的第⼀个字符,第四列的第⼀个字符到第三个字符排序才是正确
[root@xmh ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr test.txt

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

uniq [OPTION]... [INPUT [OUTPUT]] 
-c 计算重复的⾏

//演示uniq的⽤法, ⾸先创建⼀个⽂件
[root@xmh ~]# cat uniq.txt
abc
123
abc
123

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

//使⽤uniq去除相邻重复的⾏
[root@xmh ~]# cat uniq.txt  |sort |uniq
123
abc

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

3.使⽤cut命令截取某⼀个字段

cut OPTION... [FILE]...
-d:指定分隔符
-f:数字,取第⼏列 –f3,6三列和六列
-c:按字符取(空格也算)

//测试数据, 过滤出⽂件⾥ xiongminghao以及760966297
echo "Im xiongminghao, is QQ 760966297" > xiongminghao.txt

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

//此类问题是运维⼯作中最常见的问题。可以演变成分析⽇志,查看TCP各个状态连接数,查看单IP连接数排名等
[root@xmh ~]# cat web.log
http://www.xiongminghao.com/index.html 
http://www.xiongminghao.com/1.html 
http://post.xiongminghao.com/index.html 
http://mp3.xiongminghao.com/index.html 
http://www.xiongminghao.com/3.html 
http://post.xiongminghao.com/2.html

//实现思路
1.先取值
2.排序 sort
3.去重 uniq
4.统计 uniq -c
5.打印top Number 、head -Number、

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

[root@xmh ~]# cut -d "/" -f 3 web.log  |sort -rn |uniq -c
      3 www.xiongminghao.com
      2 post.xiongminghao.com
      1 mp3.xiongminghao.com

4.使⽤wc统计

wc - print newline, word, and byte counts for each file显示⽂件的⾏、单词与字节统计信息
wc [OPTION]... [FILE]...
-l:显示⽂件⾏数
-c:显示⽂件字节
-w:显示⽂件单词

//统计fstab有多少⾏
[root@xmh ~]# wc -l /etc/fstab
11 /etc/fstab

//显示/etc/services ⽂件⾏号
[root@xmh ~]# wc -l /etc/services
11176 /etc/services

//获取服务进程数
[root@xmh ~]# ps -aux |grep "nginx" |grep -v "grep"  |wc -l
2

//扩展⽅法
[root@xmh ~]# grep -n "." /etc/services
[root@xmh ~]# awk '{print NR $0}' /etc/services
[root@xmh ~]# cat -n /etc/services
[root@xmh ~]# sed '=' /etc/services