文章目录
💡表示提示 ⚡️表示扩展 🐟表示面试问过
介绍
蓝桥云课的linux课程,什么都不需要安装,微信扫 码登录后即可直接在线操作学习。不过教程有一些概念看不懂😅,建议看懂多少是多少吧,无需纠结。下面是我列举的一些重点。
课程内容
计算机系统分层
应用程序
操作系统:系统调用、内核
硬件
快捷键
ctrl + k 删除光标之后的所有字符 # 很好用
alt + backspace 删除前一个单词
查看命令详细信息
man 命令
查看命令基本信息
命令 --help
用户
查看在线用户
who
我是谁
who am i
创建用户
sudo adduser 用户名
💡会在/home目录下创建对应工作目录
登录(切换用户)和退出
su -l 用户名
exit
查看所属用户组
groups 用户名
查看用户组信息
cat /etc/group
💡文件每一行为组名:用户组密码:组id:组成员,组成员可为空,例如默认创建的用户会创建跟用户同名的组。
给用户赋予root权限:加入sudo组
sudo usermod -G sudo 用户名
删除用户
sudo deluser 用户名 --remove-home
💡–remove-home代表同时删除用户的工作目录
删除用户组
groupdel
文件权限
列出当前目录下的文件或目录。内容包括文件的类型、权限、大小、拥有者、所属组等
ls -l
💡参数: -a隐藏文件 -h文件大小带单位 -d 显示指定目录信息,默认是目录下的文件的信息
首先需要知道ll
列出的每一行的代表什么
- rwx rwx rwx
分别代表文件类型(-代表文件,d代表目录,l代表软链接…)和
三种权限(拥有者、所属组、其它人)其中,rwx代表读、写、执行权限
⚡️一个目录同时具有读权限和执行权限 才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件
修改文件拥有者
sudo chown 用户名 文件名
修改文件权限
chmod 777 文件名
💡777代表rwx-rwx-rwx
,每个rwx
对应421,像6代表rw-
,4代表r--
目录结构
树形结构:/
-> /boot
、/dev
、/var
-> /run
…
~
代表当前用户的home目录,即/home/username
.
表示当前目录
..
表示上一级目录
pwd
获取当前路径
文件底层
硬盘最小单位是扇区,块由多个扇区构成,文件的数据存储在块(block)中,而文件的元信息则存放在inode中。
block: 存放文件的数据,一个文件可占用多个块,但一个块只能放一个文件
(因为数据是由 inode 指向的,如果有两个文件的数据存放在同一个块中,就会乱套了)
inode: 用于记录文件元信息,例如文件拥有者,创建时间。
查看文件的inode信息
stat 文件名
💡每个inode都会对应一个文件
硬链接与软链接
- 硬链接是指向索引节点inode的指针,它的文件和链接文件的索引节点号码相同
- 软链接存放的是链接文件的路径,链接文件一旦删除,就无法访问了,因为找不到。(又称符号链接)
⚡️我们平时创建文件,该文件就会有一个硬链接,删除文件只是删除一个链接,只有链接都没有了,文件内容才被真正删除,ll
的第二个字段就是链接数
查看文件的inode信息
stat file
文件操作
新建文件
touch 文件名
新建目录
mkdir 目录名
# -p创建多级目录
mkdir -p /目录1/目录2/目录3
复制文件
cp 文件名 复制的位置
💡复制目录需要加上-r参数,如果复制的文件跟原来的文件名字和路径一样,则报错。
删除文件
rm 文件名
💡-f
强制删除,忽略某些删除提示;-r
删除目录
😅相信这个时候你就知道网上的说的删库跑路是什么命令了sudo rm -rf /*
文件移动或重命名
mv 文件名 移动位置或新文件名
💡移动多个文件用空格隔开,且移动的位置需要提前创建,rename是非内置命令
查看文件
cat 文件名
💡-n
代表是否显示行号,-A
显示特殊字符(后面有案例)
分页查看:某些文件的内容很多,屏幕一页是显示不完的
more 文件名
💡回车向下滚动一行,空格下一页,h显示帮助,q退出
查看前几行或后几行
head/tail 文件名
💡-n 10
可指定查看行数-f
可以保持内容最新,例如查看日志时,tail -200f app.log 代表查看最新200行的日志,如果日志有更新,看到的也会更新,这个非常常用
less 文件名
类似more,但是更强大,支持搜索,用/内容
正向搜索?内容
反向搜索,按n代表搜索下一个,shift+n代表上一个。
查看文件类型
file 文件名
环境变量
声明、获取、删除普通变量
name="zone"
echo $name
unset name
查看环境变量
env
普通变量转为环境变量
export 变量名
💡shell关闭就失效,需要添加到/etc/profile配置文件才能持久
PATH变量
Shell执行某个命令是通过搜索PATH中的路径,从而找到要执行的命令
echo $PATH
# 添加自定义路径,从而实现像系统命令一样,无需使用绝对路径就能执行,因为shell会去PATH中搜索
PATH=$PATH:/yourpath
#删除自定义路径
tmp=$PATH
tmp=${tmp%:/yourpath}
echo $tmp
PATH=$tmp
# 但是这种方式一旦退出shell,PATH的设置就会失效
# 可以通过修改配置文件home/username/.zshrc(不同shell的配置文件不同)实现,每次启动shell都会执行该配置文件
echo "PATH=$PATH:/yourpath" >> .zshrc
# 修改配置文件之后需要关闭shell重启才有效,或者使用source
source .zshrc
指令搜索顺序
- 以绝对或相对路径来执行指令,例如 cat /p1/p2/p3/file;
- 由别名找到该指令来执行,例如ls;
- 由 Bash 内部的指令来执行,例如cd;
- 按 $PATH 变量指定的搜索路径的顺序找到第一个指令来执行。
命令划分
- 内部命令:exit、cd、history
- 外部命令:vi、ls
查看
which/type 命令
搜索文件
# 局限于某些文件类型
whereis 文件名
# 查看某个命令或程序是否安装
which 命令
# 啥都可以找
find 查找目录 -name 文件名
压缩和解压
zip unzip
#压缩
zip zip文件名 待压缩文件
#解压
unzip zip文件名 -d 指定解压目录
💡-r
表示递归打包,-q
表示是否输出打包信息,-e
表示加密
💡-d
指定解压目录,不存在会自己创建
tar
# 压缩-c
tar -cf tar文件 压缩目录
# 解压-x
tar -xf tar文件 -C 解压目录
💡 -f
必须在.tar前面,-v
用于显示压缩过程
💡-C
指定解压目录,需要自己创建
-z
参数实现gzip解压缩
tar -czf 压缩文件名.tar.gz 压缩目录
tar -xzf 压缩文件名.tar.gz -C 解压目录
💡同理其它工具也可如此,像bzip2
磁盘管理
查看磁盘大小
df -h
查看目录大小
du -h /目录名或文件
💡-d 0
查看文件的层次深度,0代表第一层
执行周期性任务Crontab
# 开启后台进程执行任务
sudo cron -f &
# 为当前用户添加任务
crontab -e
# 查看添加的任务
crontab -l
# 删除任务
crontab -r
* * * * * 定时任务(也就是要执行的命令)
星号分别代表分钟(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-6)
每分钟创建一个文件
* * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)
rsyslog日志使用:用于记录任务执行情况
# 安装 启动 查看日志文件
sudo apt-get install -y rsyslog
service rsyslog start
tail -f /var/log/syslog
多命令
顺序执行多个命令可一次性输入,通过分号分割
,每个命令都会执行,无论是否执行成功;选择的执行命令,通过&&分割
,只有前一个命令执行成功才会执行后一条;同理还有通过||分割
,那一条先成功就执行那一条
命令的执行结果:成功则返回0,否则返回非0
获取上一次命令的返回值
echo $?
管道
😅想起了老师上课提到的linux的设计原则:KISS原则(keep it simple stupid)
是一种通信方式,用于进程间的通信
具体就是将前面进程的输出(stdout)作为下一个进程的输入(stdin)
cat file | grep 'xx' | sort | uniq | ...
常用文本处理命令
计算文件的行数、字符数、字节数
wc -l/-w/-c file
💡默认不加选项三个都显示
按字典排序
sort file
⚡️-knum
指定第num个字段作为排序,-n
按数字排序,-r
逆序,-t
指定分隔符
连续去重:一般需要先排序,否则去重去不干净
uniq file
⚡️-d
只输出有重复的行,-c
重复行计数
grep匹配
grep '基本正则' file
#grep 需要加上`-E`参数
grep -E '扩展正则' file
⚡️-n
打印行号,-v
取反,-i
忽略大小写,-w
以单词的形式匹配,
-
基本正则表达式
*
代表前面的字符有0个或多个重复
^和$
分别代表行开头和行结尾
匹配特殊字符需要转义,\* \.
.
代表任意字符,.*
代表任意多个字符
[^a]
不包含该字母
[0-9]
数字[a-z,A-Z]
字母 -
扩展正则表达式
字母{2}
表示该字母要匹配2次,也就是2个重复
字母{2,}
表示该字母至少要匹配2次
cut截取
#截取第5个、前5个、第5个到末尾、第2到第5个字符
cut /etc/passwd -c 5
cut /etc/passwd -c -5
cut /etc/passwd -c 5-
cut /etc/passwd -c 2-5
💡-fnum
指定第几个字段,多个用逗号分割,-d
指定分隔符,-c
选中某些字符
tr删除
# -d删除全部o、l
$ echo 'hello World' | tr -d 'ol'
# -s去重
$ echo 'hello' | tr -s 'l'
# 替换
echo '1007611'| tr 7 8
处理特殊字符
换行符Windows为 CR+LF(\r\n),Linux/UNIX 为 LF(\n)
使用cat -A文本查看不可见特殊字符
Linux 的 \n 表现出来就是一个$,而 Windows/dos 的表现为 ^M$
使用:linux文件和windos文件之间的转换
cat windos_file | tr -d '\r' > unix_file
cat unix_file | tr $ '\r' > windos_file
sed文本处理
sed 'pattern' file
💡
-n
禁止匹配自动输出,与p配和能只输出匹配的数据
-i
直接修改了文件(将输出结果覆盖文件),注意不能与-n或p一起使用,否则会出现文件只有匹配内容,或者存在重复的匹配数据。
pattern
:
d删除,1,3d
表示删除1到3行
p打印,1,3p
表示打印1到3行
s替换,s/匹配/替换/g
代表替换每行中匹配,不加g则只替换一个
s/匹配/替换/num
代表替换第几个匹配,如果要输出,同样需要加p和-n
场景:配置文件内容替换
1、查看匹配情况
sed -n 's/db.connect.ip=127.0.0.1/db.connect.ip=192.168.1.1/gp' application-dev.properties
2、直接替换
sed -i 's/db.connect.ip=127.0.0.1/db.connect.ip=192.168.1.1/g' application-dev.properties
awk文本处理语言
awk '正则{行为}' file
💡-F
指定分隔符,指定多个需要加中括号-F'[:;]'
-v
用于传递参数,例如为某个文本添加一列当前日期数据,可以这样实现
etlDt = `date`
awk -v rowDt=$etlDt '{print $rowDt, $1}' fileName
内建变量:$0
代表当前行,NR
代表行号,$num
代表第num个字段,OFS
指定输出分隔符
行为:print
#打印用户名以s开头的用户,格式为用户名=工作目录
awk -F':' '$1~/^s/{print $1,$6}' OFS="=" /etc/passwd
#打印用户id和组id的和为前10的用户
awk -F':' '{print $3+$4,$1}' /etc/passwd | sort -nr | head -n10
# 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
cat -A /etc/protocols
# 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
cat /etc/protocols | col -x | cat -A
文件合并join paste
join 对比相同才合并,默认对比第一个字段
# 创建两个文件
echo 'zone hello' > f1
echo 'zone world' > f2
join f1 f2
# 结果:zone hello world
paste 只合并不对比
echo hello > f1
echo zone > f2
paste -d ':' f1 f2
paste -s f1 f2
# -d 指定合并的分隔符,默认为Tab
# -s 不合并到一行,每个文件为一行
重定向
改变输入输出方向
文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误
标准输入流重定向 <
# 将文件内容小写转大写
tr a-z A-Z < file
标准输出重定向 >
echo "abc" > file #覆盖
echo "abc" >> file # 追加
错误信息输出重定向–需使用文件描述符
例如你ll查看一个不存在的目录或文件,终端会提示报错信息,如果想隐藏,使用标准错误重定向。
ll 不存在的文件 2> 文件名
ll 不存在的文件 2>> 文件名 #追加
合并标准输出和错误信息输出,本质就是将标准错误重定向到标准输出
# 2>&1能够让两者都输出到文件
ll 不存在或存在的文件 > 文件名 2>&1
⚡️对于重定向不需要保存到文件,可输出到/dev/null
实现重定向的同时也输出到屏幕
tee 文件名
exec实现一直重定向,也就是输入的命令啥的都会重定向到指定文件,而不是每个命令都需要使用>或>>
exec 1>文件名
一系列命令...
exit
💡exec会使用一个进程代替当前进程,所以需要exit,重定向才消失(你也可以自己创建进程bash)
软件安装
# Ubuntu
sudo apt-get insatll 软件名
# -y 自动选择安装选项
# --reinstall 重新安装
sudo apt-get update 更新软件源
sudo apt-get remove 软件名
# --purge 同时删除配置文件
# 搜索安装的软件
sudo apt-cache search softname1 softname2...
💡centos用rpm
,例如安装rpm包,rpm -ivh xxx.rpm
进程管理
进程分类
- 根据服务对象分类
用户进程(执行非系统内核程序)和系统进程(执行系统内核程序) - 按服务类型
交互进程、批处理进程、守护进程
守护进程是一直运行的一种进程,在系统启动时启动,在系统关闭时终止。例如cron进程,这个进程为 crontab 的守护进程,可以周期性的执行用户设定的某些任务。
系统调用
- fork() 为当前进程创建子进程,就是把父进程的 PCB 等进程的数据结构信息直接复制过来,只是修改了 PID
- exec() 作用是切换子进程中的执行程序也就是替换其从父进程复制过来的代码段与数据段
init进程
init 是用户进程的第一个进程也是所有用户进程的父进程或者祖先进程,pstree的根节点就是init进程
💡进程 0 是系统引导时创建的一个特殊进程,也称之为内核初始化,其最后一个动作就是调用 fork() 创建出一个子进程运行 /sbin/init 可执行文件,而该进程就是 PID=1 的进程 1,而进程 0 就转为交换进程(也被称为空闲进程),进程 1 (init 进程)是第一个用户态的进程,再由它不断调用 fork() 来创建系统里其他的进程,所以它是所有进程的父进程或者祖先进程。同时它是一个守护程序,直到计算机关机才会停止
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养和处理。
⚡️由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
僵尸进程
一个进程使用fork创建子进程,如果子进程退出exit()时,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符(PCB)仍然保存在系统中。这种进程称之为僵尸进程。
⚡️系统能用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
⚡️要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养处理。
文章:链接
进程树–显示进程之间的关系
pstree
罗列所有进程信息
ps aux
💡 第一列用户名、第二列进程号(PID)
简单罗列所有进程信息比aux简洁
ps -ef
连同显示进程关系(父子进程)
ps axjf
💡第三列表示父进程id(PPID)
实时查看系统信息🐟
top
如cpu的负载、cpu利用率、系统进程、内存的使用情况等
load average
三个数值分别对应 1、5、15 分钟内 cpu 的平均负载
教程具体解释
这是单个 CPU 单核的情况,而实际生活中我们需要将得到的这个值除以我们的总核数来看。
根据/proc/cpuinfo查看CPU的个数与核心数
#查看物理 CPU 的个数
cat /proc/cpuinfo | grep "physical id" | sort | uniq |wc -l
#每个 cpu 的核心数
cat /proc/cpuinfo | grep "physical id" | grep "0" | wc -l
从上面不难看出load average的临界值是1,但一般达到0.7的时候就要开始注意了。
💡
-p
pid 只监测指定线程
-H
查看线程
shfit + H 按内存排序
shfit + P 按CPU使用率排序(默认)
实际使用较多命令
1.lsof查看端口占用
贼好用lsof -i:8080
2.杀死进程(-9代表强制)
kill pid
2.查看某个应用的进程号
ps -ef|grep pid
3.根据进程号查看进程的启动目录
pwdx pid
3.netstat查看端口号
例如端口号被占用时:transport error 202: bind failed: 地址已在使用,可以使用该命令;lsof也可以,但是有时候服务器人家权限不一定给你使用该命令
netstat -npl | grep port
netstat -tuln | grep 5601
4.实时查看一些动态文件,如日志(会卡住客户端,类似top)
tail -f 文件名
可以在f前添加数字限制显示多少行。
5.直观查看进程号
jps -l
6.后台执行
nohup 运行jar > /dev/null 2>&1 &
7. cat或less用于查看文件,那么对于压缩文件怎么看,解压看?
其实只需要加上z就行,例如zcat,zless即可。
查看系统信息
版本
cat /etc/centos-release
cpu
# 罗列各个处理器
cat /proc/cpuinfo
# cpu信息
lscpu
# 物理核心数
physical id 的不同个数,可通过如下命令查看
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l
# 逻辑核心数
通过cpu cores可查看,可简单理解为有多个处理器就有多少个
cat /proc/cpuinfo | grep 'cpu cores'
未来更多原理阅读
https://zhuanlan.zhihu.com/p/140531888