Linux部分
1、vim的三种模式
vim中的三种模式:命令模式、编辑模式、末行模式
命令模式:该模式下不能对文件进行直接编辑,可以输入快捷键进行一些操作(删除行,复制行,移动光标,粘贴等等)
编辑模式:对该模式下可以对文件的内容进行 编辑
末行模式:可以在末行输入命令来对文件进行操作(搜索,替换,保存,退出,撤销等)
打开文件进入的是命令模式。
模式间的相互切换:
默认一开始是:命令模式
按i键进入编辑模式
按:进入末行模式
想从编辑模式或末行模式进入到命令模式按下Esc键。
命令模式:
1、光标移动命令
(1)光标移到行首:shift+6
(2)光标移到行尾:shift+4
(3)光标移到首行:gg
(4)光标移到末行:G
2、复制命令
(1)复制光标所在行
按键yy
粘贴:在想要粘贴的地方按下p键(粘贴到该行的下一行)
(2)以光标所在行为准(包含当前行),向下复制指定的行数
按键:数字 yy(数字表示复制几行)
粘贴:p
3、剪切/删除
(1)剪切/删除光标所在行
按键:dd (删除之后下一行上移)
注意:dd严格是剪切命令,但是剪切之后不粘贴就是删除了
(2)剪切/删除光标所在行为准(包含所在行),向下删除/剪切指定的行数
按键:数字 dd
(3)剪切/删除光标所在行 ,但是删除之后下一行不上移,当前行变成空白行
按键:D
4、撤销刚才的操作
按键:u (undo)
末行模式:
1、保存退出就不说了
2、搜索、查找:
输入"/关键词",注此时就不用输入":"了
例如:在passwd文件中所搜root关键词:
/root
在搜索结果中切换上一个或下一个结果:上一个N,下一个是n(next)
3、替换指令
语法1:😒/搜索的关键词/新的内容 替换光标所在行的第一处符合条件的内容
语法2:😒/搜索的关键词/新的内容/g 替换光标所在行的全部符合条件的内容
语法3: %😒/搜索的关键词/新的内容 替换整个文档中每行的第一个符合条件的内容
语法4:%😒/搜索的关键词/新的内容/g 替换整个文档的符合条件的内容
%:表示整个文档
g:表示全局(global)
4、显示行号:
输入":set nu" :nu就是number的意思
取消显示行号:":set nonu"
2、Linux的自有服务
自有服务:即不需要用户独立安装的软件的服务,而是当系统安装好后就可以直接使用的服务(内置)
1、自由服务之:运行模式:
运行模式也可以称之为***运行级别***。
init进程:是系统启动后的第一个进程,该进程存在一个对应的配置文件:inittab(系统运行级别配置文件,位置/etc/inittab)
从该文件的配置中可以看出有7种运行级别:
0----表示关机级别(不要将默认的运行级别设置成这个值)
1----表示单用户模式
2----多用户模式,不用NFS
3----多用户模式,完全的多用户模式(不带桌面的,纯命令行模式)
4----没有被使用的模式(被保留的模式)
5----x11,完全的图形化界面模式
6----表示重启模式(不要将默认的运行模式设置为这个值)
与该级别 相关的几个命令(注init指令需要超级管理员的权限,普通用户无法使用):
#init 0 表示关机
#init 3 切换到不带桌面的模式,命令行模式
#init 5 切换到图形界面
#init 6 重启电脑
这些命令其实都是调用的init进程,将数字(运行级别)传递给进程,进程去读配置文件对应的操作。
要想永久更改成命令行模式就需要更改配置文件:
/ect/inittab文件中的initdefault值设置成3,然后重启操作系统。
2、自有服务之用户和用户组管理(重点)超级管理员才能使用的命令
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对用户进行跟踪,并控制他们对系统资源的访问;另一方面可以帮助用户组织文件,并为用户提供安全性保证。
用户在登录时键入正确的用户名和密码后,就能够进入系统和自己的主目录。
想要实现对用户账号的管理,要完成的工作主要有一下几个方面:
用户账号的添加,删除,修改以及密码的管理;
用户组的管理。
注意三个文件:
/etc/passwd :用于存储用户的关键信息
/etc/group :用于用户组的关键信息
/etc/shadow :存储用户的密码信息
1、用户管理:
(1)添加用户
语法:#useradd 选项 用户名
常用选项:
-g:表示指定用户的用户主组,选项值可以是用户组的id,也可以是组名
-G:表示指定用户的用户附加组,选项值可以是用户组的id,也可以是组名
-u:uid 用户的id(标识符),系统默认从500之后按顺序分配uid,如果不想使用分配的可以使用该选项自定义
案例:创建用户zhangsan ,不带选项
#useradd zhangsan
验证是否成功:
cat /etc/passwd 查看文件;
或者:验证是否存在家目录(在Centos下创建好用户之后会随之产生一个同名的家目录 ) #ls /home
案例:添加选项:创建用户lisi,让lisi属于501组,附加组500,自选uid 666
#useradd -g 501 -G 500 -u 666
主组和uid是查看/etc/passwd文件
附加组是查看/etc/group文件
(2)修改用户:
语法:#usermod 选项 用户名 (mod:modify)
选项:
-g :修改主组
-G:修改附加组
-u:修改用户id
-l:修改用户名
案例:修改用户名
#usermod -l 新的用户名 旧的用户名
(3)设置密码:
Linux不允许没用密码的用户登到系统,因此之前创建的用户因为没有密码所以都出于锁定状态,需要设置密码之后才可以进行登录
语法:#passwd 用户名
案例:设置zhangsan的密码
#passwd zhangsan
(4)切换用户:
#su [用户名] :用户名可以不写,不写的话表示切换到超级管理员root用户
从root切换到其他用户不需要密码,反之需要密码;
切换用户之后路径不变;
普通用户没办法访问root用户家目录,但是反之可以
(5)删除用户
语法:#userdel 选项 用户名
常用选项:
-r:表示删除用户的同时删除家目录。
已经登录的用户删除的时候提示删除失败,但是没有登录的用户可正常删除。
对于已经登录的用户,用kill杀死其全部进程后,再用userdel删。
2、用户组管理:
一个用户组中的用户类似。每个用户都有一个用户组,系统可以对用户组中的用户进行集中管理。不同的Linux系统对用户的规定有所不同,如Linux下的用户属于与他同名的用户组,这个用户组在创建用户是创建。
用户组的管理设计用户组的添加,删除和修改,组的添加,删除和修改实际上就是对/etc/group文件的更新。
文件结构:
用户组名:密码:用户组ID:组内用户名
密码:x表示占位符,虽然用户组可以设置密码,但是大部分情况下是不设置密码的
组内 用户名:表示附加组是该组的用户名称
(1)用户组添加
语法:#groupadd 选项 用户组名
选项:
-g:表示类似用户添加用户里面的-u操作,选择自己自定义的一个用户组的id
,如果不指定,则默认从500之后递增。
案例;创建一个新的用户组,命名为Adminis
#groupadd adminis
查看是否成功:
cat /etc/group
(2)用户组修改:
语法:#groupmod 选项 用户组名
选项:
-g: 修改用户组id
-n:修改用户组名
案例:将用户组adminis的id从501改成502,将名称改成admins
#groupmod -g 502 -n adminis admins
(3)删除用户组
语法:#groupdel 用户组名
注意:如果需要删除一个组,但这组是某个用户的主组时不允许删除,但如果确实需要删除,需要先移除该组内的所有用户。
#groupdel adminis
3、自有服务之网络设置
网卡配置文件位置:/etc/sysconfig/network-scripts
在目录中网卡的配置文件的命名格式:ifcfg-网卡名称
比如:cat /etc/sysconfig/network-scripts/ifcfg -eth0
重启网卡的命令:
(1)#service network restart (有时没有这个命令,因为有的分支版本中可能没有这个命令)
(2)但是有个共性的目录:/etc/init.d 该目录下放着很多服务的快捷方式(
ls /etc/init.d/),所以还可以使用另一个命令
#/ect/init.d/network restart (更加通用)
4、自有服务-ssh服务(重点)
ssh(secure shell,安全外壳协议):该协议有两个主要作用:
远程的连接以及远程的文件传输协议。
协议使用端口号:默认22
服务启动/停止/重启
#service start/stop/restart
#/etc/init.d/sshd start/stop/restart
(1)远程终端
终端工具主要帮助运维人员连接远程的服务器的,常见的终端工具:Xshell、secureCRT、Putty
(2)文件传输:
filezilla也可以将Linux中的文件下载到本地中,右键点击下载就可以 。
Python 列表(列表是可变类型的,因为在其上操作直接修改了原列表)
1、格式:[数据1,数据2,…]
并且列表中数据类型可以是不同的,但是尽量是相同的,因为容易操作和控制。
2、列表常用操作:
列表是通过下标值来获取数据的,比如:
list=["tom","lisi"]
list[0]
1、查找(index和count函数和对String的操作都是一样的):
(1)index():
name_list=["tom","lily","rose"]
print(name_list.index("tom")) #0
print(name_list.index("tom",1,2)) #报错
(2)count():,和字符串有点不一样,只能传一个参数
name_list=["tom","lily","rose"]
print(name_list.count("tom")) #1
print(name_list.count("tomm")) #0
(3)len():注:该方法是一个共用函数,即列表,字符串,元组,集合,字典都是可以用的,用来统计个数
name_list=["tom","lily","rose"]
print(len(name_list))
2、判断列表中元素是否存在,主要有in和not in
in:判断指定的数据 是否在某个某个列表序列中,如果在返回True,否则返回False
not in:判断指定的数据 是否在某个某个列表序列中,如果不在返回True,否则返回False
name_list=["tom","lily","rose"]
print("tom" in name_list); #True
print("tom" not in name_list) #False
用法:查找用户输入的名字是否已存在
name_list=["tom","lily","rose"];
name=input("请输入用户名:");
if name in name_list:
print("您输入的用户名已存在");
else:
print("您输入的名字是%s,不存在")
3、列表增加数据
(1)append():列表结尾追加数据
name_list=["tom","lily","rose"];
name_list.append("xiaoming");
print(name_list); #['tom', 'lily', 'rose', 'xiaoming']
append函数如果追加的是一个序列,则追加整个序列到结尾
name_list=["tom","lily","rose"];
name_list.append([1,2]);
print(name_list); #['tom', 'lily', 'rose', [1, 2]]
(2)insert():向指定位置新增数据
语法:
列表名称.insert(位置下标,数据)
name_list=["tom","lily","rose"];
name_list.insert(1,"lisi");
print(name_list); #['tom', 'lisi', 'lily', 'rose']
(3)extend:也是列表结尾追加数据,但是与append不同的是,如果数据是一个序列的话,则将这个序列的数据逐一添加到列表中
name_list=["tom","lily","rose"];
name_list.extend("xiaoming");
print(name_list); #['tom', 'lily', 'rose', 'x', 'i', 'a', 'o', 'm', 'i', 'n', 'g']
name_list=["tom","lily","rose"];
name_list.extend(["xiaoming","xiaohong"]);
print(name_list); #['tom', 'lily', 'rose', 'xiaoming', 'xiaohong']
4、删除数据
(1)del 删指定下标的数据
name_list=["tom","lily","rose","xiaoming","xiaohong"];
del name_list[0];
#del name_list; 这样写会报错
print(name_list)
(2)pop():删除指定下标的数据,不指定的话默认输出最后一个数据,pop函数都会返回被删除的那个数据
name_list=["tom","lily","rose","xiaoming","xiaohong"];
name=name_list.pop();
print(name) #xiaohong
name_list=["tom","lily","rose","xiaoming","xiaohong"];
name=name_list.pop(1);
print(name) #lily
(3)remove(数据):删除指定数据的数据,如果有两个一样的数据,只会删除第一个
name_list=["tom","lily","rose","xiaoming","xiaohong"];
name_list.remove("tom");
print(name_list); #['lily', 'rose', 'xiaoming', 'xiaohong']
(4)clear() 清空列表 ,最后保存的是一个空列表
name_list=["tom","lily","rose","xiaoming","xiaohong"];
name_list.clear();
print(name_list) #[]
5、修改
(1)修改指定下标的数据
name_list=["tom","lily","rose","xiaoming","xiaohong"];
name_list[0]="aaa"
print(name_list) #['aaa', 'lily', 'rose', 'xiaoming', 'xiaohong']
(2)使用revserse()函数逆置
name_list=["tom","lily","rose","xiaoming","xiaohong"];
name_list.reverse();
print(name_list) ['xiaohong', 'xiaoming', 'rose', 'lily', 'tom']
(3)使用sort()函数排序
语法:
列表名字.sort(key=None,reverse=False)
注:reverse:表示排序规则,reverse=True降序,reverse=False(升序)默认
name_list=[1,5,8,7,6,9];
name_list.sort()
print(name_list) #[1, 5, 6, 7, 8, 9]
name_list=[1,5,8,7,6,9];
name_list.sort(reverse=True)
print(name_list) #[9, 8, 7, 6, 5, 1]
5、列表的复制,直接使用copy()函数,都不用参数。一般再对数据进行操作之前,都需要复制一份出来,为了保留原始数据
name_list=[1,5,8,7,6,9];
name_list2=name_list.copy();
print(name_list2)
6、列表的循环遍历
(1)使用while进行遍历:
name_list=["tom","lily","rose","xiaoming","xiaohong"];
i=0;
while i<len(name_list):
print(name_list[i]);
i+=1;
(2)使用for循环:
name_list=["tom","lily","rose","xiaoming","xiaohong"];
for i in name_list:
print(i);
7、列表嵌套:
嵌套:列表中包含子列表
应用场景:要存储班级一、二、三三个年级学生姓名,且每个班级的学生姓名在一个列表中。
name_list=[["小明","小红","小绿"],["tom","lily","rose"],["张三","李四","王五"]];
如何查找到李四:
name_list[2][1]
name_list=[["小明","小红","小绿"],["tom","lily","rose"],["张三","李四","王五"]];
print(name_list[0]) #['小明', '小红', '小绿']
8、案例:
需要:8个老师,三个办公室,将8个来使随机添加到这三个办公室中。用到随机数
import random
teachers=['A','B','C','D','E','F','G','H'];
offices=[[],[],[]];
for name in teachers:
num=random.randint(0,2); #从0到2之间随机,包括2
offices[num].append(name);
print(offices);