vim编辑器
vim有3种常见模式:
- 正常模式
- 插入模式
- 命令行模式
正常模式:可移动光标、复制粘贴、删除等。
vim filename.xxx # 没有则创建后打开,有则直接打开 打开后进入正常模式
yy # 拷贝当前行
5yy #拷贝接下来的5行
p # 粘贴
dd # 删除当前行
5dd # 删除接下来5行
:set nu # 设置行号
:set nonu # 取消行号
G # 来到末行
gg # 回到首行
u # 撤销刚刚的操作
10
shift + g # 将光标移动到第十行
:wq # 保存并退出
:q! # 强制退出(不保存刚刚的改动)
:q # 如果打开之后没有编辑过,可以这样退出,否则只能用wq和q!
打开文件时是正常模式,按i
进入插入模式(可编辑)。
插入模式回到正常模式需要按ESC键
。
正常模式到命令行模式按:
。
vim在粘贴代码的时候,会格式错乱。怎么办?
:set paste # 进入粘贴模式
然后再按i进行粘贴就可以了。需要注意的是,粘贴完了需要退出粘贴模式。
:set nopaste # 退出粘贴模式
用vim怎么查找呢?
在正常模式下按/
,然后输入要查找的字符串即可。
比如如果要在一个文件中查找eg,就:
/eg
开机重启等命令
shutdown -h now # 立即关机
shutdown -h 1 # 1分钟后关机
shutdown -r now # 立即重启
halt # 直接关机
reboot # 重启系统
sync # 将内存中的数据刷到硬盘
用户切换及注销
su 用户名 # 只是切换了用户,不会改变原用户的工作目录以及其他环境变量目录
su - vth # 切换成vth用户, 并将工作目录、其他环境变量目录都切换到vth的。
#上一条, 工作目录是切换到/home/vth的
sudo su # 授权给当前用户root权限,不切换工作目录。只需要输入当前用户的密码。
# 但是这种方式需要root用户在/etc/sudoers文件中的
# root ALL=(ALL) ALL 复制一行,把root替换成用户名即可。 这个文件是只读的,
# 如果想修改可以提权。
su - xm # 切换成用户小明
logout # 运行级别3下注销用户
exit # 退出当前用户
su 、sudo、su - xxx 对比:
su的话是拥有了root权限,没有改变目录和环境变量,切换时要输入密码。
su - xxx # 的话低级到高级需要输入密码,改变目录和环境变量。
sudo su # 执行时只需要输入当前用户的密码就可以了。但是要确保在/etc/sudoers里面添加了当前的东西
用户管理
Linux的用户至少要属于一个组, 如果添加用户的时候没有指定组,那么它自己就是一个组。
useradd xm # 添加用户xm
useradd -d /home/dog xm # 添加用户xm并把家目录设置成/home/dog
useradd -g xmzu xm # 创建xm用户并将它加入到xmzu用户组
# 注意,上面那条语句,必须先存在xmzu这个组,不然不能行。
usermod -g shaolin xm # 将用户xm所属的组改成shaolin
# 注意,上面那条语句,必须先存在shaolin这个组,不然不能行。
passwd xm # root用户给xm更改密码
注意,提示符是$代表普通用户,#代表root用户
userdel xm # 删除xm用户,但是保留它创建的家目录
userdel -r xm # 删除xm用户以及它创建的家目录 # 斩草除根
id xm # 查看用户信息
用su - root 切换用户时,exit可以返回原来的用户。
从高权限用户到低权限用户时不用输入密码,反之要输入密码。
groupadd wudang # 建立wudang组
groupdel wudang # 删除wudang组,注意,wudang组中有成员的时候不能删
运行级别及密码找回
/etc/inittab的id:5:initdefault:这一行的数字代表了运行级别,可以从这儿改。
init 0 # 切换到运行级别0
# 忘记root密码怎么找回:
进入到单用户模式,然后修改root密码,因为进入到单用户模式root不需要密码就可以登陆。
开机引导-回车-e-第二行-e-1-回车-b
然后进入了单用户模式,用passwd root 即可修改root密码。
帮助指令
man ls # 查看ls的用法
help cd # 获得shell内置命令cd的帮助信息
文件目录类
pwd # 显示当前目录的绝对路径
ls # 列出非隐藏的文件夹、文件
ls -a # 列出所有的文件夹和文件
ls -l # 列出非隐藏的文件夹、文件并显示详细信息
ll -a # 这个最常用,最全, 但是需要alias支持。alias命令即可列出当前的alias配置。
ll # 这个相当于ls -l
cd xxx # 切换到指定目录,xxx可以是一个绝对路径也可以是一个相对路径
cd ~ 或者 cd 空格 # 回到自己的家目录
cd .. # 回到上级目录
mkdir xxx # 创建文件夹。xxx为绝对路径或者相对路径,这个要保证路径存在
mkdir -p xxx# 创建文件夹,xxx为绝对路径或相对路径,无需保证路径存在(如果不存在就创建)
mkdir xxx yyy zzz 就可以创建3个目录,以此类推。。
rmdir xxx # 删除空目录,xxx为绝对路径或相对路径。
rmdir xxx yyy zzz # 也可以一下删除3个目录,以此类推。。
# 也可以用通配符, rmdir test* 即可删除所有的以test开头的空目录。
rm -rf xxx # 删除非空目录,xxx为绝对路径或相对路径。
rm 命令也可以跟非常多个参数,写很多规则。
rm -rf xxx* yyy* zzz* 这样也是可以的。
touch a.txt # 创建一个空文件a.txt
touch a.txt b.txt # 创建两个文件,a.txt和b.txt
# 以此类推 , touch可以一次创建n个空文件。
# touch的话,如果要创建的文件已经存在,则不会覆盖。
cp xxx yyy # 将文件xxx复制到yyy下,xxx,yyy可以是相对路径或绝对路径
cp -r xxx yyy #将目录xxx复制到yyy下, xxx,yyy可以是相对路径或绝对路径
rm -f s.txt # 强制删除s.txt s.txt也可以由绝对路径给出
# 打字太累了,所有的文件或者目录都可以以绝对路径和相对路径给出,不写了。
rm -rf xxx # 删除xxx目录
rm -rf ./a.zip ./xxx # 删除当前目录下的a.zip 和 目录./xxx
mv xxx/yyy aaa/bbb # 如果xxx与aaa相同,那么这是重命名 不同就是移动文件
总之,mv的机制就是:先剪切,然后粘贴到目标目录aaa/bbb , 如果这跟原来的目录不同,这就是个移动操作,否则就是重命名操作
实例:
mv a.txt b.txt # 重命名
mv a.txt /root # 将a.txt移动到/root目录
cat a.txt # 以只读方式查看a.txt
cat -n a.txt # 给所有的行加上行号
cat -b a.txt # 只给有文本的行加上行号
cat -n a.txt | more # 一般这么用是分页浏览, | 就是将cat的运行结果交给more去处理
| 是管道符的意思。
more file # 分页查看file
more时, q是退出,搜索是/关键字, 空格是看下一屏, b是看上一屏, 回车是看下一行, 搜索关键字之后, n是看下一个关键字所在的位置.
less file # 跟more功能差不多,比more强大一些 ,是more的升级版. less 跟python中的生成器比较像,不会把文件一下都读到内存中,所以对待大文件时更友好。
> # 输出重定向
>> # 追加
# 注意,下面的是ll,不是||
ll > a.txt # 如果a.txt不存在,则先创建a.txt,再将ll的输出写到a.txt中;如果a.txt存在,
则先清空a.txt 再将ll的输出写到a.txt中
ll >> b.txt # 如果b.txt不存在,则先创建b.txt,再将ll的输出写到b.txt中;如果b.txt存在
则将ll的输出追加至b.txt的末尾
cat file1 > file2 # 用file1的内容覆盖file2
echo 'caonima' > file1 # 用'caonima' 覆盖file1
echo # 输出内容到控制台
echo $PATH # 输出环境变量
head file # 查看file的前10行
head -n 3 file# 查看file的前3行
head -3 file # 查看file的前3行, 这种最方便
tail file # 查看file的后10行
tail -n 3 file # 查看file的后3行
tail -3 file # 查看file的后3行
tail -f file # 实时追踪文档的所有更新,改动并保存后可以看出来
ln -s 原文件或目录 软链接名 # 相当于搞一个windows的快捷方式
ln -s 创建的是一个软链接,也叫符号链接。
它的文件内容和原文件是不一样的,而且它和原文件也不是同一个文件。
可以用ls -i file_name 来查看一个文件的inode编号。
文件或目录的inode编号是一个用于标识的唯一数字,
这个数字由内核分配给文件系统中的每一个对象。
ln -s /root link 将本目录下的link链接到/root
用cd link就跟cd /root 一样的效果,但是这时pwd一下会发现还在link下。
rm -rf link # 删除软链接.
# 硬链接
硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。
也就是说,硬链接的inode号跟源文件是一样的,所以文件大小、内容之类的都是一样的。
ln file/path link_name # 创建硬链接
软链接和硬链接的区别:
只能对处于同一存储媒体的文件创建硬链接。
要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
history # 查看执行过的历史命令
附录 ln实例:
lrwxrwxrwx 1 root root 5 3月 11 15:03 link -> /root
[root@vth play]# cd link
[root@vth link]# ll
总用量 108
drwxr-xr-x 3 root root 4096 3月 10 22:23 aaa
-rw-------. 1 root root 1286 9月 6 2018 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 3月 10 22:00 a.txt
drwxr-xr-x 2 root root 4096 3月 10 22:00 bbb
-rw-r--r--. 1 root root 41954 9月 6 2018 install.log
-rw-r--r--. 1 root root 9154 9月 6 2018 install.log.syslog
drwxr-xr-x. 3 root root 4096 9月 6 2018 PycharmProjects
drwxr-xr-x. 2 root root 4096 9月 5 2018 公共的
drwxr-xr-x. 2 root root 4096 9月 5 2018 模板
drwxr-xr-x. 2 root root 4096 9月 5 2018 视频
drwxr-xr-x. 2 root root 4096 9月 5 2018 图片
drwxr-xr-x. 2 root root 4096 9月 5 2018 文档
drwxr-xr-x. 2 root root 4096 3月 7 10:55 下载
drwxr-xr-x. 2 root root 4096 9月 5 2018 音乐
drwxr-xr-x. 4 root root 4096 3月 5 08:39 桌面
[root@vth link]# pwd
/home/xm/play/link
时间日期类
date # 显示当前时间
date '+%Y' # 显示当前年份
date '+%m' # 显示当前月份
date '+%d' # 显示当前日期(每个月第几天)
date '+%H%M%S' # 显示当前的时分秒
结论:加号不能少,还要写成一个字符串的形式
date -s '2018-10-10 11:22:22' # 将时间改成字符串时间
cal # 显示当前月的日历
cal 2020 # 显示2020年的日历
实例:
[root@vth link]# date '+%Y/%m/%d'
2019/03/11
搜索查找类
find 搜索范围 选项 文件名或目录
find /root -name a.txt # 查找/root目录下的a.txt
find /opt -user xm # 查找/opt目录下用户名是xm的文件。(即归属于xm的文件)
find / -size +20M # 查找整个linux系统大于20M的文件 # 小于用- 等于用空格
find / -size +10k # 注意k是小写,查找大于10k的文件
find / -name *.txt # 查找系统中所有后缀名是.txt的文件
find / -iname abc.txt # 忽略abc.txt的大小写差异查找
updatedb # 创建locate数据库,以快速定位文件路径
locate hello.txt # 给出所有的包含hello.txt的绝对路径
# 必须要先用updatedb建立locate数据库之后才能用locate命令
| # 管道符,将前一个命令的处理结果输出传递给后面的命令进行处理
grep # 过滤查找 -n带上行号 -i 忽略大小写
cat hello.txt | grep -n yes # 查找hello.txt中包含yes字段的行。
grep -rn "test" * # 查找当前目录下所有文件中包含"test"的行。r代表递归
示例:
# 查找文件
[root@vth link]# find /root -name a.txt
/root/桌面/bbb/aaa/aaa/a.txt
/root/桌面/bbb/aaa/a.txt
/root/桌面/bbb/a.txt
/root/aaa/bbb/a.txt
/root/a.txt
/root/bbb/a.txt
查找目录
[root@vth link]# find /root -name aaa
/root/桌面/bbb/aaa
/root/桌面/bbb/aaa/aaa
/root/aaa
压缩和解压类
gzip file # 将file压缩成file.gz 压缩后不保留file
gunzip file.gz # 将file.gz解压缩成file 不保留file.gz
zip 选项 file.zip 目录或文件
zip b.zip a.txt # 将a.txt压缩成b.zip 保留原来的a.txt
zip -r c.zip /root # 将/root压缩到c.zip
unzip b.zip # 将b.zip解压到当前目录。
unzip -d /root b.zip # 将b.zip解压缩到/root目录下。
tar 选项 xxx.tar.gz 打包的内容 # 压缩时用-zcvf 解压时用-zxvf
tar -zcvf a.tar.gz a1.txt a2.txt # 把a1.txt和a2.txt打包成a.tar.gz
# 注意,压缩类的文件名、目录都可以写多个。
tar -zxvf a.tar.gz # 解压a.tar.gz
tar -zxvf a.tar.gz -C /opt # 解压到/opt下 注意,/opt必须存在,否则报错
组管理和权限管理
在linux中每个用户都必须属于一个组,不能独立于组外。在linux中每个文件都有所有者、所在组、其他组。
一般来说,文件的所有者就是创建了这个文件的用户。
所在组一般来说就是创建了这个文件的用户所在的组。
其他组就是除了文件的所有者和所在组的用户外的其他用户。
ls -ahl # 查看文件所有者
chown username filename # 将filename文件的所有者改成username。
chgrp groupname filename # 将filename文件的所在组改成groupname。
文件、目录权限
-rw-r--r-- 1 root root 4 3月 10 22:27 a.py
0-9位(10个数)说明:
第0位确定文件的类型 -
:普通文件 d
:目录 l
:软连接 c
:字符设备 b
:硬盘
1-3位代表文件所有者的权限 rwx
读写执行 -
代表没有此权限
4-6位代表文件所在组的权限 同上
7-9位代表文件其他组的权限 同上
注意,有写权限只代表能修改文件,并不代表能删除文件。
想拥有删除文件的权限要对该文件的目录具有写权限。
【重难点】rwx于文件
:
r:可以读取,查看
w:可以修改文件
x:可以被执行
【重难点】rwx于目录
:
r:可以读取,ls查看内容
w:可以修改:目录内创建、删除、重命名目录
x:可以进入该目录
权限也可以用数字表示。r=4,w=2,x=1
chmod # 修改权限
u:所有者
g:所在组
o:其他人
a:所有人
chmod u=rwx,g=rx,o=rx a.py # 将a.py的所有者、所在组、其他组权限改为rwxr-xr-x
chmod g+w,o-x a.py # 将目前的a.py的所在组权限加上写权限,去掉其他组的执行权限
chmod 777 a.py # 给a.py加上所有的权限
chown # 修改文件所有者
chown xm a.py # 将a.py的所有者改成xm
chown xm:xm a.py # 将a.py的所有者改成xm用户,将所在组改为xm组
chown -R xm bbb # 将bbb目录以及目录下所有的东西递归的改所有者为xm
chgrp # 修改文件所在组
chgrp root a.py # 将a.py的用户组改为root
chgrp -R xm bbb # 将目录bbb下的所有东西递归的把用户组改为xm
任务调度crontab
啥叫任务调度???其实就是定时执行某程序或者某命令。
那么要设置一个任务调度,有两种办法:
- 设置任务调度文件 /etc/crontab
- 设置个人任务调度 crontab -e
然后可以输入任务到调度文件,如:
*/1 * * * * ls -l /root > /root/aaa/cron.txt # 每分钟都执行一次 ls.....
保存并退出即可。
5个*
的含义:
第一个* 一小时当中的第几分钟 0-59
第二个* 一天当中的第几个小时 0-23
第三个* 一个月当中的第几天 1-31
第四个* 一年当中的第几个月 1-12
第五个* 一周当中的星期几 0-7 0和7都代表了周日
* 代表任何时间。第一个*就代表了每分钟都执行一次的意思。
,代表不连续的时间。 0,8,12,16 * * * *代表了每小时的第0,8,12,16分钟执行
- 代表连续时间范围。 0-6 * * * * 代表了每小时的第0到6分钟执行
*/n 代表每隔n执行一次。 */10 * * * *代表每隔十分钟执行一次
crontab -l # 列出当前有哪些任务调度
crontab -r # 终止任务调度
service crond restart # 重启任务调度
磁盘管理
分区的方式有两种
- mbr分区
- gpt分区
mbr分区:
- 最多支持四个主分区
- 系统只能安装在主分区
- 扩展分区要占一个分区
- MBR最大只支持2TB,但拥有最好的兼容性。
gpt分区:
- 支持无限多个主分区
- 最大支持18EB容量
linux的分区是要挂载到某个目录的。
linux的硬盘分为IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘。
对于IDE硬盘来说,驱动器标识符为“hdx~”
,其中hd表示分区所在设备的类型,这里是指IDE硬盘。"x
"为盘号(a为基本盘),~
代表分区。 前4个分区是主分区或扩展分区,从5开始就是逻辑分区。对于SCSI硬盘则标识为"sdx~"
,其他的都一样。
lsblk -f # 查看分区和挂载情况
df -h # 查看磁盘使用情况
df -lh # 查看本地文件系统的磁盘使用情况
du -ach --max-depth=1 /root # 查看root目录下的磁盘占用情况
wc -l file # 统计file有多少行
ls -l /root/aaa | wc -l # 统计这个命令列出来多少行
ls -l /root | grep '^-' | wc -l # 统计root目录下的所有文件个数(一级非递归)
ls -lR /root | grep '^-' | wc -l # 统计root目录下的所有文件个数(递归)
tree # 以树状显示目录结构
网络配置
ifconfig # 查看网络配置
ping www.baidu.com # 对百度进行ping
进程管理
服务一般来说可以认为是后台进程。
ps -aux | more # 显示系统执行的进程,相当于查看windows的任务管理器进程
# 有USER PID CPU 内存占用等信息
ps -aux | grep sshd # 看看有没有sshd服务
ps -ef | more # 查看进程的父进程
kill 进程号 # 根据进程号杀死进程 不能杀死自己
kill -9 进程号 # 疯起来连自己都杀
killall 进程名称 # 根据进程名称杀死进程
pstree -pu # 显示进程的pid,所属用户组成的进程树
# 服务就是守护进程
service iptables status # 查看防火墙状态
service iptables start # 开启防火墙
service iptables stop # 关闭防火墙
lsof -i:3306 # 查看哪个进程在用3306
lsof -p pid # 查看进程打开的文件
Linux开机流程:
开机-BIOS-/boot-init进程1-运行级别-运行级别对应的服务
chkconfig # 给服务的各个运行级别设置自启动/关闭
chkconfig --list | grep sshd # 找到sshd服务
chkconfig iptables --list # 找到iptables服务
chkconfig --level 5 iptables on # 运行级别5下自启动防火墙
chkconfig --level 5 iptables off # 运行级别5下关闭自启动防火墙
chkconfig iptables off # 在所有运行级别下关闭防火墙
top # 实时监控CPU使用率,各进程的CPU、内存占用情况等。
top执行完了按下u 输入用户名,就能看特定用户名的进程
top执行完了按下k 输入进程ID,就能杀掉进程
netstat -an # 显示所有的网络服务
lscpu # 查看cpu信息
free -m # 以m的形式显示内存信息
free -g # 以g的形式显示内存信息
RPM和YUM
RPM就是REDHAT软件包管理工具。跟windows的SETUP一个样。
rpm -qa # 查看已安装的rpm列表
rpm -q firefox # 查询firefox是否已被安装
rpm -ql firefox # 查询firefox的文件安装到哪里去了
rpm -qf /etc/passwd # 查询某个文件属于哪个rpm包
rpm -e firefox # 卸载firefox
yum能从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装
所有依赖的软件包,使用yum的前提是可以联网。
yum list | grep firefox # 查询yum服务器上是不是有firefox
yum install firefox # 下载并安装firefox
拾遗
sort命令,用于排序。
如果不指定参数,是按照字符串进行排序的。
如果想对数字进行排序,则要用sort -n
,如果要求去重,则需要加上-u
, 如果要求从大到小排序,则需要用-r
。
sort -run test.txt # 文本文件中的数字从大到小排列,去重
sort -run test.txt | head -3 # 找出排前三大的数字
跨linux传输文件:
格式:
# 本地传到远程
scp local_file remote_username@remote_ip:remote_file
# 远程复制到本地
scp root@www.runoob.com:/home/root/others/music /home/space/music/
分割大文件:
split -6 test.txt # 每6行分割成一个文件 命名为xaa...xab.....
split -b 1 test.txt # 每个文件占一个字节,按照字节进行split
文件定位命令:
whereis
Linux whereis命令用于查找文件。
该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令。
whereis bash
locate
Linux locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。
一般情况我们只需要输入 locate your_file_name
即可查找指定文件。
注意,这个是去保存文档和目录名称的数据库内查找的,并不算是查找真正的硬盘。所以查找的速度特别的快,但是这只是去找数据库,数据库可能不会实时更新。
一般文件数据库在/var/lib/slocate/slocate.db
中。
这样会导致不爽,咋办?我们可以手动更新数据库。
updatedb
正常的查找是这样的:
locate test.txt
所有以test.txt为结尾的文件都会被找到。
locate与find 不同: find 是去硬盘找,locate 只在/var/lib/slocate资料库中找。
locate的速度比find快。
find
find本文之前已经给出了。
expr命令
统计字符串长度:
expr length "this is a test"
字符串切片:(注意和python进行区分,这里的index并不是下标,而且不想python一样是个半开半闭区间)
expr substr "this is a test" 3 5
获取第一个字符出现的位置:
expr index "sarasara" a
运算:
expr 14 % 9
expr 30 \* 3 #(使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
uniq命令
uniq看名字就知道是去重用的。
它可以去掉连续的重复行(言外之意就是不连续的重复行并不能去除)
uniq testfile
还可以统计一下重复行的重复次数
uniq -c testfile
那不连续就不能用了吗?不是的。
当然是要先排下序了。
sort testfile1 | uniq
等等,那为什么不用sort -u
呢?好问题。因为sort -u
并不能统计重复行的行数。
sort testfile1 | uniq -c
wc
在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。
wc testfile
想指定行数,就用wc -l
,其实就是line的意思,如果统计字数呢?太聪明了,是-w
, word的意思。
netstat
查看所有端口(进一步可以使用grep)
netstat -anp
nohup
部署服务当然要用nohup啦。
nohup command > myout.file 2>&1 &
其中nohup的意思是不挂断的运行,注意并没有后台运行的功能。就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行。但是它不会在后台运行。所以说我们要加上&使他在后台运行。