• 史上最方便的Linux教程


    linux在线教程

    介绍

    蓝桥云课的linux课程,什么都不需要安装,微信扫 码登录后即可直接在线操作学习。不过教程有一些概念看不懂😅,建议看懂多少是多少吧,无需纠结。下面是我列举的一些重点。

    课程内容

    计算机系统分层

    应用程序
    操作系统:系统调用、内核
    硬件
    
    • 1
    • 2
    • 3

    快捷键

    ctrl + k 删除光标之后的所有字符 # 很好用
    alt + backspace 删除前一个单词
    
    • 1
    • 2

    查看指令详细信息

    man 命令
    
    • 1

    查看指令基本信息

    命令 --help
    
    • 1

    用户

    查看在线用户

    who
    
    • 1

    我是谁

    who am i
    
    • 1

    创建用户

    sudo adduser 用户名
    
    • 1

    💡会在/home目录下创建对应工作目录

    登录(切换用户)和退出

    su -l 用户名
    exit
    
    • 1
    • 2

    查看所属用户组

    groups 用户名
    
    • 1

    查看用户组信息

    cat /etc/group
    
    • 1

    💡每一行包含组名:用户组密码:组id:组成员,组成员可为空,例如默认创建的用户会创建跟用户同名的组。

    给用户赋予root权限:加入sudo组

    sudo usermod -G sudo 用户名
    
    • 1

    删除用户

    sudo deluser 用户名 --remove-home
    
    • 1

    💡–remove-home代表同时删除用户的工作目录

    删除用户组

    groupdel
    
    • 1

    文件权限

    列出当前目录下的文件或目录。内容包括文件的类型、权限、大小、拥有者、所属组等

    ls -l
    
    • 1

    💡参数: -a隐藏文件 -d目录 -h文件大小带单位

    首先需要知道ll列出的每一行的代表什么

    - rwx rwx rwx
    分别代表文件类型(-代表文件,d代表目录,l代表软链接…)和
    三种权限(拥有者、所属组、其它人)其中,rwx代表读、写、执行权限

    ⚡️一个目录同时具有读权限和执行权限 才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件

    修改文件拥有者

    sudo chown 用户名 文件名
    
    • 1

    修改文件权限

    chmod 777 文件名
    
    • 1

    💡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 文件名 
    
    • 1

    💡每个inode都会对应一个文件

    硬链接与软链接

    • 硬链接是指向索引节点inode的指针,它的文件和链接文件的索引节点号码相同
    • 软链接存放的是链接文件的路径,链接文件一旦删除,就无法访问了,因为找不到。

    ⚡️我们平时创建文件,该文件就会有一个硬链接,删除文件只是删除一个链接,只有链接都没有了,文件内容才被真正删除,ll的第二个字段就是链接数

    查看文件的inode信息

    stat file
    
    • 1

    文件操作

    新建文件

    touch 文件名
    
    • 1

    新建目录

    mkdir 目录名
    # -p创建多级目录
    mkdir -p  /目录1/目录2/目录3
    
    • 1
    • 2
    • 3

    复制文件

    cp  文件名  复制的位置
    
    • 1

    💡复制目录需要加上-r参数

    删除文件

    rm 文件名
    
    • 1

    💡-f强制删除,忽略某些删除提示;-r删除目录

    😅相信这个时候你就知道网上的说的删库跑路是什么命令了sudo rm -rf /*

    移动文件或重命名

    mv  文件名	移动位置或新文件名
    
    • 1

    💡移动多个文件用空格隔开,rename是非内置命令

    查看文件

    cat 文件名
    
    • 1

    💡-n 代表是否显示行号,-A显示特殊字符(后面有案例)

    分页查看:某些文件的内容很多,屏幕一页是显示不完的

    more 文件名
    
    • 1

    💡回车向下滚动一行,空格下一页,h显示帮助,q退出

    查看前几行或后几行

    head/tail 文件名
    
    • 1

    💡-n 10可指定查看行数

    查看文件类型

    file 文件名
    
    • 1

    环境变量

    声明、获取、删除普通变量

    name="zone"
    echo $name
    unset name
    
    • 1
    • 2
    • 3

    查看环境变量

    env
    
    • 1

    普通变量转为环境变量

    export 变量名
    
    • 1

    💡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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    指令搜索顺序

    1. 以绝对或相对路径来执行指令,例如 cat /p1/p2/p3/file;
    2. 由别名找到该指令来执行,例如ls;
    3. 由 Bash 内部的指令来执行,例如cd;
    4. 按 $PATH 变量指定的搜索路径的顺序找到第一个指令来执行。

    命令划分

    • 内部命令:exit、cd、history
    • 外部命令:vi、ls

    查看

    which/type 命令
    
    • 1

    搜索文件

    # 局限于某些文件类型
    whereis 文件名     
    # 查看某个命令或程序是否安装
    which 命令
    # 啥都可以找
    find  查找目录 -name 文件名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    压缩和解压

    zip unzip

    #压缩
    zip  zip文件
    #解压
    unzip  zip文件  -d 指定解压目录
    
    • 1
    • 2
    • 3
    • 4

    💡-r表示递归打包,-q表示是否输出打包信息,-e表示加密
    💡-d指定解压目录,不存在会自己创建

    tar

    # 压缩-c
    tar -cf  tar文件 压缩目录
    # 解压-x
    tar  -xf  tar文件 -C 解压目录
    
    • 1
    • 2
    • 3
    • 4

    💡 -f必须在.tar前面,-v用于显示压缩过程
    💡-C指定解压目录,需要自己创建

    -z参数实现gzip解压缩

    tar -czf 压缩文件名.tar.gz 压缩目录
    tar -xzf 压缩文件名.tar.gz  -C 解压目录
    
    • 1
    • 2

    💡同理其它工具也可如此,像bzip2

    磁盘管理

    查看磁盘大小

    df -h
    
    • 1

    查看目录大小

    du -h /目录名或文件
    
    • 1

    💡-d 0 查看文件的层次深度,0代表第一层

    执行周期性任务Crontab

    # 开启后台进程执行任务
    sudo cron -f &
    # 为当前用户添加任务
    crontab -e 
    # 查看添加的任务
    crontab -l 
    # 删除任务
    crontab -r
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    crontab添加任务的格式

    * * * * * 定时任务(也就是要执行的命令)
    星号分别代表分钟(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-6)
    
    每分钟创建一个文件
    * * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    rsyslog日志使用:用于记录任务执行情况

    # 安装 启动 查看日志文件
    sudo apt-get install -y  rsyslog
    service rsyslog start
    tail -f /var/log/syslog
    
    • 1
    • 2
    • 3
    • 4

    多命令

    顺序执行多个命令可一次性输入,通过分号分割,每个命令都会执行,无论是否执行成功;选择的执行命令,通过&&分割,只有前一个命令执行成功才会执行后一条;同理还有通过||分割,那一条先成功就执行那一条

    命令的执行结果:成功则返回0,否则返回非0

    获取上一次命令的返回值

    echo $?
    
    • 1

    管道

    😅想起了老师上课提到的linux的设计原则:KISS原则(keep it simple stupid)

    是一种通信方式,用于进程间的通信

    具体就是将前面进程的输出(stdout)作为下一个进程的输入(stdin)

    cat file | grep 'xx' | sort | uniq | ...
    
    • 1

    常用文本处理命令

    计算文件的行数、字符数、字节数

    wc -l/-w/-c  file
    
    • 1

    按字典排序

    sort file
    
    • 1

    ⚡️-knum指定第num个字段作为排序,-n按数字排序,-r逆序,-t指定分隔符

    连续去重:一般需要先排序,否则去重去不干净

    uniq file 
    
    • 1

    ⚡️-d只输出有重复的行,-c重复行计数

    grep匹配

    grep '基本正则' file
    #grep 需要加上`-E`参数
    grep -E '扩展正则' file
    
    • 1
    • 2
    • 3

    ⚡️-n打印行号,-v取反,-i忽略大小写,-w以单词的形式匹配,

    1. 基本正则表达式
      *代表前面的字符有0个或多个重复
      ^和$分别代表行开头和行结尾
      匹配特殊字符需要转义,\* \.
      .代表任意字符,.*代表任意多个字符
      [^a]不包含该字母
      [0-9]数字 [a-z,A-Z] 字母

    2. 扩展正则表达式
      字母{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
    
    • 1
    • 2
    • 3
    • 4
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    处理特殊字符

    换行符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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    sed编辑器

    sed  'pattern' file
    
    • 1

    💡-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
    
    • 1

    💡-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
    
    • 1
    • 2
    • 3
    • 4
    # 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
    cat -A /etc/protocols
    # 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
    cat /etc/protocols | col -x | cat -A
    
    • 1
    • 2
    • 3
    • 4

    文件合并join paste

    join 对比相同才合并,默认对比第一个字段

    # 创建两个文件
    echo 'zone hello' > f1
    echo 'zone world' > f2
    join f1 f2
    # 结果:zone hello world
    
    • 1
    • 2
    • 3
    • 4
    • 5

    paste 只合并不对比

    echo hello > f1
    echo zone > f2
    paste -d ':' f1 f2
    paste -s f1 f2
    # -d	指定合并的分隔符,默认为Tab
    # -s	不合并到一行,每个文件为一行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    重定向

    改变输入输出方向

    文件描述符	设备文件	  说明
    0		/dev/stdin	标准输入
    1		/dev/stdout	标准输出
    2		/dev/stderr	标准错误
    
    • 1
    • 2
    • 3
    • 4

    标准输入流重定向 <

    # 文件内容小写转大写
    tr a-z A-Z  <  file 
    
    • 1
    • 2

    标准输出重定向 >

    echo "abc" > file  #覆盖
    echo "abc" >> file  # 追加
    
    • 1
    • 2

    错误信息输出重定向–使用文件描述符

    ll 不存在的文件  2>  文件名
    
    • 1

    实现重定向的同时也输出到屏幕

    tee 文件名
    
    • 1

    exec实现一直重定向,也就是输入的命令啥的都会重定向到指定文件,而不是每个命令都需要使用>或>>

    exec 1>文件名 
    一系列命令...
    exit
    
    • 1
    • 2
    • 3

    💡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...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    💡centos用rpm

    进程管理

    进程分类

    1. 根据服务对象分类
      用户进程(执行非系统内核程序)和系统进程(执行系统内核程序)
    2. 按服务类型
      交互进程、批处理进程、守护进程
      守护进程是一直运行的一种进程,在系统启动时启动,在系统关闭时终止。例如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
    
    • 1

    罗列所有进程信息

    ps aux
    
    • 1

    连同显示进程关系(父子进程)

    ps axjf
    
    • 1

    实时查看进程状态

    top
    
    • 1

    面试重点参考

    链接:cs-note

  • 相关阅读:
    【排版教程】使用Latex ACM 双栏会议模板如何添加跨栏的图片
    定时重启指定的软件
    基于Python+Django深度学习的身份证识别考勤系统设计与实现
    远程登录云上显卡(英伟达RTX5000)的主机,解决游戏应用帧率降低的问题
    硬核性感!沉浸式体验 ZStack Cube 超融合的7大亮点功能
    unity鼠标双击
    孩子学习编程对学习有帮助吗?
    数据结构与算法C语言版学习笔记(1)-绪论
    TCP练习
    【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析
  • 原文地址:https://blog.csdn.net/qq_45833812/article/details/125391759