基础命令行

echo指令 - 显示字符

  • 功能:在屏幕上输出指定字符,是shell脚本中最常用的命令之一
  • 指令格式echo "<string>"

bc指令 - 交互式计算器

  • 功能:交互式命令行计算器
  • 指令格式bc 进入交互式计算器,CTL+C退出交互界面

expr指令 - 非交互式计算器

  • 功能:非交互式命令,直接输出结果
  • 指令格式expr <expression>,注意操作符之间加空格,不加空格会直接输出表达式
  • 实例
    1
    2
    3
    4
    expr 1+1
    1+1
    expr 1 + 1
    2

date指令 - 显示时间

  • 功能:显示系统当前日期和时间
  • 指令格式date显示系统时间

cat指令 - 显示文件内容

  • 功能:查看文件内容(最基本用法)
  • 指令格式cat <file path>

hostnamectl指令 - 主机管理

  • 更改主机名称hostnamectl set-hostname <hostname>

pwd指令 - 显示当前工作目录

  • 功能:显示当前工作路径
  • 指令格式pwd

whoami - 显示当前用户

  • 功能:显示当前操作用户

基础目录结构

路径介绍

  • 绝对路径:以顶级目录开头的完整路径,在Linux系统中顶级目录是根目录”/“
  • 相对路径:不以根目录开头,基于当前工作目录的路径表示方式

一级文件目录及功能

一级文件目录 功能及作用
/bin 存放系统命令,普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行,是软链接 /bin -> /usr/bin
/sbin 保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看,是软链接 /sbin -> /usr/sbin
/boot 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等
/dev 设备文件保存位置,常见设备文件,sda(磁盘),tty(终端),设备文件大小通常显示为0字节,实际不存储数据
/etc 配置文件保存位置
/home 普通用户的主目录(也称为家目录),家目录名称可以与用户名不同
/mnt 挂载目录,系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区
/run 挂载目录,作为临时文件系统(tmpfs)的挂载点
/media 挂载目录,一般是光盘文件挂载点
/opt 第三方安装的软件保存位置,/usr/local/ 目录也可以用来安装软件
/proc 存放系统进程相关文件
/srv 存放特定服务所需的资源文件,如ftp,http
/sys 存放与系统硬件和内核相关的资源文件
/tmp 存放系统临时文件
/usr Linux软件的安装目录,包含系统核心应用程序和共享资源
/var 存放log文件目录
/lib 存放32bit函数文件,是软链接 /lib -> /usr/lib
/lib64 存放64bit函数文件,是软链接 /lib64 -> /usr/lib64
/root root用户的家目录

Linux文件操作指令

su - 切换用户指令

  • 指令格式su [选项] [-] [<用户> [<参数>...]]
  • 指令权限
    • 普通用户切换到任何用户都需要输入密码
    • root用户切换到任何用户都不需要输入密码
  • 注意
    • 加”-“切换:完全切换用户环境,继承目标用户的所有环境变量
    • 无”-“切换:仅进行shell层面的切换,不改变当前环境变量
    • 故运行su指令时强烈建议加”-“
    • 使用su命令相当于创建了一个子进程,可以使用exit退出
  • shell嵌套机制
    • 每次su命令都会创建一个新的shell,原始shell仍然保留在内存中
    • 使用exit命令可逐层退出嵌套的shell,每个未退出的shell都会占用少量内存
  • 实例
    1
    2
    3
    4
    5
    6
    7
    8
    # 切换用户变量
    su - root # 同时切换用户的环境变量
    su root # 只切换shell,不切换环境变量

    # 相当于创建子进程
    su - root
    pstree | grep bash
    |-ghostty-+-zsh---bash---su---bash-+-grep

cd - 切换路径

  • 指令格式cd [path]
  • 特殊方式
    • cd <相对路径/绝对路径>:切换路径
    • cd .:切换至当前目录
    • cd ..:切换至上级目录
    • cd ~cd:切换到当前用户的家目录
    • cd -:切换到上次使用的目录(反复使用,会在两个目录下切换)
    • cd ../..:实现多级跳转
    • cd "File Path":文件夹路径包含空格,使用string类型

