蓝桥云课的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隐藏文件 -d目录 -h文件大小带单位
首先需要知道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都会对应一个文件
硬链接与软链接
⚡️我们平时创建文件,该文件就会有一个硬链接,删除文件只是删除一个链接,只有链接都没有了,文件内容才被真正删除,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可指定查看行数
查看文件类型
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
指令搜索顺序
命令划分
查看
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代表第一层
# 开启后台进程执行任务
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直接修改了文件,而不是返回修改结果
pattern:
d删除,1,3d 表示删除1到3行
p打印,1,3p 表示打印1到3行
s替换,s/匹配/替换/g 代表替换每行中的全部匹配,不加g则只替换一个
s/匹配/替换/num 代表替换第几个匹配,如果要输出,同样需要加p和-n
awk文本处理语言
awk '正则{行为}' file
💡-F指定分隔符,指定多个需要加中括号-F'[:;]'
内建变量:$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 不存在的文件 2> 文件名
实现重定向的同时也输出到屏幕
tee 文件名
exec实现一直重定向,也就是输入的命令啥的都会重定向到指定文件,而不是每个命令都需要使用>或>>
exec 1>文件名
一系列命令...
exit
💡exec会使用一个进程代替当前进程,所以需要exit,重定向才消失(你也可以自己创建进程bash)
⚡️对于重定向不需要保存的信息,可输出到/dev/null
# Ubuntu
sudo apt-get insatll 软件名
# -y 自动选择安装选项
# --reinstall 重新安装
sudo apt-get update 更新软件源
sudo apt-get remove 软件名
# --purge 同时删除配置文件
# 搜索安装的软件
sudo apt-cache search softname1 softname2...
💡centos用rpm
进程分类
系统调用
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
连同显示进程关系(父子进程)
ps axjf
实时查看进程状态
top
链接:cs-note