Linux基础实验
引用希翼平台Linux基础实验
目录
一、Linux文件和目录
mkdir(创建目录)
语法:
mkdir [-mp] 目录名称
选项和参数:
- -m :配置文件的权限
- -p :递归地创建目标目录及全部的上层目录
示例:
root@cg:~/base/dirandfile# mkdir testroot@cg:~/base/dirandfile# mkdir test1/test2/test3/test4mkdir: cannot create directory 'test1/test2/test3/test4': No such file or directoryroot@cg:~/base/dirandfile# mkdir -p test1/test2/test3/test4root@cg:~/base/dirandfile#
可以看到有了-p选项之后,可以递归地创建出所需要目录的上层目录。
root@cg:~/base/dirandfile# ls -ltotal 8drwxr-xr-x 2 root root 4096 Feb 16 14:42 testdrwxr-xr-x 3 root root 4096 Feb 16 14:43 test1root@cg:~/base/dirandfile# mkdir -m 711 test2root@cg:~/base/dirandfile# ls -ltotal 12drwxr-xr-x 2 root root 4096 Feb 16 14:42 testdrwxr-xr-x 3 root root 4096 Feb 16 14:43 test1drwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile#
如果没有设置-m选项,那么该目录将被设置为默认权限,在上例中该目录通过-m 711设置为了drwxr-sr-x权限。
ls(列出目录)
语法:
ls [-aAdfFhilnrRSt] 目录名称
ls [–color={never,auto,always}] 目录名称
ls [–full-time] 目录名称
选项和参数:
- -a :全部的文件,包括隐藏文件
- -d :仅列出目录
- -l :列出详细的文件属性
示例:
root@cg:~/base/dirandfile# ls -ltotal 12drwxr-xr-x 2 root root 4096 Feb 16 14:42 testdrwxr-xr-x 3 root root 4096 Feb 16 14:43 test1drwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile#
pwd (显示目前所在的目录)
pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的命令。
语法:
pwd
示例:
显示出当前目录的绝对路径:
root@cg:~/base/dirandfile# pwd/headless/base/dirandfileroot@cg:~/base/dirandfile#
cd (切换目录)
cd是Change Directory的缩写,这是用来变换工作目录的命令。
语法:
cd [相对路径或绝对路径]
示例:
使用绝对路径切换到 test2 目录
root@cg:~/base/dirandfile# cd /headless/base/dirandfile/test2
…表示回到当前目录的上一级目录
root@cg:~/base/dirandfile/test2# cd ..
使用相对路径切换到 test2 目录
root@cg:~/base/dirandfile# cd ./test2
~表示自己的家目录,cd ~表示回到家目录,亦即是 /headless 这个目录
root@cg:~/base/dirandfile# cd /headless/base/dirandfile/test2root@cg:~/base/dirandfile/test2# cd ..root@cg:~/base/dirandfile# cd ./test2root@cg:~/base/dirandfile/test2# cd ~root@cg:~# pwd/headless
-表示切换到当前目录之前的目录
root@cg:~# cd -/headless/base/dirandfile/test2root@cg:~/base/dirandfile/test2# pwd/headless/base/dirandfile/test2root@cg:~/base/dirandfile/test2#
rmdir (删除空的目录)
语法:
rmdir [-p] 目录名称
选项与参数:
-p :连同上一级『空的』目录也一起删除
示例:
可直接删除空目录
root@cg:~/base/dirandfile# ls -ltotal 12drwxr-xr-x 2 root root 4096 Feb 16 14:51 testdrwxr-xr-x 3 root root 4096 Feb 16 14:56 test1drwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile# rmdir testroot@cg:~/base/dirandfile# ls -ltotal 8drwxr-xr-x 3 root root 4096 Feb 16 14:56 test1drwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile#
非空目录无法删除
root@cg:~/base/dirandfile# rmdir test1rmdir: failed to remove 'test1': Directory not empty
递归地删除test1/test2/test3/test4
root@cg:~/base/dirandfile# rmdir -p test1/test2/test3/test4root@cg:~/base/dirandfile# ls -ltotal 4drwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile#
touch (创建新文件)
一是创建新的空文件
二是修改已存在文件的时间戳
语法:
touch [-acdfmrt] 文件名称
选项与参数:
- -a 或–time=atime或–time=access或–time=use 只更改存取时间。
- -c 或–no-create 不建立任何文档。
- -d 使用指定的日期时间,而非现在的时间。
- -f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
- -m 或–time=mtime或–time=modify 只更改变动时间。
- -r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
- -t 使用指定的日期时间,而非现在的时间。
示例:
创建新文件
root@cg:~/base/dirandfile# touch file1.txtroot@cg:~/base/dirandfile# ls -ltotal 4-rw-r--r-- 1 root root 0 Feb 16 15:00 file1.txtdrwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile# touch file2.txtroot@cg:~/base/dirandfile# ls -ltotal 4-rw-r--r-- 1 root root 0 Feb 16 15:00 file1.txt-rw-r--r-- 1 root root 0 Feb 16 15:04 file2.txtdrwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile#
修改文件的时间戳
root@cg:~/base/dirandfile# ls -ltotal 4-rw-r--r-- 1 root root 0 Feb 16 15:00 file1.txt-rw-r--r-- 1 root root 0 Feb 16 15:04 file2.txtdrwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile# touch -t 202002161300 file1.txtroot@cg:~/base/dirandfile# ls -ltotal 4-rw-r--r-- 1 root root 0 Feb 16 13:00 file1.txt-rw-r--r-- 1 root root 0 Feb 16 15:04 file2.txtdrwx--x--x 2 root root 4096 Feb 16 14:44 test2root@cg:~/base/dirandfile#
cp (复制文件或目录)
cp 即拷贝文件和目录
语法:
cp [-adfilprsu] source destination
cp [options] source1 source2 source3 … directory
选项与参数:
- -a:相当于同时使用-pdr
- -d:若源文件为链接文件,则复制链接文件属性而非文件本身
- -f:强制复制文件或目录,无论目标文件或目录是否已经存在
- -i:若目标文件已存在,覆盖时会先询问
- -l:复制为硬链接
- -p:连同文件的属性一起复制过去
- -r:递归地复制各层目录
- -s:复制为软链接
- -u:若目标文件比源文件旧才升级目标文件
示例:
root@cg:~/base/dirandfile# cp file1.txt test2/root@cg:~/base/dirandfile# cp -i file1.txt test2/cp: overwrite 'test2/file1.txt'? nroot@cg:~/base/dirandfile#
rm (移除文件或目录)
语法:
rm [-fir] 文件或目录
选项与参数:
- -f :强制执行删除操作,不发出警告;
- -i :删除前会请求确认
- -r :递归删除,用于删除多层目录
示例:
root@cg:~/base/dirandfile# rm -i file1.txt rm: remove regular empty file 'file1.txt'? yroot@cg:~/base/dirandfile# ls -ltotal 4-rw-r--r-- 1 root root 0 Feb 16 15:04 file2.txtdrwx--x--x 2 root root 4096 Feb 16 15:06 test2root@cg:~/base/dirandfile#
mv (移动文件与目录,或修改名称)
语法:
mv [-fiu] 源 目标
mv [options] 源1 源2 源3 … 目标
选项与参数:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i :若目标文件已存在,覆盖时会先询问
- -u :若目标文件已经存在,且 source 比较新,才会升级 (update)
示例:
root@cg:~/base/dirandfile# mkdir testroot@cg:~/base/dirandfile# mv file2.txt testroot@cg:~/base/dirandfile# ls -ltotal 8drwxr-xr-x 2 root root 4096 Feb 16 15:09 testdrwx--x--x 2 root root 4096 Feb 16 15:06 test2root@cg:~/base/dirandfile# mv test test1root@cg:~/base/dirandfile# ls -ltotal 8drwxr-xr-x 2 root root 4096 Feb 16 15:09 test1drwx--x--x 2 root root 4096 Feb 16 15:06 test2root@cg:~/base/dirandfile# mv test2 test1root@cg:~/base/dirandfile# ls -ltotal 4drwxr-xr-x 3 root root 4096 Feb 16 15:10 test1root@cg:~/base/dirandfile# ls -l test1total 4-rw-r--r-- 1 root root 0 Feb 16 15:04 file2.txtdrwx--x--x 2 root root 4096 Feb 16 15:06 test2root@cg:~/base/dirandfile#
二、Linux文本文件
将文件file.txt和longfile.txt复制到本实验工作目录中:
$ cp file.txt longfile.txt text
Linux系统中使用以下命令来查看文件的内容:
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示文本内容
- nl 显示文本内容同时输出行号
- more 一页一页的显示文件内容
- less 与 more 类似,但可以向前翻页
- head 只看头几行
- tail 只看末端几行
cat
由第一行开始显示文件内容
语法:
cat [-AbEnTv]
选项与参数:
- -A :相当于同时使用-vET
- -b :列出非空白行的行号
- -E :将结尾的断行字节$显示出来;
- -n :列出全部行的行号
- -T :将 [tab] 按键以 ^I 显示出来;
- -v :列出一些看不出来的特殊字符
tac
与cat命令正好相反,从最后一行开始打印
more
在 more 这个程序的运行过程中,你有几个按键可以按的:
- 空格键 (space) :向下显示一页
- Enter :向下显示一行
head
打印出文件的前几行,默认是前10行
语法:
head [-n number] 文件
选项和参数:
- -n :后面接数字,代表显示几行的意思
tail
取出文件后面几行
语法:
tail [-n number] 文件
选项与参数:
- -n :后面接数字,代表显示几行的意思
- -f :实时查看被添加到一个文件中的内容
nl
输出内容时顺便打印行号
语法:
nl [-bn] 文件
选项与参数:
- -b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t :如果有空行,空的那一行不要列出行号(默认值) - -n ln :行号在萤幕的最左方显示:
-n rn :行号在自己栏位的最右方显示,且不加 0
-n rz :行号在自己栏位的最右方显示,且加 0
实验
请在本实验工作目录下完成。在命令后添加"> 文件名"将内容输出到文件中。
cd ~/basemkdir textcp file.txt longfile.txt textcd text
任务一:
从最后一行开始显示longfile.txt内容并输出到文件text_1.txt中(25分)。
tac longfile.txt > text_1.txt
任务二:
使用more查看文件longfile.txt内容并输出到文件text_2.txt中(25分)。
more longfile.txt > text_2.txt
任务三:
查看longfile.txt的后30行内容,并输出到文件text_3.txt中(25分)。
tail -n 30 longfile.txt > text_3.txt
任务四:
输出longfile.txt的内容并显示行号,行号在栏位的最右方显示且补0,将结果输出到文件text_4.txt中(25分)。
nl -n rz longfile.txt > text_4.txt
三、用户与群组管理
Linux用户管理–用户的添加
语法:
useradd [-cdgGsu] 用户名
选项与参数:
- -c 添加备注文字,将添加到passwd的备注栏位
- -d 指定用户主目录,若该目录不存在,可以使用-m创建
- -g 指定用户所属的用户组
- -G 指定用户所属的附加组
- -s 指定用户登录后使用的Shell
- -u 指定用户的用户号
示例:
添加用户sam,并指定家目录为/home/sam
root@db2e7b5ec045:~/Desktop# useradd -d /home/sam -m samroot@db2e7b5ec045:~/Desktop# su samsam@db2e7b5ec045:/headless/Desktop$ cd ~sam@db2e7b5ec045:~$ pwd/home/samsam@cg:~$ exitexitroot@cg:~/Desktop#
useradd添加用户时,默认会为用户创建一个与用户同名的用户组。
-g 选项表示不为用户创建新组, 而使用 -g 后的指定用户组。
-G 后面跟一个用户组列表,使用户属于指定的多个用户组。
root@cg:~/Desktop# groupadd hadoop1root@cg:~/Desktop# groupadd hadoop2root@cg:~/Desktop# groupadd hadoop3root@cg:~/Desktop# useradd -s /bin/bash -g hadoop1 -G hadoop2,hadoop3 tomroot@cg:~/Desktop# groups tomtom : hadoop1 hadoop2 hadoop3
首先使用groupadd 创建了hadoop1、hadoop2、hadoop3三个组。然后,添加tom用户,将tom添加到这三个组中。
groups命令可查看某个用户属于哪些组。
Linux用户管理–用户的删除
语法:
userdel -r 用户名
选项与参数:
- -r 将用户的主目录一并删除
示例:
root@cg:~/Desktop# useradd -s /bin/bash -d /home/lucy -m lucyroot@cg:~/Desktop# ls -l /hometotal 8drwxr-xr-x 2 lucy lucy 4096 Feb 17 12:17 lucydrwxr-xr-x 2 sam sam 4096 Feb 17 12:10 samroot@cg:~/Desktop# userdel lucyroot@cg:~/Desktop# userdel -r samuserdel: sam mail spool (/var/mail/sam) not foundroot@cg:~/Desktop# ls -l /hometotal 4drwxr-xr-x 2 1002 1004 4096 Feb 17 12:17 lucyroot@cg:~/Desktop#
此命令将删除该用户在系统文件中的记录,同时删除用户主目录。
Linux用户管理–用户的修改
修改用户的一些属性,如用户号、主目录、用户组、登录Shell等。
语法:
usermod [-cdgGsu] 用户名
选项与参数:
- -l 用于重命名该用户 其余参数与useradd命令基本类似
示例:
root@cg:~/Desktop# useradd -s /bin/bash -d /home/test -g hadoop1 testroot@cg:~/Desktop# id testuid=1002(test) gid=1001(hadoop1) groups=1001(hadoop1)root@cg:~/Desktop# cat /etc/passwd | grep testtest:x:1002:1001::/home/test:/bin/bashroot@cg:~/Desktop# mkdir /home/test_newroot@cg:~/Desktop# usermod -s /bin/ksh -d /home/test_new -g hadoop2 testroot@cg:~/Desktop# id testuid=1002(test) gid=1002(hadoop2) groups=1002(hadoop2)root@cg:~/Desktop# cat /etc/passwd | grep testtest:x:1002:1002::/home/test_new:/bin/kshroot@cg:~/Desktop#
可以看到,使用usermod对test用户的默认shell、家目录、所归属的组都做了修改。
注意:/etc/passwd文件中存储了每个用户的基本信息。
Linux用户管理–用户密码的设置和修改
新用户被创建时没有密码,但是被系统锁定,不能使用,必须设置口令才能使用。
语法:
passwd [-ludf] 用户名
选项与参数:
- -l 锁定用户
- -u 解锁用户
- -d 取消密码设置
示例:
创建新用户sam
root@cg:~/Desktop# useradd -d /home/sam -m samroot@cg:~/Desktop#
在root用户下可以设置其他用户的密码,如给sam用户设置为sam123456
root@cg:~/Desktop# passwd samEnter new UNIX password: Retype new UNIX password: passwd: password updated successfullyroot@cg:~/Desktop#
切换到tom用户,使用tom切换到sam账户,输入密码:sam123456登录。
root@cg:~/Desktop# su tomtom@cg:/headless/Desktop$ su samPassword: sam@cg:/headless/Desktop$
sam用户可修改自己的密码,将密码修改为helloworld。
用户修改自己的密码前需要先输入当前的密码:
sam@cg:/headless/Desktop$ passwd Changing password for sam.(current) UNIX password: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfullysam@cg:/headless/Desktop$
连续输入两次exit命令切换回root用户,再将sam用户密码置为空, 置空后,无法登录。
sam@cg:/headless/Desktop$ exitexittom@cg:/headless/Desktop$ exitexitroot@cg:~/Desktop# passwd -d sampasswd: password expiry information changed.root@cg:~/Desktop# su tomtom@cg:/headless/Desktop$ su samPassword: su: Authentication failuretom@cg:/headless/Desktop$
重新为sam设置密码为:sam123456
root@cg:~/Desktop# passwd -u sampasswd: unlocking the password would result in a passwordless account.You should set a password with usermod -p to unlock the password of this account.root@cg:~/Desktop# passwd samEnter new UNIX password: Retype new UNIX password: passwd: password updated successfullyroot@cg:~/Desktop# su tomtom@cg:/headless/Desktop$ su samPassword: sam@cg:/headless/Desktop$
加 -l 可锁定某一用户,使其无法登录,使用 -l 锁定 sam
sam@cg:/headless/Desktop$ exitexittom@cg:/headless/Desktop$ exitexitroot@cg:~/Desktop# passwd -l sampasswd: password expiry information changed.root@cg:~/Desktop# su tomtom@cg:/headless/Desktop$ su samPassword: su: Authentication failuretom@cg:/headless/Desktop$
使用 -u 可对用户解锁,
tom@cg:/headless/Desktop$ exitexitroot@cg:~/Desktop# passwd -u sampasswd: password expiry information changed.root@cg:~/Desktop# su tomtom@cg:/headless/Desktop$ su samPassword: sam@cg:/headless/Desktop$
Linux用户组管理–用户组的添加
语法:
groupadd [-go] 用户组名
选项与参数:
- -g 指定新用户组的标识号
- -o 使新用户组标示号可以与旧用户组的相同
示例:
groupadd group1 groupadd -g 101 group2
Linux用户组管理–用户组的删除
cd是Change Directory的缩写,这是用来变换工作目录的命令。
语法:
groupdel 用户组名
示例:
groupdel group1
Linux用户组管理–用户组的修改
语法:
groupmod [-gon] 目录名称
选项与参数:
- -g 为用户组指定新的标识号。
- -o 与-g选项同时使用,用户组的新标示号可以与系统已有用户组的标示号重复。
- -n 修改用户组的名字
示例:
groupmod -g 102 group2groupmod -g 10000 -n group3 group2
Linux用户组管理–用户在所属的用户组之间切换
用户在登录之后,如果其他用户组中包含该用户,可使用newgrp命令切换到其他用户组,以获得其他用户组的权限语法:
newgrp 其他用户组
实验
创建用户组homeworkgroup,并创建用户homeworkuser,使得该用户属于这个用户组(30分)。
groupadd homeworkgroupuseradd -g homeworkgroup homeworkuser
分别修改homeworkuser的用户名为newuser,主目录为/home/anotherhome,用户组为developer(先创建);并修改用户组homeworkgroup标示号为9000(50分)。
groupadd developerusermod -d /home/anotherhome -g developer -l newuser homeworkusergroupmod -g 9000 homeworkgroup
删除任务一中创建的用户和用户组(20分)。
groupdel homeworkgroupuserdel -r newuser
四、文件目录权限管理
Linux用户分类
在Linux系统中,对于文件和目录而言,用户可以分为以下三类:
- 文件或目录的属主
- 与属主同组的用户
- 其他用户(超级管理员除外)
root用户(超级管理员)
root用户是Linux系统中的超级管理员,拥有最大的权限,拥有对文件和目录的全部权限。
权限分类
在Linux系统中,对于文件和目录而言,用户权限分为了以下三类:
- 读权(read) ls、cat、more、head、tail等命令
- 写权(write) cp、mv、rm、touch、mkdir、>>等命令
- 执行权(execute) cd等命令
权限查看
ls -l可查看当前目录下文件和目录的权限。
文件的属性由最左边的10个连续字符确定,具体划分如下图所示:
其中的第一个字符代表的是文件类型,有以下几种:
- d代表目录
- -代表普通文件
- l代表软链接
- b表示块设备
- c表示字符设备
2~4位字符依次代表文件属主的读权、写权、执行权,分别用rwx表示,若没有该权限则用-填充。
5~7位字符依次代表文件属组的读权、写权、执行权。
8~10位字符一次代表其他用户的读权、写权、执行权。
权限更改
语法:
chmod [-R] 权限修改 文件或目录
选项与参数:
- -R 表示递归地修改权限,作用于该目录及其包含的所有文件和目录
命令的施加对象:
- u 表示文件或目录的属主
- g 表示同组其他成员
- o 表示其他用户
- a 表示所有用户
权限的改变:
+
表示增加该权限-
表示取消该权限=
表示把权限更改成后续的值
示例:
chmod u+x,g=rw,o-r file.txt
数字形式
权限的分数对照:
- r:4
- w:2
- x:1
在设置某种用户的权限时,直接将其权限的分数相加即可。
语法:
chmod [-R] xyz 文件或目录
选项与参数:
- -R 表示递归地修改权限,作用于该目录及其包含的所有文件和目录
- x,y,z分别为三种不同用户权限的计算值
示例:
chmod 777 longfile.txt
属主和属组更改
该命令仅由root用户使用!
语法:
chown [–R] 属主名 文件或目录 chown [-R] 属主名:属组名 文件或目录
选项与参数:
- -R 需在更改目录的属主或属组时添加,文件则不需要
示例:
chown root:root longfile.txt
实验
清空本实验工作目录,重新复制文件file.txt和longfile.txt到本实验工作目录(20分)
cd ~cd basemkdir privilegecp file.txt longfile.txt privilegecd privilege
任务一:
对于文件longfile.txt,采用字母形式赋予属主和属组全部权限,取消其他用户全部权限(40分)。
ls -lchmod u=rwx,g=rwx,o--- longfile.txt
任务二:
对于文件file.txt,采用数字形式赋予属主和属组全部权限,取消其他用户全部权限(40分)。
chmod 770 file.txt
五、文件的打包与压缩
文件的打包
文件的打包是指将多个文件打包成一个文件,由于Linux的很多压缩程序只能对一个文件进行压缩,因此首先要将多个文件打包成一个文件,这个过程并不会减小文件占用的磁盘空间,常用的打包命令为tar。
文件的打包–打包
语法:
tar [-cvf] 生成tar包名 将要打包的文件和目录
选项与参数:
- -c 指定打包后的tar包名
- -v 查看打包过程
- -f 指定将要打包的文件和目录
示例:
tar -cvf tar1.tar dir file.txt longfile.txt
文件的打包–解包
语法:
tar [-xvf] 解压的包名 [-C] 解压到的文件夹
选项与参数:
- -x 从打包文件中解压
- -v 查看解压过程
- -f 指定解压的tar包
- -C 指定解压到的文件夹
示例:
rm -rf file.txt longfile.txt dir
解压到默认的当前文件夹
tar -xvf tar1.tar
解压到指定文件夹
tar -xvf tar1.tar -C dir
.gz格式的压缩
gzip只能压缩文件,不能压缩目录。
语法:
gzip [-cdrvlf] 要压缩的文件名
选项与参数:
- -d 解压.gz文件
- -c 保留原文件,并将输出写到标准输出中
- -r 递归地压缩指定的目录
- -v 显示压缩过程信息
- -l 显示压缩文件的详细信息
- -f 强制压缩
示例:
gzip -v longfile.txt
longfile.txt: 46.7% – replaced with longfile.txt.gz
gzip -l longfile.txt.gz
compressed uncompressed ratio uncompressed_name
10930 20435 46.7% longfile.txt
.gz格式的解压
语法:
gunzip [-crvlf] 要解压的.gz文件
选项与参数:
- -c 将解压后的文件写到标准输出
- -r 递归地解压指定的目录
- -v 显示解压过程信息
- -l 显示压缩文件的详细信息
- -f 强制解压
示例:
gunzip -v longfile.txt.gz
longfile.txt.gz: 46.7% – replaced with longfile.txt
.zip格式的压缩
语法:
zip [-drqvx] 压缩包名 将要打包的文件和目录
选项与参数:
- -d 从压缩文件内删除指定的文件
- -r 递归地压缩指定的目录
- -q 不显示压缩过程信息
- -v 显示压缩过程或版本信息
- -x 压缩时排除符合条件的文件
示例:
zip -r dir.zip dir
adding: dir/ (stored 0%)
adding: dir/file.txt (stored 0%)
adding: dir/dir/ (stored 0%)
adding: dir/longfile.txt (deflated 47%)
.zip格式的解压
语法:
unzip [-fndqv] 要解压的.zip文件
选项与参数:
- -f 解压缩时覆盖现有的文件
- -n 解压缩时不覆盖现有的文件
- -d 指定解压到的文件夹
- -q 不显示解压过程信息
- -v 显示解压过程或版本信息
示例:
unzip -f dir.zip
Archive: dir.zip
.bz2格式的压缩
bzip2只能压缩文件,不能压缩目录。
语法:
bzip2 [-zdfv] 要压缩的文件名
选项与参数:
- -z 强制执行压缩
- -d 解压.bz2文件
- -f 压缩时覆盖同名文件
- -v 显示压缩过程或版本信息
示例:
bzip2 -v tar1.tar
tar1.tar: 3.188:1, 2.509 bits/byte, 68.63% saved, 30720 in, 9636 out.
.bz2格式的解压
语法:
bunzip2 [-fkLsvV] 要解压的.bz2文件
选项与参数:
- -f 解压缩时,若要覆盖同名文件,需添加该选项
- -k 解压时保留原压缩文件
- -v 显示解压过程或版本信息
示例:
bunzip2 -kv tar1.tar.bz2
tar1.tar.bz2: done
tar命令的压缩
采用gzip进行压缩:
tar -zcvf .tar.gz 压缩包名 一系列文件或目录
示例:
tar -zcvf compress1.tar.gz dir longfile.txt
dir/
dir/file.txt
dir/dir/
dir/longfile.txt
longfile.txt
采用bzip2进行压缩:
tar -jcvf .tar.bz2 压缩包名 一系列文件或目录
示例:
tar -jcvf compress2.tar.bz2 dir longfile.txt`
dir/
dir/file.txt
dir/dir/
dir/longfile.txt
longfile.txt
tar命令的解压
选项与参数:
- -C 解压到指定的文件夹
解压.tar.gz压缩包:
tar -zxvf .tar.gz压缩包名
示例:
tar -zxvf compress1.tar.gz
解压.tar.bz2压缩包:
tar -jxvf .tar.bz2压缩包名
示例:
tar -jxvf compress2.tar.bz2
实验
只保留本实验工作目录下的dir、file.txt和longfile.txt,删除其他内容。
任务一
将dir压缩为compress1.zip(10分),将file.txt压缩为compress2.tar.gz(20分),将longfile.txt压缩为compress3.tar.bz2(20分)。
zip compress1.zip dirtar -zcvf compress2.tar.gz file.txttar -jcvf compress3.tar.bz2 longfile.txt
任务二
新建文件夹decompress,依次将任务一中的compress1.zip(10分)、compress2.tar.gz(20分)、compress3.tar.bz2(20分)解压到该文件夹下。
mkdir decompressunzip -d decompress/ compress1.ziptar -zxvf compress2.tar.gz -C decompress/tar -jxvf compress3.tar.bz2 -C decompress/
六、文本编辑神器vi
vi介绍
vi是一种工作在Linux上的文本编辑器,全称是Visual Interface。它在字符模式下工作,不需要图形界面。它有三种基本的工作模式:
- 命令模式(Command mode)
- 输入模式(Insert mode)
- 底线命令模式(Last line mode)
命令模式
用户再启动vi后,直接进入了命令模式。在此模式下可以输入各种命令。以下是几种常用的命令:
- i 切换到输入模式,以输入字符
- x 删除当前光标所在处的字符
- : 切换到底线命令模式,以在最底一行输入命令
输入模式
在命令模式下输入i进入输入模式。在输入模式中,可以使用以下按键完成想要的输入:
- 按键输入各种字符
- 方向键 在文本中移动光标
- ENTER 回车键,换行
- BACK SPACE 退格键,删除光标所在位置前的一个字符
- DEL 删除键,删除光标所在位置后的一个字符
- HOME/END 移动光标到行首/行尾
- Page Up/Page Down 上/下翻页
- Insert 切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC 退出输入模式,回到命令模式
底线命令模式
在命令模式下输入:进入底线命令模式,底线命令模式相比普通的命令模式,增加了许多可用的命令,最基本的命令如下:
- q 退出程序
- w 保存文件
- 按下ESC 或回车执行命令退出底线命令模式,回到命令模式
vi工作模式图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRGVM608-1678439687108)(E:\Typora_md\学习文档\课程\大数据课程\assets\158133032811208243846.png)]
实验
在工作目录下创建文件num.txt,在第n行写数量为n的字母依次写完26个字母,如:第一行写a,第二行写b、c,第三行写d、e、f…,每行的字母之间空一格,行末写完后保存离开(100分)。
cd ~/base/text-vivi num.txtab c……v w x y z:wq
七、文本处理神器sed
sed介绍
sed利用脚本来对文件进行处理,是一种非交互的流编辑器,按照脚本的指令来编辑、处理文本文件。其使用场景主要包括以下几种:
- vi编辑困难的文本
- 过于庞大的文本
- 有规律的文本修改
sed语法
sed [-hnV][-e script][-f script文件] 文本文件
选项与参数
- -h 查看帮助
- -n 仅显示处理后的结果
- -V 显示版本信息
- -e 指定处理的脚本命令
- -f 指定处理的脚本命令文件
操作说明
- a 在匹配行后面加入文本
- c :字符替换
- d :删除内容
- i :在匹配行前面加入文本
- p :打印匹配的行
- s/old/new :用new替换正则表达式old
示例
在file.txt文件的第三行后添加一行“newLine”,并将结果输出:
sed -e 3a\newLine file.txt
在第二行后多输出一行“newLine”
nl file.txt | sed '2a newLine'
在输出中删除第二行
nl file.txt | sed '2d'
在输出中替换第二行
nl file.txt | sed '2c newLine'
在输出中搜索含有关键字的行,加-n后只显示匹配到的行
nl file.txt | sed '/dow/p'nl file.txt | sed -n '/dow/p'
在输出中删除含有关键字的行
nl file.txt | sed '/dow/d'
实验
请在本实验工作目录下完成,在命令后追加"> 文件名"将内容输出到文件中。
任务一:
将file2.txt显示行号输出,并在第一行后添加一行“Unix is also an os”,并输出到文件sed_1.txt(50分)。
nl file2.txt | sed "1a Unix is also an os" > sed_1.txt
任务二:
将file2.txt显示行号输出,并搜索含有关键字’Mac‘的行重复输出,全部内容输出到文件sed_2.txt(50分)。
nl file2.txt | sed '/Mac/p' > sed_2.txt
八、文本搜索神器grep
grep介绍
Linux中的grep命令是强大的文本搜索工具,使用正则表达式搜索文本,并将匹配到的行打印出来。
grep语法
grep [-acinv] [–color=auto] 搜寻内容 目标文本文件
选项与参数
- -a 将二进制文件当作文本文件搜索
- -c 统计搜索到的次数
- -i 忽略大小写
- -n 输出行号
- -v 输出没有搜索到内容的行
- –color=auto 找到的搜索内容上加颜色
示例
在longfile.txt搜索含有“梦”的句子并输出行号:
grep -n 梦 longfile.txt
1:——此开卷第一回也。作者自云:曾历过一番梦幻之后,故将真事隐去,而借
11:中间用“梦”“幻”等字,却是此书本旨,兼寓提醒阅者之意。
91:定睛看时,只见烈日炎炎,芭蕉冉冉,梦中之事便忘了一半。又见奶母抱了英莲
反向查找,在longfile.txt中搜索不含"日"的句子并输出行号:
grep -nv 日 longfile.txt
1:——此开卷第一回也。作者自云:曾历过一番梦幻之后,故将真事隐去,而借
2:通灵说此《石头记》一书也,故曰“甄士隐”云云。但书中所记何事何人?自己又
4:见识皆出我之上。我堂堂须眉诚不若彼裙钗,我实愧则有馀,悔又无益,大无可如
7:告天下;知我之负罪固多,然闺阁中历历有人,万不可因我之不肖,自护己短,一
........................省略.................................
正则匹配
正则匹配规则
- ^ 以此开头的行获得匹配
- $ 以此结尾的行获得匹配
- < 匹配包含以此开头的单词的行
- > 匹配包含以此结尾的单词的行
- 单个字符;如[A] 即A符合要求
- [ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求
- . 所有的单个字符
- ? 匹配0到1次。
- * 匹配0到多次。
- + 匹配1到多次。
- {n} 匹配n次。
- {n,} 匹配n到多次。
- {n,m} 匹配n到m次。
- \ 忽略正则表达式中特殊字符的原有含义
示例:
grep -n [a-g] file.txt
实验
在命令后添加"> 文件名"将内容输出到文件中。
任务一:
输出longfile.txt所有包含"石头"的行并输出行号,输出到文件grep_1.txt(40分)。
grep -n 石头 longfile.txt > grep_1.txt
任务二:
统计longfile.txt中"作者"出现的次数,输出到文件grep_2.txt(30分)。
grep -c 作者 longfile.txt > grep_2.txt
任务三:
统计file.txt所有包含以OS结尾的单词的行,输出到文件grep_3.txt(30分)。
grep 'OS\>' file.txt > grep_3.txt
九、Linux文件搜索
概述
文件搜索的常用命令有:which、whereis、find、locate。
which
which指令会在环境变量$PATH设置的目录里查找符合条件的文件
语法:
which 文件
示例:
which ls
/bin/ls
whereis
该指令会在特定目录中查找符合条件的文件。这些文件应属于源文件、二进制文件,或是man文件。
语法:
whereis [-bfmsu][-B <目录>…][-M <目录>…][-S <目录>…] 文件
选项与参数:
- -b 只查找二进制文件
- -B<目录> 只在指定目录下查找二进制文件
- -f 不显示文件名前的路径名称
- -m 只查找man文件。
- -M<目录> 只在指定目录下查找man文件
- -s 只查找源代码文件
- -S<目录> 只在指定目录下查找原始代码文件
- -u 查找不包含指定类型的文件
示例:
whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd
locate
locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找符合查找条件的文档或目录
语法:
locate [-d ][–help][–version] 文件
选项与参数:
- -d或–database= 用来指定locate指令使用的数据库。locate指令默认数据库位于/var/lib/slocate目录里,文档名为slocate.db。
- –help 查看帮助
- –version 显示版本信息
示例:
locate longfile.txt
/home/jovyan/compress/dir/longfile.txt
/home/jovyan/compress/longfile.txt
/home/jovyan/dirandfile/longfile.txt
/home/jovyan/longfile.txt
/home/jovyan/text-grep/longfile.txt
/home/jovyan/text-sed/longfile.txt
/home/jovyan/text-vi/longfile.txt
find
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法:
find 查找目录 [-option] 查找内容
选项与参数:
- -print:列出结果,使用find命令,默认执行
- -mtime n:文件修改时间,对文件数据的最近一次修改是在 n*24 小时之前
- -mmin n:对文件数据的最近一次修改是在 n 分钟之前
- -ctime n:文件状修改时间,对文件状态的最近一次修改是在 n*24 小时之前。
- -cmin n:件状态修改,对文件状态的最近一次修改是在 n 分钟之前。
- -atime n:访问时间,对文件的最近一次访问是在 n*24 小时之前。
- -amin n:最后访问时间,对文件的最近一次访问是在 n 分钟之前。
- -mtime : 指定时间曾被改动过的文件,意思是文件內容被更改过
- -ctime : 指定时间曾被更改过的文件,意思是文件权限被更改过
- -atime : 指定时间曾被存取过的文件,意思是文件被读取过
- -newer file:file为已存在的文件,意为列出比file时间更新的文件
- -type:指定文件类型
- -uid n:指定文件属主uid
- -gid n:指定文件属组gid
- -user:指定文件属主名
- -group :指定文件属组名
- -nouser: 查找系统中没有属主的文件
- -nogroup:查找系统中没有属组的文件
- -name:查找文件名相匹配的文件
- -size:查找匹配大小的文件
- -exec COMMAND:查找后使用额外命令处理查找结果
- -perm +mode | –mode:+为囊括所有元素,-为包含任一元素
示例:
将目前目录及其子目录下文件名后缀是txt的文件列出来
find . -name "*.txt"
将当前目录及其子目录下所有目录列出
find . -type d
查找当前目录下20分钟内被访问过的文件或目录:
find . -amin -20
查找当前目录下大于10k的普通文件,并列出其详细信息
find . -size +10k -type f
实验
新建文件夹search,将file.txt、file2.txt和longfile.txt复制其中,并新建文件夹adir、dir1和dir2和文件dir.txt,并复制longfile.txt分别到dir1和dir2中(20分)。在命令后添加"> 文件名"将内容输出到文件中。
mkdir searchcp file.txt file2.txt longfile.txt search/cd searchmkdir adirmkdir dir1mkdir dir2touch dir.txtcp longfile.txt dir1cp longfile.txt dir2
任务一
使用which搜索"touch",输出结果到search_1.txt(20分)
which touch > search_1.txt
任务二
搜索文件夹search中所有以"dir"开头的文件夹,输出结果到search_2.txt(30分)
find . -name 'dir*' > search_2.txt
任务三
搜索文件夹search中大于1k的普通文件类型文件,输出结果到search_3.txt(30分)
find . -size +1k -type f > search_3.txt
十、Shell数学计算
使用let、(())和[]进行算术运算
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
语法:
let 表达式
$((表达式))
$[表达式]
示例:
计算2*3
num1=2num2=3let result=num1*num2echo $result
6
计算num1++
let num1++echo $num1
3
[]可包含数学运算
result=$[num1*num2]echo $result
9
(())也可包含数学运算
result=$((num1+5))echo $result
8
使用expr进行算术运算
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
语法:
expr 表达式
示例:
数学运算时数字和运算符之间应当有空格,否则数字会被当成字符处理
expr 3+4
3+4
expr 3 + 4
7
通配符*在做乘法运算符时要转义,即写作*
expr 3 \* 4
12
分步计算,是`,不是’
s=`expr 2 + 3`expr $s \* 4
20
使用bc进行算术运算
bc 命令是任意精度计算器语言,通常在linux下当计算器用。它类似基本的计算器, 使用这个计算器可以做基本的数学运算。
语法:
bc [-ilwqvh] 包含计算任务的文件
选项与参数:
- -i:强制进入交互式模式
- -l:定义使用的标准数学库
- -w:对POSIX bc的扩展给出警告信息;
- -q:不打印正常的GNU bc环境信息;
示例:
bc# 直接使用 2+3
使用管道
echo "20*3"|bc
设置精度
echo "scale=3; 3.333*2.222" |bc
开方运算
echo "sqrt(10000)"|bc
进制转换
abc=101010echo "obase=8;ibase=2;$abc" |bc
实验
新建文件夹math作为本实验作业目录。(10分)在命令后使用">>文件名"追加内容。
mkdir mathcd math
任务一
使用let计算2*3*4*5,结果追加到文件math.txt中。(30分)
let result=2*3*4*5echo $result >> math.txt
任务二
使用expr计算4的立方(使用乘法,expr不支持乘方),结果追加到文件math.txt中。(30分)
expr 4 \* 4 \* 4 >> math.txt
任务三
使用bc将二进制的1001011转换为十进制数字,结果追加到文件math.txt中。(30分)
abc=1001011echo "obase=10;ibase=2;$abc" | bc >> math.txt
十一、文本分析神器awk
awk介绍
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
语法
awk [选项参数] ‘script’ var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项与参数
- -F fs or –field-separator fs 指定分隔符,fs是字符串或正则表达式,如-F,
- -v var=value or –asign var=value 定义变量
- -f scripfile or –file scriptfile 从脚本文件中读取awk命令
基础使用
首先查看文件的全部内容
cat file2.txt
1 linux is an os
2 Windows is an os
3 Mac OS is an os
输出每行的第1、3项内容(默认由空格或tab划分)
awk '{print $1,$3}' file2.txt
1 is
2 is
3 OS
将每行以字符’i’划分,输出每行的第1、2项内容
awk -Fi '{print $1,$2}' file2.txt
1 l nux
2 W ndows
3 Mac OS s an os
使用内建变量’i’划分,输出每行的第1、2项内容
awk 'BEGIN{FS="i"} {print $1,$2}' file2.txt
1 l nux
2 W ndows
3 Mac OS s an os
使用多个分隔符划分,例如i和o
awk -F '[io]' '{print $1,$3,$4}' file2.txt
1 l s an s
2 W ws s an
3 Mac OS s
给变量赋值,并使用变量
awk -va=2 -vb=The '{print $1+a,b$2}' file2.txt
3 Thelinux
4 TheWindows
5 TheMac
使用运算符,输出第一项>=2,且第三项等于"is"的行的前四项内容
awk '$1>=2 && $3=="is" {print $1,$2,$3,$4}' file2.txt
2 Windows is an
使用正则表达式,查看包含"os"的行,忽略大小写
awk 'BEGIN{IGNORECASE=1} /os/' file2.txt
1 linux is an os
2 Windows is an os
3 Mac OS is an os
使用脚本
awk脚本应当符合以下形式:
BEGIN{ 执行前语句 }
{执行中语句}
END {执行后语句 }
示例:
在工作目录下新建cal.awk脚本,填入以下内容:
BEGIN{
printf “begin\n”
total=0
}
{
printf “Name is %-8s\n”,$2
total=total+length
}
END{
printf “total length is %2d\n”,total
printf “end”
}
该脚本用于计算文本文件总长度:
awk -f cal.awk file2.txt
begin
Name is linux
Name is Windows
Name is Mac
total length is 51
end
实验
新建文件夹text-awk作为本实验的工作目录,复制文件file2.txt到文件夹中。(10分)在命令后添加"> 文件名"输出内容到文件中。
mkdir text-awk & cp file2.txt text-awk
任务一
使用’s’作为分隔符,输出file2.txt每行的第2个内容到文件awk_1.txt中。(20分)
awk -Fs '{print $2}' file2.txt > awk_1.txt
任务二
默认分隔符,将file2.txt每行的第1项加2,第3项后面加"what"后输出到文件awk_2.txt中(30分)
awk -va=2 -vb=what '{print $1+a,$3b}' file2.txt >awk_2.txt
任务三
新建文件score.txt,填入以下内容:
Marry 78 84 77
Jack 66 78 45
Tom 48 73 71
Mike 87 97 95
Bob 40 57 62
编写awk脚本输出表头为“姓名 总成绩”,中间保留两个空格,之后各行依次输出每个人的名字(占6位)+总成绩(后三项之和,占3位),名字和成绩之间再保留1个空格,结果输出到文件awk_3.txt中。(40分)
vi score.txt>>>Marry 78 84 77Jack 66 78 45Tom 48 73 71Mike 87 97 95Bob 40 57 62:wq
vi q3.awk>>>BEGIN{printf "姓名 总成绩\n"}{printf "%-6s ",$1printf "%-3s\n",$2+$3+$4}END{}:wq
awk -f q3.awk score.txt > awk_3.txt
ux
2 W ndows
3 Mac OS s an os
使用内建变量’i’划分,输出每行的第1、2项内容
awk 'BEGIN{FS="i"} {print $1,$2}' file2.txt
1 l nux
2 W ndows
3 Mac OS s an os
使用多个分隔符划分,例如i和o
awk -F '[io]' '{print $1,$3,$4}' file2.txt
1 l s an s
2 W ws s an
3 Mac OS s
给变量赋值,并使用变量
awk -va=2 -vb=The '{print $1+a,b$2}' file2.txt
3 Thelinux
4 TheWindows
5 TheMac
使用运算符,输出第一项>=2,且第三项等于"is"的行的前四项内容
awk '$1>=2 && $3=="is" {print $1,$2,$3,$4}' file2.txt
2 Windows is an
使用正则表达式,查看包含"os"的行,忽略大小写
awk 'BEGIN{IGNORECASE=1} /os/' file2.txt
1 linux is an os
2 Windows is an os
3 Mac OS is an os
使用脚本
awk脚本应当符合以下形式:
BEGIN{ 执行前语句 }
{执行中语句}
END {执行后语句 }
示例:
在工作目录下新建cal.awk脚本,填入以下内容:
BEGIN{
printf “begin\n”
total=0
}
{
printf “Name is %-8s\n”,$2
total=total+length
}
END{
printf “total length is %2d\n”,total
printf “end”
}
该脚本用于计算文本文件总长度:
awk -f cal.awk file2.txt
begin
Name is linux
Name is Windows
Name is Mac
total length is 51
end
实验
新建文件夹text-awk作为本实验的工作目录,复制文件file2.txt到文件夹中。(10分)在命令后添加"> 文件名"输出内容到文件中。
mkdir text-awk & cp file2.txt text-awk
任务一
使用’s’作为分隔符,输出file2.txt每行的第2个内容到文件awk_1.txt中。(20分)
awk -Fs '{print $2}' file2.txt > awk_1.txt
任务二
默认分隔符,将file2.txt每行的第1项加2,第3项后面加"what"后输出到文件awk_2.txt中(30分)
awk -va=2 -vb=what '{print $1+a,$3b}' file2.txt >awk_2.txt
任务三
新建文件score.txt,填入以下内容:
Marry 78 84 77
Jack 66 78 45
Tom 48 73 71
Mike 87 97 95
Bob 40 57 62
编写awk脚本输出表头为“姓名 总成绩”,中间保留两个空格,之后各行依次输出每个人的名字(占6位)+总成绩(后三项之和,占3位),名字和成绩之间再保留1个空格,结果输出到文件awk_3.txt中。(40分)
vi score.txt>>>Marry 78 84 77Jack 66 78 45Tom 48 73 71Mike 87 97 95Bob 40 57 62:wq
vi q3.awk>>>BEGIN{printf "姓名 总成绩\n"}{printf "%-6s ",$1printf "%-3s\n",$2+$3+$4}END{}:wq
awk -f q3.awk score.txt > awk_3.txt
来源地址:https://blog.csdn.net/weixin_45956028/article/details/129447207