ls - 列出文件属性

  • 指令格式ls [path] [option]
  • 特殊方式
    • ls:会列出当前文件夹下的文件信息
    • ls <path> <path>:支持列出多个目录下的文件信息
    • ls <relative path>:支持相对路径
  • 常用参数
    • -a:显示以 . 开头隐藏的项目
    • -l:显示文件的详细信息
    • -d:显示目录本身属性,而不是目录下的内容
  • 文件详细信息
    1. 文件类型与权限
      • 第一列:表示文件类别,-表示普通文件,d表示目录文件,b表示块设备,c表示字符设备,l表示软连接
      • 后九列:分 3 组(每组 3 个),分别表示文件所有者、所属组、其他用户的权限,其中r 读、w 写、x 执行,- 表示无对应权限
    2. 连接数:此处表示硬链接数
    3. 所有者:文件或目录所属用户
    4. 所属组:文件或目录所属组
    5. 文件大小:文件大小,单位为字节(Byte),可以使用-h更方便查看文件大小,目录通常显示4096
    6. 最后修改时间:文件内容最后一次修改时间
    7. 文件名:文件或目录名称(符号连接带->,并指向目标路径)

cat - 查看文件内容

  • 指令功能:命令用于连接文件并打印到标准输出设备上,它的主要作用是用于查看和连接文件
  • 指令格式cat [path]
  • 常用参数
    • cat [path] [path]:支持查看多个文件内容
    • cat:进入到交互环境,CTL+C退出,通常用于创建短文本(cat > file.txt)
    • -n:显示行号
  • 衍生指令
    1. head:显示文件前10行内容,head -n <num> <path>或者head -<num> <path>参数显示前num行内容
    2. tail:显示文件后10行内容,tail -n <num> <path>或者tail -<num> <path>参数显示后num行内容,tail -f <path>实时追踪文件结尾内容变化
    3. more:分页显示当前文件内容,Enter查看下一行内容,Space查看下一页内容,Q退出查看,无法向上查看
    4. less:分页查看当前文件内容,上下键向前向后查看,Q退出查看

touch - 创建文件

  • 指令格式touch <path>
  • 注意事项
    • touch <path> <path>:支持创建多个文件
    • touch:指令创建的文件为文本文件(后缀名为空)
    • 如果文件已经存在,则会直接更新该文件的时间戳

file - 查看文件类型

  • 指令格式file <path>
  • 注意事项
    • 图片文件.png后缀名改为.txt后要使用file指令查看文件类型
    • 后缀名并无实际意义,也不代表文件类型,仅用于方便查看

mkdir - 创建目录文件

  • 指令格式mkdir <path>
  • 常用参数
    • mkdir -p <path>:需要时创建目标目录的父目录,但即使这些目录已存在也不视为错误

rmdir - 删除目录文件

  • 指令格式rmdir <path>
  • 常用参数
    • rmdir:只能删除空目录

rm - 删除文件

  • 指令格式rm <path>
  • 常用参数
    • rm -i <path>:删除文件时询问
    • rm -f <path>:强制删除,忽略不存在的文件和参数,且从不询问
    • rm -r <path>:递归删除,可删除目录文件及其内容
  • 注意事项
    • rm <path> <path>:允许删除多个文件

alias - 指令别名

  • 查看别名alias
  • 添加别名alias <command>='<string>',例如alias rm='rm -i'
  • 注意事项
    • 直接在命令行上使用alias rm='rm -i',创建的命令是临时的,当前SHELL关闭之后就没有了
    • 如果想要永久的创建alias指令,需要修改环境变量配置文件.bashrc

