文章目录
其他文章:
Linux——(1)基本命令
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包
2 文件系统命令
2.1 虚拟目录树!!!
虚拟目录树的各个目录用途
目录 | 用途 |
---|---|
/ | 虚拟目录的根目录。通常不会在这里存储文件 |
/bin | 二进制目录,存放许多用户级的 GNU 工具 |
/boot | 启动目录,存放启动文件 |
/dev | 设备目录,Linux 在这里创建设备节点 |
/etc | 系统配置文件目录 |
/home | 主目录,Linux 在这里创建用户目录 |
/lib | 库目录,存放系统和应用程序的库文件 |
/media | 媒体目录,可移动媒体设备的常用挂载点 |
/mnt | 挂载目录,另一个可移动媒体设备的常用挂载点 |
/opt | 进程目录,存放现有硬件及当前继承的相关信息 |
/proc | 虚拟目录的根目录。通常不会在这里存储文件 |
/root | root 用户的主目录 |
/sbin | 系统二进制目录,存放许多 GNU 管理员级工具 |
/srv | 服务目录,存放本地服务的相关文件 |
/sys | 系统目录,存放系统硬件信息的相关文件 |
/tmp | 临时目录,可以在该目录中创建和删除临时工作文件 |
/usr | 大量用户级的 GNU 工具和数据文件都存储在这里 |
/var | 可变目录,用以存放经常变化的文件,比如日志文件 |
2.2 df
查看系统挂载的磁盘情况
df
以人能看懂的格式显示
df -h
列出根目录下的内容
ls /
进到 boot 目录
cd /boot
在 linux 中用到了虚拟目录树,它的存在就是为了解耦应用和底层存储。
2.3 mount
将光驱挂载到/mnt 目录:
mount /dev/cdrom /mnt
进入到/mnt 目录
cd /mnt
查看磁盘分区的挂载情况:
df -h
2.4umount
卸载掉挂载的分区/mnt
umount /mnt
注意卸载/mnt 时,当前目录不能在/mnt 下面,否则报出如下图所示提示:
再次查看磁盘分区的挂载情况:
df -h
重新挂载
mount /dev/cdrom /mnt
如果没有挂载,则访问父目录的文件夹
再次查看
df -h
3 系统操作命令
3.1 du!!!
du 可以为目录递归地汇总每个 FILE 的磁盘使用情况。
• du:文件系统的磁盘使用量或是目录使用量
- a :列出所有的文件与目录容量
- h :以人们较易读的容量格式(G/M)显示 重要
- s :列出总量而已,而不列出每个各别的目录占用容量
- k :以 KBytes 列出容量显示
-
m :以 MBytes 列出容量显示
添加-s 参数可以生成指定目录的汇总信息,也就是共占用多大的磁盘空间
du -s ./
添加-h 参数可以显示为人类可以读懂的格式
du -sh ./
将路径写成./*统计当前目录下每项内容占用的磁盘空间信息
du -sh ./*
3.2 stat!
显示文件的元数据
stat /etc/profile
change 和 modify 的不同
modify 指的是文件内容被修改的时间
change 表示文件元数据被修改的时间
3.3 touch!!
touch 已存在的文件,抹平各个时间
touch 不存在的文件,则创建文件
4 文本操作命令
4.1cat!!!
直接查看一个文件的内容可以使用 cat,tac,nl 这几个指令
cat(concatenate):
cat 是 concatenate 的缩写,其功能时间一个文件的内容连续的输出。该命令适合看行 数较少的文件。另外,需要查看一般 DOS 文件时,可以通过-A 选项来显示换行符和[tab]。
tac(反向输出):
与上面的 cat 命令进行比较,是由最后一行先显示。
tac 功能与 cat 类似,但是是由文件最后一行反向连续输出到屏幕上。
nl(添加行号打印):
nl 可以将输出的文件内容自动的加上行号。
4.2head!!
head(取出前面几行,Centos6.5 使用/etc/man.config 文件):
4.3 tail!!!
命令格式:tail [ -n number] 文件
选项与参数:
- n:后面接数字,代表显示几行的意思
-
f:表示持续侦测后面文件内容的改变,知道按下 Ctrl+c 才会结束 tail 的侦测。
默认情况下显示最后 10 行:
[root@node1 ~]# tail profile
如果先要显示最后 20 行,就要如下:
[root@node1 ~]# tail -n 20 profile
[root@node1 ~]# tail -f profile
4.4 管道| !!!
[root@bk1 ~]# ps -aux |grep ssh
[root@bk1 ~]# yum list |grep mysql
如何显示文件中间的几行?
[root@node1 ~]# head -n 20 profile |tail -n 10
可以省略为:
[root@node1 ~]# head -20 profile |tail -10
管道左侧的输出作为右侧的输入
echo “/” | ls -l 显示内容错误(不是预期的结果),因为 ls 不需要输入,只需要参数
4.5 xargs!!
将前面输出作为后面命令的参数
echo "/" | xargs ls -l
• xargs:命令
- 1,在标准输入中读取到的内容!
-
2,自己的参数理解为一个字符串
• 模仿 shell,做 blank 切分,第一个子字符串为命令 - 3,将步骤 1 的内容做为步骤 2 的命令的选项参数拼接起来
- 4,执行得到的结果
4.6数据重定向!!!
- 标准输入(stdin):编号为 0
- 标准输出(stdout):编号为 1
- 标准错误输出(stderr):编号为 2
- 1>:以覆盖的方法,将正确的数据输出到文件;
- 1>>:以累加的方法,将正确的数据输出到文件;
- 2>:以覆盖的方法,将错误输出的数据输出到文件;
- 2>>:以累加的方法,将错误输出的数据输出到文件;
ls -l >> ok1.log
ls -l > ok2.log
ls hello 2>/root/err.log
ls hello / 1>/root/log.log2>/root/err.log
ls 1>/dev/null
ls 2>/tmp/err.log
既向控制台输出,也向文件写入
ls -l / | tee ok2.log
tee 命令,将输入分成两个输出
4.7cut
cut:显示切割的行数据
- s:不显示没有分隔符的行
- d:指定分隔符对源文件的行进行分割
-
-f 选定显示哪些列
• m-n m 列到 n 列
• -n 第一列到 n 列
• m- 第 m 列到最后一列
• n 第 n 列
• x,y,z 获取第 x,y,z 列
以:作为分隔符,切割 passwd,输出从第 3 个字段到第 5 个字段
输出前两列内容:
输出字段 3 到最后一个字段
指定输出的分隔符:
输出第 7 个字段:
如果有的行没有分隔符,则输出会包含脏数据
可以使用-s 选项:
不打印没有分隔符的行:
显示 1,3,7 列
– output-delimiter 指定输出的时候的各字符分隔符
4.8 sort
排序:字典序和数值序
sort:排序文件的行
- n:按数值排序
- r:倒序 reverse
- t:自定义分隔符
- k:选择排序列
- f:忽略大小写
sort.txt
a b 1
dfdsa fdsa 15
fds fds 6
fdsa fdsa 8
fda s 9
aa dd 10
h h 11
默认字典序排序
指定字段分隔符,按照第 2 个字段的字典序排序
指定字段分隔符,按照第 3 个字段的值数值序排序
4.9 sed !!
sed:行编辑器
sed [选项] ‘AddressCommand’ file…
-
-i:直接修改源文件
-
-r:表示使用扩展正则表达式
-
d:删除符合条件的行
-
a\string:在指定的行后追加新行,内容为 string
\n:用于换行
-
i\string:在指定行前添加新行,内容是 string
-
s/string1/string2/:查找并替换,默认只替换每行第一次模式匹配到的字符串
g:行内全局替换 i:忽略大小写 s///,s###,s@@@:用于避免字符冲突 \(\) \1\2
sed:行编辑器 Address
- 可以不指定
- 给定范围
-
查找指定行/str/
sed.txt
第一行下插入一行
sed "1a\hello world" sed.txt
直接修改文件
sed -i "1a\hello world" sed.txt
删除第 2 行
sed -i "2d" sed.txt
删除文档中的每一行
sed "d" sed.txt
原来的内容要打印,匹配的行要打印,找到的行会打印两次
sed "/[0-9]/p" sed.txt
匹配行中包含 0-9 任意一个字符的行,只打印找到的行
sed -n "/[0-9]/p" sed.txt
将 filesystem替换为 FS
sed "s/filesystem/FS/" sed.txt
忽略大小写
sed "s/filesystem/FS/i" sed.txt
不仅忽略大小写还要行内全局替换
sed "s/filesystem/FS/gi" sed.txt
cp /etc/inittab ./
将文件中的默认运行级别改为 5
sed "s/[0-6]/5/" inittab
发现将所有匹配的都修改了(注意并未修改原文件),匹配访问太广了。
更精确匹配方案的写法应该为如下命令:
sed "s/id:[0-6]:initdefault:/5/" inittab
但是还存在问题,匹配后被修改内容问匹配出的部分,范围过大。解决办法:
反向引用
sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab
分析:
sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab
id:num:initdefalut: \15\2
id:5:initdefault:
也可以写成:
sed -r "s/(id:)[0-6](:initdefault:)/\15\2/" inittab
./edit_inittab.sh
查找/etc/profile 中包含 PATH 的行,将这些行写到指定的文件:hello.log 中
sed -n "/PATH/w hello.log" /etc/profile
4.10 awk
awk:
- awk 是一个强大的文本分析工具
- 相对于 grep 查找,sed 编辑,awk 在对数据分析并生成报告时更为强大
-
awk 把文件逐行读入,以
空格
和
制表符
作为默认分隔符将每行切片,切开的部分 再进行各种分析处理。
awk -F [’:’] ‘{pattern + action}’ filename
-
支持自定义分隔符
-
支持正则表达式匹配
-
支持自定义变量,数组 a[1] a[tom] map(key)
-
支持内置变量
FS 设置输入域分隔符,等价于命令行 -F 选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
-
支持函数
-
print、split、substr、sub、gsub
-
支持流程控制语句,类 C 语言
-
if、while、do/while、for、break、continue
搜索/etc/passwd 有 root 关键字的所有行
cp /etc/passwd ./
awk '/root/ { print $0}' passwd
统计/etc/passwd 文件中,每行的行号,每行的列数,对应的完整行内容
awk -F ':' '{print NR "-" NF "-" $0}' passwd
只是显示/etc/passwd 的账户:
awk -F':' '{print $1}' passwd
只是显示/etc/passwd 的账户和账户对应的 shell,而账户与 shell 之间以逗号分割,
awk -F':' '{print $1 "," $7}' passwd
制表符拼接字段
awk -F':' ' { print $1"\t" $7} ' passwd
在所有行开始前添加列名 name,shell,在最后一行添加”shell,end”
awk -F ":" '
BEGIN{
print "name,shell"
}
{
print $1","$7
}
END{
print "shell,end"
}
' passwd
• 案例报表统计:合计每人 1 月总消费,0:manager,1:worker
Tom 0 2020-10-11 car 3000
John 1 2020-01-13 bike 1000
vivi 1 2020-01-18 car 2800
Tom 0 2020-01-20 car 2500
John 1 2020-01-28 bike 3500
解决方案:
awk '{
split($3,date,"-")
}
END{
for(i in date){
print i"\t"date[i]
}
}
' emp.txt
角色处理:
if $2 ==0
map_name_role[$1] = “manager”
else
map_name_role[$1] = “worker”
整合:
awk '{
split($3, date, "-")
if (date[2] == "01"){
map_name_sala[$1]+=$5
if($2=="0"){
map_name_role[$1]="Manager"
}else{
map_name_role[$1]="Worker"
}
}
}
END{
for(name in map_name_sala){
print name"\t"map_name_sala[anme]"\t"map_name_role[name]
}
}' awk.txt
4.11 wc
wc [选项列表]… [文件名列表]…
DESCRIPTION 描述
对每个文件输出行、单词、和字节统计数,如果指定了多于一个文件则还有一个 行数的总计。没有指定文件或指定的
文件是 -,则读取标准输入。
- -c, –bytes, –chars 输出字节统计数。
- -l, –lines 输出换行符统计数。
- -L, –max-line-length 输出最长的行的长度。
- -w, –words 输出单词统计数。
- –help 显示帮助并退出
-
–version 输出版本信息并退出
4.12 vi/vim 编辑器的使用!!!
i 进入编辑模式
a 在选定字符后插入字符
o 在当前行下添加新行
O 在当前行上添加新行
I 在当前行首进入编辑模式
A 在当前行末进入编辑模式
ESC 退出编辑模式
: 末行模式
ESC,ESC 退出末行模式
ZZ 在命令模式保存并退出编辑器
:wq 保存并退出编辑器
:w 保存编辑器内容
:q! 不保存退出编辑器
移动光标
h 左 j 下 k 上 l 右
w 移动到下一个单词的词首
e:跳至当前或下一个单词的词尾
b:跳至当前或下一个单词的词首
0:绝对行首
^:行首的第一个非空白字符
$:绝对行尾
G:文档末尾
3G:第三行
gg:文档开头
ctrl-f 向下翻页 forward
ctrl-b 向上翻页 backward
删除替换单个字符
x:删除光标位置字符
3x:删除光标开始 3 个字符
r:替换光标位置字符
dw 删除单词
dd 删除整行
D:删除光标所在位置到行尾
yw 复制单词
yy 复制 1 行
nyy 复制 n 行,n 是数字
p 粘贴 paste
u:撤销 undo
ctrl+r:重做 操作结束后使用 u 退回到上次操作,则 ctrl+r 重做 . 重复上一步操作
set:设置
:set nu number 显示行号
:set nonu nunumber 取消行号的显示
:set readonly 设置只读
:/after
n,N
?向上查找
:! 执行命令
查找并替换
s/str1/str2/gi
/:临近 s 的第一个为边界字符 :/ @ #(为了防止内容和边界字符重复,可以使用 @和#做边界字符)
g:一行内全部替换
i:忽略大小写
n:行号
.:当前光标行
+n:偏移 n 行
$:末尾行,$-3
%:全文 :%d 删除全文
:.,$-1d 从当前行删除到倒数第二行
:.,+3d 从当前行再往下数三行删除
:.,13d 从当前行到第 13 行删除
5 文件压缩与打包
压缩:指通过某些算法,将文件尺寸进行相应的缩小,同时不损失文件的内容。
打包:指将多个文件(或目录)合并成一个文件,方便传递或部署。
压缩文件或打包文件常见的扩展名:
*.tar.gz, *.tar.bz2;
linux 系统一般文件 的扩展名用途不大,但是压缩或打包文件的扩展名是必须的,因为 linux 支持的压缩命令 较多,不同的压缩技术使用的压缩算法区别较大,根据扩展名能够使用对应的解压算法。
常见文件扩展名:
- *.tar.gz tar 程序打包的文件,并且经过 gzip 的压缩
- *.tar.bz2 tar 程序打包的文件,并且经过 bzip2 的压缩
TAR 命令,选项与参数:
- -c :建立打包文件,
- -t :查看打包文件的内容含有哪些文件
- -x :解打包或解压缩的功能,可以搭配-C(大写)在特定到特定目录解开
- -j :通过 bzip2 的支持进行压缩/解压缩:此时文件最好为 *.tar.bz2
- -z :通过 gzip 的支持进行压缩/解压缩:此时文件最好为 *.tar.gz
- -v :在压缩/解压缩的过程中,将正在处理的文件名显示出来
- -f filename:-f 后面跟处理后文件的全名称(路径+文件名+后缀名)
- -C 目录:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个 选项 -p :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
注意 -c, -t, -x 不可同时出现在一串指令列中
TAR 常用的指令组合!!!
-
打包与压缩:
tar –zcv –f [/路径/]filename.tar.gz 被压缩的文件或目录
tar –jcv –f [/路径/] filename.tar.bz2 被压缩的文件或目录
练习:将/etc 目录下的所有文件打包并压缩/tmp/part1/tar/etc01.tar.gz
将/etc 目录下的所有文件打包并压缩/tmp/part1/tar/etc02tar.bz2
- 查询:
tar –ztv –f [/路径/] filename.tar.gz
tar –jtv –f [/路径/] filename.tar.bz2
- 备份:
tar –zpcv –f [/路径/]filename.tar.gz 被备份文件或目录
tar –jpcv –f [/路径/]filename.tar.bz2 被备份文件或目录
- 解压到当前目录:
tar –jxv –f [/路径/] filename.tar.bz2
tar –zxv –f [/路径/] filename.tar.gz
- 解压到指定目录:
tar -jxv -f [/路径/] filename.tar.bz2 –C 指定目录
tar -zxv -f [/路径/] filename.tar.gz -C 指定目录
-
注意:filename 前带路径表示该路径下的,反之表示当前目录下
- 将/etc 压缩到/tmp/下 etc01.tar.gz
- 方式一:filename.tar.gz 前不带路径
[root@node1 ~]# cd /tmp/
[root@node1 tmp]# tar -zcvf etc01.tar.gz /etc/
- 方式二:filename.tar.gz 前带路径
[root@node1 ~]# tar -zcvf /tmp/etc01.tar.gz /etc
- 将/tmp/下 etc01.tar.gz 解压到/tmp/目录下
[root@tedu ~]# cd /tmp/ #首先进入对应目录
[root@tedu tmp]# tar -zxvf etc01.tar.gz
- 将/tmp/下 etc01.tar.gz 解压到/usr/目录下
[root@tedu tmp]# tar -zxvf etc01.tar.gz -C /usr 或者
[root@tedu tmp]# tar -zxvC /usr -f etc01.tar.gz
下面是本人的公众号:(有兴趣可以扫一下,文章会同步过去)
我是小白弟弟,一个在互联网行业的小白,立志成为一名架构师
https://blog.csdn.net/zhouhengzhe?t=1