0%

Linux 简单命令和基础知识

“Waiting is wasting for people like me.”——《Wind》

帮助命令

命令 作用
type 查看命令类型
help 内部命令帮助
man 外部命令帮助
whereis 命令位置
file 文件类型
ps -fe 进程列表
  • man 命令在部分 Linux 发行版中需要单独安装
  • man 命令可以查询种类繁多的手册,包括man asciiman utf-8
  • shell 命令的执行:
    • shell 是一个解释器和执行器,使用空白符切割指令。切割得到的第一个元素被识别为命令。这是为什么 [ 命令后面必须有空格的原因
    • shell 首先会判断是内部还是外部命令。如果是外部命令,则进入 $PATH 变量给定的目录中寻找
    • shell 会将使用过的命令缓存在内存 hash 中。使用hash -r命令可以清除这些缓存
  • 一些脚本代码第一行会以类似于#!/usr/bin/python的格式给出解释器位置,这样的脚本可以省去命令直接执行
    • 执行这样的脚本必须使用./file的格式,因为直接写file的话 shell 会将其当成一个命令前往 $PATH 中寻找
  • 外部命令都是程序,都有独立的进程

文件系统命令

命令 作用
ls 显示目录
df 磁盘使用情况
du 文件系统使用情况
cd 切换工作目录
pwd 当前工作目录
mkdir 创建目录
rm 删除
cp 拷贝
mv 移动
ln 链接
stat 查看元数据
touch 修改文件或目录的时间属性,也可创建文件
  • ls -l命令显示文件详细信息,包括:
    • 文件类型
      • -:普通文件(f)
      • d:目录文件
      • b:块设备文件(block)
      • c:字符设备文件(character)
      • l:符号链接文件(symbolic link file)
      • p:命令管道文件(pipe)
      • s:套接字文件(socket)
    • 文件权限:共 9 位,每 3 位一组,分别代表文件文件(U,G,O);每组三位,分别代表读、写和执行(rwx)
    • 文件硬链接次数
    • 文件属主(owner)
    • 文件属组(gourp)
    • 文件大小
    • 时间戳
      • 访问(access)
      • 修改(modify)
      • 元数据(change)
  • 文件系统层次化标准(Filesystem Hierarchy Standard)
    • /boot:系统启动相关的文件,如内核、initrd、grub(bootloader)等
    • /dev:设备文件(一切皆文件)
    • /etc:配置文件
    • /home:用户家目录
    • /root:管理员家目录
    • /lib:库文件
    • /media:挂载点目录,移动设备
    • /mnt:挂载点目录,额外的临时文件系统
    • /opt:可选目录,程序的自定义安装目录
    • /proc:伪文件系统,内核映射文件
    • /sys:伪文件系统,于硬件设备相关的属性映射文件
    • /tmp:临时文件,/var/tmp
    • /var:可变化的文件
    • /bin:可执行文件
    • /sbin:管理命令
  • Linux 的目录结构可以规避磁盘挂载带来的移植性问题,即不管目录挂载在哪一块磁盘,目录结构都是一样的
  • Linux 开机引导顺序:
    • 激活主板 bios 芯片,bios 程序进入内存,决定引导位置(光驱、硬盘等)
      • bios 包含 CPU 相关信息、设备启动顺序、硬盘、内存、时钟、PnP 特性等重要信息
    • 读取 MBR(Master Boot Record)
    • bootloader 读取分区格式,使用不同解码器
    • 分区内包含各自 kernel;bootloader 将 kernel 加载到内存。向 CPU 发送 reset 指令,覆盖内存内容,重新分配地址空间
    • kernel 挂载磁盘分区,找到 sbin 目录下的 init 程序;根据 init 程序启动其它程序(login 程序以及登陆成功后的 shell 等)

关于开机引导上面的只是粗略的一个过程,详细可以参考linux开机过程

  • 内存被分为内核地址空间和其它地址空间。内核地址空间是专为内核开辟的,受保护的地址空间
  • 9999 个 a 和一个汉子在 utf-8 编码下占用多少字节?答案是 10002 个。utf-8 字符是变长的,除了节省空间,更能节省 IO
  • cd命令回到家目录,cd -命令回到上之前打开的目录
  • mkdir -p递归创建;mkdir /path/to/{x,y,z}水平创建
  • 尽量用 mv 代替 rm
  • 硬链接类似于指针,删除一个硬连接文件还在且不影响其它指向这个文件的硬连接;软链接类似于快捷方式,源文件删除,软链接会失效
  • touch 可以改变文件元数据,配合其它命令和脚本可以实现异地备份、异常中断等功能

文件操作命令

命令 作用
cat 全文查看文件内容
more 分屏查看文件内容,到文件底部自动结束
less 分屏查看文件内容,到文件底部不自动结束
head 查看文件开头
tail 查看文件结尾
| 管道命令
xargs 参数命令
  • more 和 less 的区别可以理解成,后者翻到最后之后还可以往回翻,而前者看到最后就退出程序
  • head 和 tail 使用管道连接在一起可以查看文件特定区间的内容,例如head -5 | tail -1查看第 5 行
  • xargs 从标准输入读取内容,并将其作为后面命令(参数)的参数执行
  • 管道会在两边分别新建一个子进程,因此要格外注意新建子进程与七步扩展的优先级顺序

关于 vim 的内容在其它文章中

数据处理

命令 作用
grep 显示匹配行
cut 垂直切割数据
sort 排序
wc word count
sed 行编辑器,类似于 vim 的末行模式
awk 文本分析工具
  • grep -v反选,grep -e使用扩展正则表达式
  • 正则表达式(加粗为基本表达式,不加粗为扩展表达式):
    • 匹配操作符
      • \:转义字符
      • .:匹配任意单个字符
      • [123a]:字符序列单字符占位
      • ^:行首
      • $:行尾
      • \<\>:单词首尾边界
      • |:连接操作符
      • (,):选择操作符
      • \n:反向引用
    • 重复操作符
      • ?:匹配 0 次 到 1 次
      • *:匹配 0 次到多次
      • +:匹配 1 次到多次
      • {n}:匹配 n 次
      • {n,}:匹配 n 次到多次
      • {n,m}:匹配 n 到 m 次
  • grep 中使用正则表达式要用双引号包裹作为引用

关于 cut、sort、wc、sed、awk 命令的详细使用在另一篇文章中

权限管理

命令 作用
groupadd 添加组
groupdel 删除组
useradd 添加用户
userdel 删除用户
usermod 修改用户
id 查看用户元数据
passwd 修改密码
sudo 以管理员身份运行
su 切换用户
chmod 修改文件权限
chown 修改用户属组或属主
  • rwx 权限可以表示为三位二进制数,Linux 支持直接用十进制数表示权限。例如 7 表示拥有全部的三种权限

Shell 脚本编程

  • shell 本质是一个解释器和启动器,能够解释用户交互输入和文本文件输入。脚本的本质是指明解释器和启动器的代码文件。
  • 使用source file会在当前 shell 运行脚本;使用/bin/bash file会新建一个进程打开 shell 运行脚本
  • 对于指定了解释器的脚本应该使用./file的格式,因为直接写file的话 shell 会将其当成一个命令前往 $PATH 中寻找

文本流和重定向

  • 重定向不是命令
  • 任何程序都带有默认 IO
    • 0:标准输入
    • 1:标准输出
    • 2:错误输出
  • IO 流指向虚拟终端,cd /proc/$$/fd可以查看(/dev/pts/0,1,2);通过修改指向的虚拟终端可以做到一个 bash 输入,另一个 bash 输出
  • 输出重定向:修改程序的 1 或 2(左边与文件描述符之间不能有空格)
    • >:覆盖重定向
    • >>:追加重定向
    • &>,&>:同时重定向 1 和 2(两个符号中间不能有空格)
  • 输入重定向:修改程序的 0
    • <:文件
    • <<:输入多行(首先输入一个自定义的字符串作为识别标记,按下回车后开始输入多行。输入完成后再次输入前面的识别标记)
      • 一个简单的例子:在脚本中要用一个 echo 打印多行文本,需要使用一个外部文件,安全性较低;使用多个 echo 不方便调整格式;cat 加多行重定向可以解决这些问题,同时容易调整格式
    • <<<:字符串(双引号)
  • read 命令对换行符敏感,可以读取标准输入
  • exec 命令在现有进程上运行一个可执行文件,替换原有的可执行文件同时不改变进程号
    • exec 可以用来外挂重定向
  • 全重定向的 socket 案例(获取百度主页)
1
2
3
exec 8<> /dev/tcp/www.baidu.com/80
echo -e "GET / HTTP/1.0\n" >& 8
cat <& 8

Shell 脚本

这一部分涉及变量、参数、数组、运算符、流程控制等丰富内容,将会在另一篇文章中进行总结