cp - 文件拷贝

  • 指令格式cp <源文件> [多个源文件路径] <目标路径>
  • 常用参数
    • cp -r <源目录> <目标路径>:拷贝目录文件
    • cp -a <源文件> <目标路径>:拷贝时保留文件属性(权限,所有者,所属组),必须是root用户,普通用户时无效
    • cp -i <源目录> <目标路径>:拷贝文件时,咨询是否覆盖
  • 注意事项
    • 最后的<目标路径>是存在的目录文件,就将cp指定的文件拷贝到目标路径
    • 最后的<目标路径>是不存在的目录文件,就将cp指定的文件拷贝到上级目录,并改名为目标文件名

mv - 移动文件

  • 指令格式mv <源文件> <目标路径>
  • 注意事项
    • 最后的<目标路径>是存在的目录文件,就将mv指定的文件移动到目标路径
    • 最后的<目标路径>是不存在的目录文件,就将mv指定的文件移动到上级目录,并改名为目标文件名
    • mv指令可以实现改名操作,即mv <旧名称> <新名称>

通配符

通配符 说明
* 匹配零个、一个或多个任意字符
表示一个非空的任意字符
\ 转译字符,让特殊字符失去原有的功能
‘ ‘ 单引号中的特殊字符将失去功能
[ ] 中括号表示匹配中括号包含的其中的一个字符
[^ ]或[! ] 在方括号内使用 ^! 用于排除匹配的字符集
{} 用于生成字符串序列
  • 注意事项
    • 创建名为a?的文件时,若该目录下存在可以匹配a?(形如aa)的文件时则会将文件的时间戳更新,此时若要创建名为a?的文件,需要使用touch 'a?'或者touch a\?
    • 创建名为a?的文件时,若该目录下不存在可以匹配a?的文件时则会创建名为'a?'的文件
  • 常见用法
    • ls *.txt列出以txt为结尾的所有文件
    • [a-z]匹配任何小写字母,[a-Z]表示匹配所有字母,[0-9]匹配任何数字,{a..z}输出小写字母字符串

Linux快捷键(shell)

快捷键 功能
ctl + a 将光标移动到指令最左边
ctl + e 将光标移动到指令最右边
ctl + l 清空屏幕
ctl + w 删除从光标位置到一个单词的左侧
ctl + u 删除从光标位置到最左侧
ctl + y 还原删除的指令
显示上次输入的命令
显示下次输入的命令
!<字符串> 调出最近以字符串开头的指令

Linux编辑文件

vim编辑文件

  • 指令格式vim <file>
  • vim工作模式:指令模式, 编辑模式(插入模式), 末行模式, 可视化模式

指令模式:

指令 功能
h或者←(小键盘) 实现光标向左移动
l或者→(小键盘) 实现光标向右移动
j或者↓(小键盘) 实现光标向下移动
k或者↑(小键盘) 实现光标向上移动
gg指令 将光标移动到文件初始位置
shift+g或者G指令 将光标移动的文件末尾位置
nG指令 将光标移动第n行,其中n是表示数字
x指令 删除光标所在位置的字符
X指令 删除光标之前的字符
u指令 撤回之前的操作(windows编辑软件撤回次数取决于缓冲区设置, vim指令模式可以撤回到文件最开始的内容, 即无限回撤, vim缓冲区与windows设置不相同)
dd指令 删除光标所在行,等同于1dd
ndd指令 删除光标所在下n行(包含光标所在行)
yy指令 复制光标所在行,等同于1yy
nyy指令 复制光标所在下n行(包含光标所在行)
p指令 会将上次nddnyy指令指定的行,添加到光标所在行的下面
P指令 会将上次nddnyy指令指定的行,添加到光标所在行的上面

编辑模式:

  • 进入编辑模式指令
