Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包

文章目录

  • 其他文章:
  • 2 文件系统命令
    • 2.1 虚拟目录树!!!
    • 2.2 df
    • 2.3 mount
    • 2.4umount
  • 3 系统操作命令
    • 3.1 du!!!
    • 3.2 stat!
    • 3.3 touch!!
  • 4 文本操作命令
    • 4.1cat!!!
    • 4.2head!!
    • 4.3 tail!!!
    • 4.4 管道| !!!
    • 4.5 xargs!!
    • 4.6数据重定向!!!
    • 4.7cut
    • 4.8 sort
    • 4.9 sed !!
    • 4.10 awk
    • 4.11 wc
    • 4.12 vi/vim 编辑器的使用!!!
  • 5 文件压缩与打包

其他文章:

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 列出容量显示
    在这里插入图片描述
    Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第1张图片
    添加-s 参数可以生成指定目录的汇总信息,也就是共占用多大的磁盘空间
du -s ./

添加-h 参数可以显示为人类可以读懂的格式

du -sh ./

将路径写成./*统计当前目录下每项内容占用的磁盘空间信息

du -sh ./*

Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第2张图片
在这里插入图片描述

3.2 stat!

显示文件的元数据

stat /etc/profile

change 和 modify 的不同
modify 指的是文件内容被修改的时间
change 表示文件元数据被修改的时间
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第3张图片

3.3 touch!!

touch 已存在的文件,抹平各个时间
touch 不存在的文件,则创建文件

4 文本操作命令

4.1cat!!!

直接查看一个文件的内容可以使用 cat,tac,nl 这几个指令

cat(concatenate):
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第4张图片
cat 是 concatenate 的缩写,其功能时间一个文件的内容连续的输出。该命令适合看行 数较少的文件。另外,需要查看一般 DOS 文件时,可以通过-A 选项来显示换行符和[tab]。

tac(反向输出):
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第5张图片
与上面的 cat 命令进行比较,是由最后一行先显示。
tac 功能与 cat 类似,但是是由文件最后一行反向连续输出到屏幕上。

nl(添加行号打印):
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第6张图片

nl 可以将输出的文件内容自动的加上行号。
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第7张图片

4.2head!!

head(取出前面几行,Centos6.5 使用/etc/man.config 文件):
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第8张图片

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 个字段
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第9张图片
输出前两列内容:
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第10张图片
输出字段 3 到最后一个字段
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第11张图片
指定输出的分隔符:
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第12张图片
输出第 7 个字段:
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第13张图片
如果有的行没有分隔符,则输出会包含脏数据
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第14张图片
可以使用-s 选项:
不打印没有分隔符的行:
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第15张图片
显示 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

默认字典序排序
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第16张图片
指定字段分隔符,按照第 2 个字段的字典序排序
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第17张图片
指定字段分隔符,按照第 3 个字段的值数值序排序
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第18张图片

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"
Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第19张图片

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 描述

对每个文件输出行、单词、和字节统计数,如果指定了多于一个文件则还有一个 行数的总计。没有指定文件或指定的
文件是 -,则读取标准输入。 
  1. -c, --bytes, --chars 输出字节统计数。
  2. -l, --lines 输出换行符统计数。
  3. -L, --max-line-length 输出最长的行的长度。
  4. -w, --words 输出单词统计数。
  5. –help 显示帮助并退出
  6. –version 输出版本信息并退出
    Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第20张图片

4.12 vi/vim 编辑器的使用!!!

Linux——(2)文件系统、系统操作、文本操作命令、文件压缩与打包_第21张图片

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

你可能感兴趣的:(#,Linux操作,shell,linux,java)