Linux是什么
与windows一样,是一个系统操作软件。在Unix的基础上发展而来的,与其他系统相比,其能流行起来的原因,无在乎于其巨大的生态系统、且开源免费。Linux 系统主要被应用于服务器端、嵌入式开发和 PC 桌面 。
[root@localhost ~]#/$
用户名 主机名 所在目录 #:表示当前为超级用户$:表示当前为普通用户
常见目录说明
/bin :存放二进制可执行文件,一般常用的命令都在此目录下
/etc :存放系统管理和系统配置文件
/home :所有用户的根目录
/usr :存放系统应用程序,用户用的到的应用程序及文件基本都在此目录下
/opt :用户安装的应用程序一般都放在此目录下
/proc :虚拟文件系统目录,是系统内存的映射,可直接访问此目录来获取系统信息
/root :超级用户,也就是系统管理员的主目录
/sbin :存放二进制的可执行文件,只有root用户才有权访问
/dev :存放设备文件
/mnt :系统提供该目录是为了让用户临时挂载别的文件系统,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了
/selinux :该目录是RetHat和Centos特有的目录,用于存放selinux安全机制的文件的目录
/tmp :存放临时文件的目录
/lost+found :用于存放当系统非法关机时的文件
常用命令
文件目录类
ls命令
ls #查看当前目录的内容(缺点:隐藏的文件无法查看)
ll #等价于ls -l 查看当前目录的详情(隐藏文件看不到)
ll /etc #查看/etc目录的的详情
ls -a #可查看隐藏文件
ls -h #可以显示文件的大小
pwd命令
pwd #查看当前所在的路径
mkdir命令
mkdir dir1 #在当前路径下创建文件夹dir1(单级目录)
mkdir -p dir1/dir2 #在当前文件夹下一次创建多级文件夹dir1/dir2
rm命令
rm -f 文件 #强制删除文件
rm -rf 文件夹 #强制删除文件夹
cd命令
cd #直接进入/root目录
cd dir #进入dir文件夹
cd .. #回到上一级目录
cd ../.. #回到上上级目录
cd - #回到最后两次出现的目录之间切换
touch命令
touch a.txt #在当前目录创建a.txt文件 (相对路径)
touch /root/a.txt #在/root目录下创建a.txt文件(绝对路径)
mv命令
mv 文件 目录 #将文件移动到指定目录
mv 文件 文件 #将文件重命名
mv 目录1 目录2(已存在的) #将目录1移动到目录2下
mv 目录1 目录2(未存在的) #将目录1重命名为目录2
cat命令
cat [选项] a.txt #查看a.txt文件
选项:
-b: 列出行号,仅针对非空白行标出行号
-n: 列出行号,空白行也会标出行号
tac命令
查看文件内容,从最后一行显示
more查看文件内容
翻页查看文件内容,一页一页的显示文件内容
more 要查看的文件
使用:
空格键(space):向下翻一页
Enter:向下翻一行
Ctrl+F:向下滚动一屏
Ctrl+B:返回上一屏
less命令
与more用法相似,允许使用pageup、pagedown进行翻页
less 文件
tail命令
查看文件后5行内容
tail -n 5 文件
实时追踪改文件的所有更新
tail -f 文件
head命令
显示文件前10行内容
head 文件
显示文件前5行内容
head -n 5 文件
cp命令
cp a.txt dir #将a.txt文件复制到dir目录
cp a.txt b.txt #将a.txt文件的内容复制给b.txt
重定向
将列表的内容写入指定文件当中
ll >文件
将列表的内容追加到指定文件当中
ll >>文件
echo
将要显示的内容存储到指定文件当中
echo 要显示的内容 >>文件
显示变量的值
echo 变量名
连接
软连接(soft link)
link -s file/dir LinkName
硬链接(hard link)
link file LinkName
连接能够保证文件的一致性
软连接与硬链接的区别:
在删除时,是否删除源文件。硬链接和源文件是同一份文件,而软连接是独立的文件,类似于快捷方式,存储着源文件的位置信息便于指向。软链接,
以路径的形式存在。硬链接,以文件副本的形式存在,但不占用实际空间。软链接可以 跨文件系统 ,硬链接不可以软链接可以对一个不存在的文件名进行
链接,软链接可以对目录进行链接,硬链接不可以,硬链接只有在同一个文件系统中才能创建
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
history查看历史命令
history #查看历史命令
解压缩文件
解压文件
.tar.gz模式
tar -zvxf hadoop-3.1.4.tar.gz #将文件解压到当前目录
tar -vzfx hadoop-3.1.4.tar.gz -C /root/dir #将文件解压到/root/dir目录下
.zip模式
unzip mysql-connector-java-8.0.13.zip #将文件解压到当前目录
unzip -r mysql-connector-java-8.0.13.zip /root/dir #将文件解压到/root/dir目录下
-z 进行解压缩
-x 创建解压文件
-f 指定解压文件
-v 显示详细信息(可不加)
压缩文件
.tar.gz模式
tar -cvxf hadoop-3.1.4.tar.gz #将文件压缩到当前目录
tar -vcfx hadoop-3.1.4.tar.gz -C /root/dir #将文件压缩到/root/dir目录下
.zip模式
zip mysql-connector-java-8.0.13.zip #将文件压缩到当前目录
zip -r mysql-connector-java-8.0.13.zip /root/dir #将文件压缩到/root/dir目录下
-c 创建压缩文件
-x 创建解压文件
-f 指定解压文件
-v 显示详细信息(可不加)
搜索查询类
find命令
find 目录 -name 需要查找的文件名(用单引号括着) #查找目录下的指定文件
find 目录 -name 'ins*' #查找目录下所有以ins开头的文件
find 目录 -name '*in*' #查找目录下包含of的文件
find 目录 -name -tpye f -size +100M #查找目录下文件大小大于100M的文件
grep命令
grep命令可以对文件进行文本查询(查找内容)
grep aa a.txt #在a.txt文件中查找aa
grep a a.txt --color #在文件中查找a,高亮显示
管道命令
管道是linux命令中重要的一个概念,作用是将一个命令的输出作为另个命令的输入(类似mysql的子查询)
ps -ef | grep java #查询名称中包含java的进程
命令1 | 命令2 | 命令3
which命令
查看可执行文件的位置
which pwd #查看可执行文件pwd的位置
进程管理类
ps命令
ps命令用来列出系统中当前运行的进程
ps -ef #查看父进程
-e #查看全部进程
-f #全格式
kill命令
kill命令用于终止执行中的进程
kill -9 pid号 #杀死进程
top命令
查看各个进程的运行状态
top [选项]
选项:
-d 秒数:指定top命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行的命令:
-i:使top不显示任何闲置或者僵死进程。
-p:通过指定监控进程ID来仅仅监控某个进程的状态。
-s:使top命令在安全模式中运行
进入top的操作选项:
P:以CPU使用率排序,为默认排序
M:以内存的使用率排序
N:以PID排序
q:退出top
netstat命令
显示网络统计信息
netstat -anp
pstree查看进程树
pstree [选项]
-p : 显示进程的PID
-u : 显示进程的所属用户
日期时间类
date命令
date #显示当前时间
date+%Y #显示当前年份
date+%m #显示当前月份
date+%d #显示本月第几天
date+%Y/%m/%d #显示以符号分割的日期
date+"+%Y-%m-%d %H:%M:%S" #显示年月分秒
date -d '1 days ago' #显示当前时间的前一天日期
date -d '-1 days ago' #显示当前时间的后一天日期
date -d 'next monday' #显示下周一的时间
设置系统时间
date -s '时间字符串'
查看日历
cal [选项] #显示当前月份日历
选项
-1, --one 只显示当前月份(默认)
-3, --three 显示上个月、当月和下个月
-s, --sunday 周日作为一周第一天
-m, --monday 周一用为一周第一天
帮助类
man
help
help 获得shell内置命令的帮助信息
help 命令 #获得shell内置命令的帮助信息
常用快捷键
Ctrl+c #停止进程
Ctrl+l #清屏
Ctrl+q #退出
tab #补全
↑和↓ #//查找执行过的命令
Ctrl+a #光标移至行首
Ctrl+e #将光标移至行末
Ctrl+b #将光标向左移动一个字符
Ctrl+f #将光标向右移动一个字符
Ctrl+d #退出当前shell命令行
Ctrl+r #搜索使用过的命令
Ctrl+g #退出搜索使用命令
Ctrl+insert #复制命令行内容
Shift+Insert #粘贴命令行内容
Ctrl+k #剪切光标处到行尾的所有字符
Ctrl+u #剪切光标处到行首的所有字符
Ctrl+w #剪切光标前的一个字符
Ctrl+y #粘贴Ctrl+k、Ctrl+u、Ctrl+w剪切的字符
编辑器VI/VIM基本使用
vi/vim a.txt #直接打开文件
vi/vim a.txt +10 #直接打开文件,并定位到第10行
编辑模式(直接进入的默认模式):
插入:
命令行i,在光标处插入;命令行o,在光标下插入一空白行;命令行Shift+o(O),在光标上插入一空白行
复制:
命令行yy,2yy复制两行,5yy复制5行
粘贴:
命令行p,粘到光标的下一行
撤销:
命令行u
删除:
dd删除一行
ndd删除n行
回到文件顶部:
gg
回到文件末尾:
G
查找:
/str 查找str
字符删除:
x,删除光标处的字符
底行模式
:wq保存退出
:wq! 强制保存退出
:q 查看文件内容后退出
:q! 修改内容后不想保存退出
:w 只保存,不退出
:w b.txt 将当前文件另存为b.txt
:x 保存退出
:shift+z+z 快速保存退出
: set nu 显示行号
:123 将光标定位到123行
:%s/旧文件/新文件/g(替换g表示全部替换)
:上方向键 找到刚才的命令
系统管理
查看ip地址
#ifconfig
NAT模式能够自动获取IP地址,但是自动获取的IP地址,有时候会进行改变,需要设置固定的IP地址
修改IP地址
1.使用root登入Linux
2.输入cd /etc/sysconfig/network-scripts
3.输入vi ifconfig-ens33
进入编辑模式
编辑IP地址:IPADDR
编辑网关:GATEWAY
编辑子网掩码:NETMASK
域名解析:NDS
MAC地址:HWADDR
防火墙管理
Centos7
查看防火墙状态
$ sudo systemctl status firewalld
关闭防火墙
$ sduo systemctl stop firewalld
启动防火墙
$ sudo sysctemctl start firewalld
重启防火墙
$ sudo systemctl restart firewalld
注:使用关闭防火墙命令当机器重启后,会再次开启,所以要想永久关闭使用: systemctl disable firewalld
Selinux禁用:
sudo vi /etc/sysconfig/selinux 使SELINUX=disable
要使其生效需要重启机器:reboot
系统关机为:halt
用户与组管理
用户管理
添加用户:useradd 用户名
设置密码:passwd 用户名
删除用户:userdel -r 用户名
修改用户:usermod -g 用户组 用户名
查看用户:
- w #查看用户列表
- id 用户名 #查看指定用户信息
- who #看当前有哪些用户登录在本机器上
- whoami #查看当前用户名
切换用户:
- 普通用户切换到root:su
- root切换到普通用户 :su - 用户名
普通用户设置root权限
修改/etc/sudoers文件
在其下添加一行
用户名 ALL=(ALL) ALL
用户组管理
用户组是具有相同特征用户的逻辑集合,每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,
如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
用于与用户组之间的关系:
- 一对一:一个用户存在一个组中,即这个用户是这个组的唯一成员
- 一对多:一个用户可以存在多个用户组中,用户有多个用户组的权限
- 多对一:多个用户可以存在一个用户组中,这些用户具有和组一样的权限
创建组:groupadd 组名
将用户添加进指定工作组:usermod -a -G groupname username 不加-a会离开原来的所属组
groupmod修改组:groupmod -n 新组名 旧组名
查看组:cat /etc/group
文件权限管理
用户和组
Linux系统上,创建用户的时候,默认会创建一个用户组(与用户名相同)
文件
在Linux系统下面,常见的文件类型
文件: -
目录(文件夹):d
链接(快捷方式):l
文件的归属:
拥有者 ower u
用户组 group g
其他人 other o
--------------------------------------------------------------------------------------------------------------------------------------
文件类型 用户 用户组 文件大小 创建时间 文件名称
-rw-r--r-- . 1 root root 576830621 10月 24 23:10 Anaconda3-2020.07-Linux-x86_64.sh
drwxr-xr-x . 18 501 501 4096 10月 26 17:05 Python-3.6.6
第一部分(10个字符):
-rw-r--r--
又分为三部分:
- rw- r-- r-- 数字表示权限:644
注:红色表示文件类型,黄色表示文件拥有者权限,蓝色表示文件所属组权限,绿色表示其他用户的权限
表示文件类型 表示文件的权限
* 可读r
* 可写w
* 可执行x
* -表示没有任何权限
权限的数字表示方法(以二进制数字之和的方式):
R W x
2^2 2^1 2^0
4 2 1
rw ---->6
rx ---->5
如何设置文件对不同用户的权限:
需要使用root用户
change命令:change mode
eg:-rw-rw-rw. 1 fghtv fghtv 4096 Sep 16 1:21 a.txt
需求:
对于同组用户来说,仅仅可读;对于其他用户来说,既不可读也不可写。
#chmod g-rw a.txt
$chmod o-r a.txt
数字形式表示:
#chmod 660 a.txt
改变文件的拥有者和所属组
命令:chowner(change owner)
#chown fghtv /home/a.txt
chgrp(change group)
#chgrp fghtv /home/a.txt
如果针对一个目录赋权限,目录中有很多的文件,也需要同样的权限设置,就需要使用递归
-R,----recursive 递归
change files and directories recursively
#chmod -R 664 /opt/softwares
例子:将/home/a.txt拥有者和所属者设置为fghtv用户和fghtv组,可以使用一条命令完成
# chown fghtv:fghtv /home/a.txt
在Linux下软件的安装方式
第一种方式:
RPM命令:
检查某个软件是否安装:
rpm -qa | grep java #查看是否安装java
载已安装的软件:
rpm -e --nodeps xxxx (多个用空格隔开)
安装软件
rpm -ivh xxx.rpm
注:此方式安装时有许多依赖比较麻烦
第二种方式:
tar包(里边是源码去编译)安装
zip软件:
### 解压
$ unzip xxx.zip
### 压缩
$ yy.zip filename
tar软件:
###解压
$tar -zxvf xxxx.tar.gz ##解压到当前目录
$tar -zvxf xxxx.tar.gz -C dir ##解压到指定目录
###压缩
$tar -zcvf zzz.tar.gz dir/file ##对指定目录或者文件进行压缩
第三种方式:
yum,解决了软件包之间的依赖,自动找,以及各个软件的安装顺序
yum -y install vim #安装vim并确认安装
yum remove vim #删除vim
磁盘管理
磁盘分区
查看磁盘的使用情况: df -h
查看磁盘分区情况:fdisk -l
进行分区 :fdisk /dev/磁盘名
fdisk命令详解:
m:获取帮助
n:新建分区
p:显示分区表
d:删除分区
b:设置卷标
w:写入分区表
t:改变分区文件系统类型
v:检验分区
l:显示fdisk所支持的文件系统代码
q:退出
注:分区完一定要先写入再退出
一个磁盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个。且主分区+扩展分区总共不能超过4个。逻辑分区可以有若干个,编号从5开始。
磁盘容量与主分区、扩展分区、逻辑分区的关系:
硬盘的容量=主分区的容量+扩展分区的容量
扩展分区的容量=各个逻辑分区的容量之和
格式化分区:
格式化命令:mkfs.ext3 /dev/sdb #将指定分区格式化成 ext3格式
mkfs.ext4 /dev/sdb #将制定分区格式化成 ext4格式
挂载分区:
挂载后就可以使用了
mount /dev/sdb /b1
mount /dev/sdb /b2
由于手动挂载重启需要重新挂载,设置自动挂载
vi /fstab
添加:/dev/sdb /b1 ext3 default 0 0
启动自动挂载:mount -a
卸载分区:
unmount /dev/sdb
显示当前系统内核的版本 uname -r
显示服务器信息 cat /proc/cpuinfo
显示内存信息 cat /proc/meminfo
自动修复磁盘 fsck /dev/sda #fsck:filesystem check
Linux Crontab定时任务
在linux当中,自带的调度功能Crontab,针对用户,每个用户都可以调度自己的任务
crontab -e编辑定时任务
[fghtv@node02 ~]$ crontab -e 进入编辑
功能:每分钟执行一次,将时间写入到指定文件中
*/1 * * * * /bin/date >> /home/fgthv/fg-log.txt
命令:
- crontab -l列出所有定时任务
- crontab -r删除所有的定时任务
crontab基本定义
语法:
* * * * * command
说明:
字段之间用,使用逗号隔开
第一个*:表示分钟,1-59
第二个*:表示小时,0-23
第三个*:表示日:1-31
第四个*:表示月份,1-12
第五个*:表示星期,0-6
例子:
每天21:30执行
30 21 * * * cmd01
每月1,11,21的2:30执行
30 2 1,11,21 * * cmd02
每天20:00 至23:00,每半小时执行一次
0,30 20-23 * * * cmd04
每小时执行一次
* */1 * * cmd05
Shell基础编程
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户。通常我们会使用shell去别写一些对程序及服务器维护的脚本。
脚本通常由一段Linux命令、Shell命令、控制语句以及注释语句构成
Shell脚本的编写
Shell脚本是纯文本文件,可以使用任何文本编辑器编写
Shell脚本通常是以.sh为后缀
第一行:指定使用哪个程序来编译和执行脚本
- #!/bin/bash
- #!/bin/sh
注释行:使用(#)符号
变量
变量命名:
变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。
任何其他字符都标志变量名的结束。
变量名关于大小写敏感
变量类型:
根据变量的作用域,变量可以分为本地变量和环境变量
本地变量只在创建他们的shell程序中可用。而环境变量则在Shell中
的所有用户进程中可用,通常也称为全局变量。
##定义变量
#!/bin/bash
a=1 #定义变量a
b=2 #定义变量b
echo"a=$a" #输出a
unset b #撤销变量b
echo"unset b=$b" #输出变量b
readonly c="静态变量" #声明静态变量,不是撤销
export d=4 #设置全局变量,供其他程序使用
变量赋值:
等号两边不能有空格
如果要给变量赋空值,可以在等号后面跟一个换行符
定义变量
a=1 #定义变量a
b=2 #定义变量b
输出变量
echo "a=$a" #结果 a=1
变量的追加
a="$a"23 或者 a=${a}23
echo a #结果123
清除变量
unset b #撤销变量b
echo"unset b=$b" #结果为空
readonly c="静态变量" #声明静态变量,不能撤销
环境变量
按照惯例需要大写
用户自定义的变量只能在当前的shell中生效,环境变量则可以在当前shell及这个shell的所有子程序中生效,可供其他程序使用。
声明变量:export 变量名=值
查询变量:env
清除变量:unset
声明后的环境变量,使用source命令对配置文件刷新,变量就立即生效了。
位置参量
位置参量是一组特殊的内置变量,通常被shell脚本用来从命令行接收参数
或被函数用来保存传递给它的参数。
执行Shell脚本时,用户可以通过命令向脚本传递信息,跟在脚本名后面的
用空格隔开的每个字符串都称为位置参量。
在脚本中使用这些参数时,需通过为止参量来引用。例如:$1表示第一个参
数,$2表示第二个参数,以此类推。$9以后需要用花括号把数字括起来,如
第10个位置参量以${10}的方式来访问。
$0 | 当前脚本的文件名 |
$1-$9 | 第1个到第9个位置参量 |
${10} | 第10个位置参量,${n}...大于10都用{ } |
$# | 位置参量的个数 |
$* | 以单字符串显示所有位置参量 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$$ | 脚本运行的当前进程号 |
$! | 最后一个后台运行的进程的进程号 |
$? | 显示前面最后一个命令的退出状态,0表示没有错误,其他表示有错误 |
预定义变量
已经定义好的变量,用户只能使用不能重新定义
- $#:位置参数的数量
- $*:所有位置参数的内容
- $?:命令执行后返回的状态
- $$:当前进程的进程号
- $!:后台运行的最后一个进程号
- $0:当前执行的进程名
运算符
基本语法:$((运算式)) 或 $[运算式]
表达式
expr 是一款表达式计算工具,使用它能完成表达式的求值操作,表达式需要用反引号(` `)括起来,且表达式与运算符之间要用空格隔开
expr m+n #加
expr m-n #减
expr m*n #乘
expr m/n #除
expr m%n #取余
案例:
计算1×2+2×3的值
1.A=$[1*2+2*3]
2.A=((1*2+2*3))
3.A=`expr 1 \* 2 + 2 \* 3`
条件判断
两个整数的比较
符号 | 说明 |
= | 字符串比较 |
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
按照文件权限进行判断
符号 | 说明 |
-r | 具有读的权限 |
-w | 具有写到权限 |
-x | 具有执行的权限 |
按照文件类型进行判断
符号 | 说明 |
-f | 文件存在并且是一个常规的文件 |
-e | 文件存在 |
-d | 文件存在并且是一个目录 |
案例:
判断a是否小于b
#[ a -lt b ]
判断a.txt是否有写权限
#[-w /root/a.txt]
判断文件a.txt是否存在
#[-e /root/a.txt ]
逻辑运算符
- 逻辑与 &&
- 逻辑或 ||
if判断
单层次判断试
if [条件判断式];then
当条件判断式成立时,可以进行的指令工作内容;
fi
注:fi表示if结束的意思
也可以这样写
if [条件判断式]
then
当条件判断式成立时,可以进行的指令工作内容
fi
多重、复杂条件判断式
if [条件判断式1];then
当条件判断式1成立时,可以进行的指令工作内容
elif [条件判断式2];then
当条件判断式2不成立时,进行的指令工作内容
else
条件判断式1,条件判断式2都不成立时,执行的内容
fi
注:中括号和条件判断式之间必须有空格
while循环
while [条件判断式]
do
指定的工作内容
done
until [条件判断式]
do
指定的工作内容
done
此方式特有while相反,当条件判断式成立时终止循环。
for循环
for 变量 in 值1 值2 ...
do
指定的工作内容(程序)
done
for ((初始值;循环条件语句;条件控制语句))
do
指定的工作内容
done
case语句
case $变量名 in
值1)
程序1
;;
"值2")
程序2
;;
...
"值n")
程序n
;;
*)
如果变量的值与以上所有值都不匹配,执行此内容
;;
esac
read读取控制台输入
read [选项] 参数
选项
1.-p:指定读取值时的提示符
2.-t:指定读取时等待的时间(秒)
参数:
指定读取值的变量名