命令模式进入编辑模式指令 特殊功能
i指令 在光标所在位置的左侧开始插入文本
I指令 移动光标到所在行的行首位置,并向光标左侧插入文本
a指令 在光标所在位置的右侧开始插入文本
A指令 会移动光标到所在行的行尾位置,并向光标右侧插入文本
o指令 在光标所在行的下面另起一行开始插入文本
O指令 在光标所在行的上面另起一行开始插入文本
n指令 在指令模式下,切换到下一个找到的字符串,配合末行查找指令/使用
N指令 在指令模式下,切换到上一个找到的字符串,配合末行查找指令/使用

末行模式

  • 在命令模式输入:或者/进入末行模式
  • 末行模式主要功能:
    1. 查找指定字符串
    2. 替换文本内容
    3. 保存文件内容
    4. 退出编辑器
末行指令 功能
/<字符串>指令 查找指定字符串,按下Enter键,匹配到的字符串会高亮显示,未匹配到字符串会报错
:w指令 保存修改的内容,即使保存了文件依然可以通过u指令进行撤回
:q指令 退出vim编辑器
:wq或者:x 保存并退出vim编辑器
!指令 在其他指令后面加!表示强制执行
:set number 显示行号,简写:set nu
:set nonumber 不显示行号,简写:set nonu
:n1,n2s/old/new/global n1行到n2行(包含n1n2行)的old内容替换为new内容,global可以简写为g
$末行字符 表示最后一行,例如:1,$s/old/new/g将全文的old替换为new
\转义字符 若替换的文本中出现特殊字符需要使用转义字符\
global或者g 表示替换全部文本,不加g或者global只会在每行找到的第一个内容做替换,若替换指令结尾加nn表示数字,表示替换每行前n个内容

可视化模式

  • 可以实现光标选择
指令 功能
v指令 进入可视化界面,逐个选择
V指令 进入可视化界面,整行选择
ctrl+v指令 进入可视化界面,矩形框选

vim异常处理

  1. 多用户访问同一个文件,例config文件
    • 用户A使用vim打开文件
    • 用户B再使用vim打开文件时会报错,报错情况如下
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      E325: 注意
      发现交换文件 "~/.cache/vim/swap/%home%LinHao%config.swp"
      所有者: LinHao 日期: 2025-12-12 21:27:37
      文件名: ~LinHao/config
      修改过: 否
      用户名: LinHao 主机名: ArchLinux
      进程 ID: 14454 (还!在!运!行!)
      正在打开文件 "config"
      日期: 2025-12-12 20:57:17

      (1) 另一个程序可能也在编辑同一个文件。
      如果是这样,修改时请注意避免同一个文件产生两个不同的版本。
      退出,或者小心地继续。
      (2) 上次编辑此文件时崩溃。
      如果是这样,请用 ":recover" 或 "vim -r config"
      恢复修改的内容 (请见 ":help recovery")。
      如果你已经进行了恢复,请删除交换文件 "/home/LinHao/.cache/vim/swap/%home%Li
      nHao%.config.swp"
      以避免再看到此消息。

      交换文件 "~/.cache/vim/swap/%home%LinHao%.config.swp" 已存在!
      以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 退出((Q)), 中止((A)):
  • 原因:vim编辑文件是会创建一名为.<file>.swp的交换文件(这也是vim可以无限撤回的原因),再次编辑会出现冲突(此时可能是上个用户正在编辑,或者vim不正常退出)

注意事项:

  • vim指令编辑文件时,首先进入的是编辑模式
  • 在命令模式下,按i, I, o, O, a或者A进入编辑模式,在任何模式下按ESC键都会返回指令模式
  • 在末行模式要退出vim编辑器,如果修改的内容没有保存是不能正常退出vim编辑器,强制退出会导致编辑内容丢失
  • 使用vimtutor指令查看vim指令
  • 上述指令在vi编辑器上同样适用

输出重定向

  • 指令格式:command >> file将指令正确的结果以追加的形式输出到file文件中,如果没有file文件则会被创建
  • 指令格式:command > file将指令正确的结果以覆盖的形式输出到file文件中,如果没有file文件则会被创建
  • 指令格式:command 2>> file将指令错误的结果以追加的形式输出到file文件中,如果没有file文件则会被创建
  • 指令格式:command 2>> file将指令错误的结果以覆盖的形式输出到file文件中,如果没有file文件则会被创建
  • 指令格式:command &>> file将指令正确和错误的结果以追加的形式输出到file文件中,如果没有file文件则会被创建
  • 指令格式:command &> file将指令正确和错误的结果以覆盖的形式输出到file文件中,如果没有file文件则会被创建
  • 注意:
    • 输出指令默认输出到屏幕上,效果等同于command >> /dev/stdout或者command >> /dev/stderr
    • 输出指令:&>> /dev/null会将输出结果输入到黑洞中(直接丢弃)

输入重定向

  • 指令格式:command < file,将文件中的内容输入给指令command,部分指令不支持输入重定向
  • 示例:将order文件内容作为输入,可以不用再输入y确认
    1
    2
    3
    4
    5
    [LinHao@ArchLinux ~]$ cp /etc/hosts .
    [LinHao@ArchLinux ~]$ echo y > order
    [LinHao@ArchLinux ~]$ cp -i /etc/hosts . < order
    cp: 是否覆盖 './hosts'
    [LinHao@ArchLinux ~]$
  • 指令格式:command << file,将文件中的内容输入给指令command,并且用户可以追加新的内容,再次输入file终止追加
  • 常见使用:
    1
    2
    3
    4
    5
    [LinHao@ArchLinux ~]$ cat > order << END
    > Today is a good day
    > END
    [LinHao@ArchLinux ~]$ cat order
    Today is a good day
    可以将交互式的指令转化为非交互式命令

Linux管道

  • 指令格式:输出命令 | 输入命令,其中|表示Linux管道的命令,管道左侧的命令会产生输出结果,经过管道就会变成右侧指令的输入
  • 常见指令格式:输出指令 | xargs 特殊指令,其中xargs表示将管道输入作为右侧指令的参数而不是标准输入
  • 常见指令格式:
    • 输出指令 | grep 内容grep指令原本格式是grep content file表示将file文件中含有内容content抓取出来,并显示content所在行,-i表示不区分大小写,-v参数进行反向抓取(显示除content的行),-n参数会显示行号,-A n参数表示after会显示查找内容后n行的内容,-B n参数before会显示查找内容前n行的内容, -n参数会显示行号
    • 输出指令 | xargs grep 内容,将左侧指令的输出作为grep的输入抓取特定内容,例如:查找目录下python文件中的import字段,可以使用ls *.py | xargs grep import
可以作为右侧指令(接受输入命令) 此时功能
cat 重复左侧指令输出
head 重复左侧指令输出
tail 重复左侧指令输出
  • cat, head, tail指令本身是显示文件内容,tail, head在后面不跟文件时功能与cat指令相似

正则表达式

正则表达式 说明
^a 行首锚点,表示以a开头的内容
b$ 行尾锚点,表示以b结尾的内容,注意区别$b这是代表b变量
. 表示任意一个非空字符
* 数量修饰符,不能单独存在,必须跟在某个字符 / 表达式后,表示匹配前面的字符 0 次、1 次或多次
.* 表示匹配任意非空字符串(匹配1~n个任意非空字符)
? 表示可以重复前边的字符1次或0次,必须跟在某个字符 / 表达式后
  • 注意:
    1. grep b$ file是显示以b结尾的行,而grep $b file是在文件中找包含b变量的内容
    2. grep ^ac$ file表示抓取只包含ac的行,grep ^$ file -v表示反向抓取空白行,grep ^a file | grep c$表示抓取以a开头,以c结尾的内容,简化写法grep '^a.*c$' file
    3. grep -E a? file中,必须加上参数-E来指定是正则表达式

[!note] 正则表达式和通配符区别
正则表达式是用来匹配文件内容的,而通配符是来匹配文件名的

参考资料

  1. 通配符参考资料:通配符详细资料
  2. vim指令参考:vim指令参考