51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Linux 命令行基础

Shell 介绍 {#shell-介绍}

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到Shell的回应),或非交互(脚本)的方式。换句话说,Shell是一个命令行解释器,它为用户提供一个像 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至是编写一些程序。

1-shell是什么-1

  • 用于运行系统指令的程序
  • shell 中运行的多条系统指令可形成 shell 脚本
  • Bourne Shell(贝尔实验室发明)是最早的 shell
  • Bourne-again:Bash(Ubuntu 默认采用)是在 Bourne Shell 基础上增强功能
  • 通常成为终端

命令提示符 {#命令提示符}

name@host:path$
name@host:path#

其中

  • name:登录用户名
  • @:普通连接符
  • host:主机名
  • path:当前工作路径(~代表当前用户主目录)

如果是普通用户以$结尾,反之若是 root 用户以#结尾。

输入输出 {#输入输出}

  • 进程通过输入输出流读写数据
  • 默认标准输入输出称为stdin / stdout。输入和输出方式都可以为:文件、设备、终端、另一个进程的 I/O
  • 标准错误输出流 stderr。它是运行出错时的提示。
  • Ctrl-D结束当前输入
  • Ctrl-C无论当前情况如何,强制结束运行

1-输入输出-1

基本命令 {#基本命令}

cat {#cat}

cat用来查看文件内容。

查看单个文件:

2-cat-1

查看多个文件(合并显示):

2-cat-2

ls {#ls}

ls用来列出当前目录内容。

参数:

  • -l : 显示详细内容(权限、inode、属主、属组、大小、修改时间 mtime)。
  • -a : 包括隐藏的所有内容。
  • -d : 只显示目录自身信息。
  • -i : 显示 inode 信息。
  • -S : 按文件大小排序(默认按字母的顺序排序)。
  • -r : 倒序排列。
  • -t : 按修改时间排序。
  • -h : 文件大小以人类便于阅读的方式显示。
  • --sort=key : 排序。
    • size : 按大小。
    • time : 按时间。
    • extension : 按扩展名。

其中:llls -la简写形式。

2-ls-1

2-ls-2

cp {#cp}

cp用来拷贝。

参数:

  • -R / r : 拷贝目录及其中全部内容。拷贝文件夹时需要用此参数。
  • -l : 硬链接拷贝(复制 inode,inode 相同)。即使源文件被删除也可以正常访问。
  • -s : 软链接拷贝(类似 windows 的快捷方式)。如果源文件被删除则无法再访问。
  • -S : 目标名称添加后缀。
  • -u : 源比目标新时才拷贝。
# 拷贝 file1 到当前路径下并重命名为 file2。
cp file1 file2

# 拷贝 file1 到当前路径的 dir 目录下。
cp file dir/

# 拷贝 file1 和 file2 到当前路径的 dir 目录下。
cp file1 file2 dir/

# 拷贝 file1 到当前路径的 dir 目录下,并重命名为 file2。
cp file1 dir/file2

# 拷贝 dir1 目录到当前路径下,并重命名为 dir2。
cp -r dir1 dir2

# 硬链接复制 file1 为 file2。
cp -l file1 file2

# 软链接复制 file1 为 file2(快捷方式)。
cp -s file1 file2

# 复制 file1 为 file2 且加后缀_suffix-name。最终得到的文件名为 file2_suffix-name。
cp -S _suffix-name file1 file2

2-cp-2

mv {#mv}

mv用来移动。

参数:

  • -f : 强制移动、覆盖目标。

2-mv-1

touch {#touch}

touch用来创建空文件。

若文件存在,修改文件 mtime,但不修改内容。

# 创建 test.txt 文件。
touch test.txt

rm {#rm}

rm用来删除。

参数:

  • -i : 每次删除前提醒。
  • -d : 删除空目录。
# 删除单个文件。
rm filename

# 递归删除,删除目录和目录下的所有文件和目录。
rm -rf dir

echo {#echo}

echo用来将命令的参数显示在 stdout(标准输出)。

参数:

  • -n : 显示完成后不换行。

  • -e : 解析\转义符。

2-echo-1

cd {#cd}

cd用来切换目录。

# 后面什么不要加,回到当前用户主目录。
cd

# 切换到指定目录下。
cd dirname

pwd {#pwd}

pwd用来显示当前工作完整路径。

适和用于提示符不显示完整路径的情形。

参数:

  • -P : 物理路径(显示软链接对应的真实路径)。
  • -L : 逻辑路径(显示软链接自身路径)。

mkdir {#mkdir}

mkdir用来创建目录。

参数:

  • -p : 一次性创建多层目录。
# 在当前路径下创建 dirname 目录
mkdir dirname

rmdir {#rmdir}

rmdir用来删除空目录。

参数:

  • -p : 删除多层空目录。

通配符 {#通配符}

  • * : 表示任意多个字符。
  • ? : 表示任意一个字符。

2-通配符-1

grep {#grep}

grep用来查找符合条件的字符串或正则表达式。

参数:

  • -i : 忽略大小写。
  • -v : 反向匹配。
  • -n : 显示行号。
  • -r : 递归目录及子目录中的所有文件。
  • -c : 显示目标文件中包含关键字的行数。
# 查看 passwd 文件中所有包含 root 的行。
grep root /etc/passwd

# 查看 passwd 文件中所有包含 r 的行。
grep r* /etc/passwd

# 显示 etc 下所有文件中包含 root 的行。
grep root /etc/*

# 多个规则同时匹配,1.txt 为包含一个或多个规则的文件。
grep -f 1.txt a.txt

# 在 a.txt 中同时搜索 a1 和 a2 和 a3。
- grep a[123] a.txt

# 在 a.txt 中搜索 1 或 2 或 3。
- grep -E '1|2|3' a.txt    

less {#less}

less用来显示文本文件的内容。

more命令的增强版。

# 显示 words 文件中的内容。
less /usr/share/dict/words

快捷键:

  • z / b : 向下 / 上翻一页。
  • v : 进入编辑模式。
  • g / G : 直接跳至第一行 / 最后一行(或第n行)。
  • / word : 向前搜索关键词。
  • ?word : 向后搜索关键词。
  • n/N : 正向/反向继续搜索关键词(输入关键词后再使用)。
  • q : 退出。
# 通过管道命令和其他命令结合使用。
grep root /usr/share/dict/words | less

nano {#nano}

nano超简单的文本编辑器。

快捷键:

  • Ctrl + G : 取得在线帮助(help)。
  • Ctrl + X : 离开nano软件,若有修改过文件会提示是否需要保存。
  • Ctrl + O : 保存文件,如果有权限的话就能够保存文件。
  • Ctrl + R : 从其他文件读入数据,可以将某个文件的内容贴在本文件上。
  • Ctrl + W : 查询字符串,这个也是很有帮助的命令。
  • Ctrl + C : 说明目前光标所在处的行数与列数的信息。
  • Ctrl + _ : 可以直接输入行号,让光标快速移动到该行。
  • Alt + Y : 校正语法功能开启或关闭(单击开,再单击关)。
  • Alt + M : 可以支持鼠标来移动光标的功能。

head / tail {#head--tail}

head/tail --- 显示文件头部 / 尾部内容。

默认显示 10 行。

参数:

  • -n : n 替换为一个数字,用来指定显示多少行。
  • -f : 实时显示。tailf xxxtail -f xxx作用相同。
# 查看 passwd 文件的前三行。
head -3 /etc/passwd

# 实时查看 dmesg 文件的最后 10 行。
tail -f /var/log/dmesg

diff {#diff}

diff用来比较文本文件。

参数:

  • -u : 统一格式输出。

    • --- : 表示文件 1。
    • +++ : 表示文件 2。
  • -y : 并排输出比较。

    • | : 表示不同。
    • < : 文件 1 比文件 2 多。
    • > : 文件 2 比文件 1 多。
  • -W : 在使用 -y 参数时,指定每一行占多少个字符。

  • -w : 忽略空格。

  • -i : 忽略大小写。

# 比较 file1 和 file2 两个文件。
# 返回 a : 那一行 file2 比 file1 多;
# 返回 c : 那一行 file1 和 file2 内容不同;
# 返回 d : 那一行 file2 比 file1 少;
# 无返回结果表示两个文件内容相同。
diff file1 file2

# 比较 dir1 和 dir2 两个目录构,显示不同的文件名和目录。
# 如果两个目录下有同名文件,就会比对这两个文件的内容。
diff dir1 dir2

file {#file}

file用来检测文件格式。

顺序执行以下三种测试集。一种测试匹配成功即停止检测,全都不匹配返回 data。

  1. filesystem : 匹配系统头文件 <sys/stat.h>。
  2. magic : 匹配文件头部魔术值。使用 -l 参数查看所有魔法值。
  3. language : 匹配文件起始的字符类型,ASCII,UTF-8。

参数:

  • -f : 文件列表文件。
  • -b : 只显示摘要信息。
  • -ib : 显示 mime 类型。
  • -l : 查看所有魔法值。

find / locate {#find--locate}

find/locate用来查找文件。

locate 基于文件索引进行搜索

每隔一段时间,linux 系统就会自动扫描系统中的文件,然后存储到数据库中,locate就是在此数据库中查询数据。locate不验证文件是否存在,速度快但结果不一定准确。可使用updatedb手动更新索引。

ubuntu 新版本可能不默认安装此命令,使用:

# 安装
sudo apt update -y
sudo apt install mlocate -y

# 更新索引
sudo updatedb

find 从硬盘查找文件

参数:

  • -name : 后面接查找的名字。
  • -type : 按文件类型查找,以后可指定以下参数。
    • b : 块设备文件。
    • d : 目录。
    • c : 字符设备文件。
    • p : 管道文件。
    • l : 符号链接文件。
    • f : 普通文件。
  • -user : 根据所属用户查找,后面接用户名。
  • 按时间查找,n 是一个数字,可以使用加减号,如:n / -n,+n。
    • -amin n : 查找系统中最后 n 分钟访问的文件(从当前时间向前推 n 分钟,下同)。
    • -atime n : 查找系统中最后 n*24 小时访问的文件(从当前时间向前推 n*24 小时,下同)。
    • -cmin n : 查找系统中最后 n 分钟被改变文件状态的文件。
    • -ctime n : 查找系统中最后 n*24 小时被改变文件状态的文件。
    • -mmin n : 查找系统中最后 n 分钟被改变文件数据的文件。
    • -mtime n : 查找系统中最后 n*24 小时被改变文件数据的文件。
  • -cnewer : 后面接文件名,表示搜索比这个指定的文件要更新的文件。
# 从 / 开始查找名称为 test.txt 的文件
find / -name test.txt

# 从 / 开始查找那些修改时间在当前时间的前 20 天内,且在当前时间的前 1 天之前的所有文件。
find / -mtime +1 -mtime -20

2-find-1

stat {#stat}

stat用来显示文件/文件夹详细信息包括 MAC 时间。

  • Modify : 文件的修改时间。
  • Access : 最后访问时间。
  • Change : 文件属性修改时间。

sort {#sort}

sort用来排序。

参数:

  • -r : 反向排序。
  • -n : 按数值大小排序。
  • -M : 将前面 3 个字母依照月份的缩写进行排序。
# 对 a.txt 文件的内容进行排序。
sort a.txt

vi {#vi}

vi用来文本编辑。

Linux 所有对象都是文件,运行中的文件称为进程。

所有服务器配置都是通过编辑文本配置文件来完成。vi、nano、emacs(无优劣之分)。

vi的三种模式:

  • 一般命令模式(默认):
    • 从编辑模式按 ESC 或 Ctrl + [ 进入。
    • Ctrl + f : 向文件尾翻一屏。
    • Ctrl + b : 向文件首翻一屏。
    • ZZ : 保存当前修改并退出。
    • D : 删除光标到行尾内容。
    • dd : 删除光标所在行全部内容。
    • ndd : 从光标所在行向后删除n行(包括当前行)。
    • yy : 复制光标所在行全部内容。
    • nyy : 从光标所在行向下复制n行内容。
    • p : 粘贴。
    • /关键字 : 向前搜索关键字,按 n 跳入下一个符合的位置。
    • ?关键字 : 向后搜索关键字,按 n 跳入下一个符合的位置。
  • 命令模式:
    • 从一般命令模式按 :(英文冒号)进入。按 ESC 回到一般命令模式。
    • :a, bs/A/B : 从 a 行到 b 行搜索字符 A 并替换成 B。例如::1,$s/word1/word2/gc表示全文范围内替换,其中 $ 代表尾行,g 代表全局范围,c 代表替换前确认一下。
    • :5 : 光标跳至第5行首。
    • :$ : 光标跳至末尾行首。
    • :w : 保存退出。
    • :q! : 不保存退出。
    • :e b.txt : 编译b.txt(可以自动补齐,多文件编辑模式)。
    • :n : 编辑下一个文件。
    • :f : 显示当前编辑的文件名和编辑信息。
    • :set number : 显示行号。
    • :set nonumber : 不显示行号 。
  • 编辑模式:
    • 从一般命令模式按 i、a、o 进入。
    • a : 在当前光标后添加文本。
    • A : 在行末添加文本。
    • i : 在当前光标前插入文本。
    • I : 在行首插入文本。
    • o : 在光标当前行的下一行插入一空行。
    • O : 在光标当前行的上一行插入一空行。

man / info {#man--info}

man/info用来查看帮助文档。

Linux 系统有完善的文档体系,Manual 是最主要的帮助。

GUN 项目不太喜欢man,因此开发了info。有时候优于man,有时不是。

# 查看 ls 命令使用手册。
man ls
info ls

# 搜索关键词(不知道具体命令)。
man -k keyword 

# 查看指定的章节号。
man 5 passwd

其中man 手册章节号含义如下:

  • 1 : 用户命令
  • 2 : 系统调用
  • 3 : 高级Unix编程库文档(程序员常用)
  • 4 : 设备接口和驱动信息(很少使用)
  • 5 : 文件描述(系统配置文件)
  • 6 : Games
  • 7 : 文件格式,惯例,编码(ASCII等)
  • 8 : 系统命令和服务器

其它一些地方的帮助文档

  • /usr/share/doc : 其他 一些帮助文档
  • command -h / --help : 显示命令自身提供的帮助信息

awk {#awk}

awk用来格式化文本信息。

# 显示一行内的第二列内容,默认以空格分割。
awk '{print $2}'

# 显示一行内的第二列内容,并指定 :为分割符。 
awk -F: '{print $2}'

sudo {#sudo}

sudo用来临时切换成 root 账户执行命令。

sudoer 出于安全的考虑 sudo。

# 编辑sudo配置文件(/etc/sudoers)。
visudo

进程管理 {#进程管理}

进程就是运行中的程序文件

进程的一些基本信息:

  • PID : 进程ID
  • TTY : 运行进程的终端设备
  • STAT : 进程状态(S leep、Running)
  • TIME : 该进程占用的 CPU 时间
  • COMMAND : 命令名称

查看进程 {#查看进程}

ps命令,参数如下:

  • -x : 当前用户启动的所有进程。
  • -ax : 所有用户启动的进程。
  • -u : 进程详细信息。
  • -w : 显示进程文件完整路径。
# 查看追定进程。可以使用 $$ 表示当前 shell 进程的 pid。
ps u pid

# 查看进程下的线程。
ps - L pid

# 树型显示进程,包含 pid。
ps fjax

pstree命令,树型显示进程。

结束进程 {#结束进程}

kill命令,基本使用方法如下:

# 结束 pid 进程,默认是发送 TERM 指令。
kill pid

# 暂停进程。
kill -STOP pid

# 恢复已暂停的进程。
kill -CONT pid

# 暴力结束进程。
kill - KILL pid
kill -9 pid

# 显示所有 kill 命令的指令。
kill -l

打包压缩 {#打包压缩}

gzip {#gzip}

gzip是 Linux 标准压缩程序,GUN Zip。

gzip不能做多文件或目录的归档打包。

# 压缩,会删除原始文件。
gzip file

# 解压。
gunzip file

tar {#tar}

tar用来打包归档(Archive)。

参数:

  • c : 创建归档。
  • v : 详细诊断输出。
  • f : 此参数后面必须是归档文件名。
  • x : 解包。
  • t : 显示包里面的东西,不会解出来。
# 查看包内容。
tar tvf arch.tar

# 解包。
tar xvf file.tar

# 解包并保留原始权限。
tar xvf file.tar -p

# 降低磁盘和内核IO消耗(打包同时压缩)。
zcat file.tar.gz | tar xvf -

# z : 表示自动调用 gzip。另外 .tgz == .tar.gz。
tar ztvf file.tar.gz

# 解压压缩的文件。
gunzip file.tar.gz

另外:zcat == gunzip -dc

  • -d : 解压
  • -c : 解压结果输出到 stdout

bzip2 {#bzip2}

bzip2(bz2)另一个压缩程序。

比 gzip 压缩速度慢,文本压缩比高(发布源码时用)。

bunzip2解压。

# j : 表示自动调用 bzip2。
tar jcvf file.tar.bz2 file1 file2 ......

命令行快捷键 {#命令行快捷键}

  • Ctrl + b : 光标向左。
  • Ctrl + f : 光标向右。
  • Ctrl + p : 光标向上。
  • Ctrl + n : 光标向下。
  • Ctrl + a : 光标移至行首。
  • Ctrl + e : 光标移至行尾。
  • Ctrl + w : 删除光标前面以空格分割的段落(内容)。
  • Ctrl + u : 删除光标当前位置到行首。
  • Ctrl + k : 删除光标当前位置到行尾。
  • Ctrl + y : 粘贴删除的内容。

Shell 输入与输出 {#shell-输入与输出}

可分为标准输入、标准输出、标准错误输出。

输出重定向 {#输出重定向}

# 覆盖 a.txt 原来的内容。
command > a.txt

# 向 a.txt 追加内容。
command >> a.txt

可以使用set -C命令设置禁止覆盖文件,防止误操作。

标准输入重定向 {#标准输入重定向}

# 将 a.txt 中的内容传递给 command 命令。
command < a.txt

如:head < /proc/cpuinfo == head /proc/cpuinfo

管道 {#管道}

管道|将前一个命令的输出作为后一个命令的输入。

# 显示计算机 CPU 信息的前 10 行,并将其中的小写字母转换为大写字母。
head /proc/cpuinfo | tr a-z A-Z

# 从 ifconfig 命令的输出中提取计算机网络接口的 IPv4 地址。
ifconfig | grep inet | awk '{print $2}' | awk -F: '{print $2}'

标准错误 {#标准错误}

stderr表示标准错误(错包含重要信息)。

# 2 : 表是标准错误的标号。此命令表示将出错信息重定向到 e 文件,而不显示到屏幕。
ls /abcdefg 2 > e

# 标准输出到 f 文件,标准错误输出重定向到标准输出,所以最后标准输出和标准错误都会输出到 f 文件。
ls /asd > f 2>&1

常见报错信息 {#常见报错信息}

  • No such file or directory : 查看不存在的文件目录。
  • File exists : 创建与文件同名的目录。
  • Not a directory, Is a directory : 把文件当目录。
  • No space left on device : 磁盘空间不足。
  • Permission denied : 权限不足。
  • Operation not permitted : 杀掉不属于自己的进程。
  • Segmentation fault, Bus error : 程序访问禁用内存。

FHS {#fhs}

Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数 Linux 版本采用这种文件组织形式,类似于 Windows 操作系统中 c 盘的文件目录,FHS 采用树形结构组织文件。FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。

  • 相对路径 / 绝对路径。
  • . : 表示当前目录。
  • .. : 表示当前目录的上层目录。

| 目录 | 作用 | |:--------|:-----------------------------------------------------------------------------------------| | / | 根目录,一台电脑有且只有一个根目录,所有的文件都是从这里开始的。 | | /bin/ | 基础的,用户级别指令存放位置, 二进制可执行命令文件。 | | /boot/ | 存储操作系统启动、引导过程中的静态文件。 | | /dev/ | 这里主要存放与设备(包括外设)有关的文件, 系统就是从这个目录开始工作的。另外还有一些包括磁盘驱动、USB 驱动等都放在这个目录。 | | /etc/ | 主要存放系统配置方面的文件。 | | /home/ | 这里主要存放你的个人数据。具体每个用户的设置文件,用户的桌面文件夹,还有用户的数据都放在这里。每个用户都有自己的用户目录,位置为:/home/用户名。当然,root 用户除外。 | | /lib/ | 基本的,共享的库文件,以及内核模块。 | | /media/ | 挂载外部存储,一般挂载移动存储类型的设备,例如 u 盘,光驱等。 | | /mnt/ | 挂载外部存储,一般把临时的挂载,挂载到 mnt。 | | /opt/ | 安装除操作系统软件之外的其他软件的时候,默认的安装目录。 | | /sbin/ | 系统级别的可执行程序。 | | /srv/ | 存放服务的数据。 | | /tmp/ | 存放临时文件。 | | /usr/ | 放置用户级别的工具和软件,子目录还有bin、sbin等也是存放用户和系统级别的可执行程序(历史遗留问题)。 | | /var/ | 存放经常变动的系统文件,例如系统日志文件,用户邮件等。 | | /root/ | root 用户的主目录。 | | /proc/ | 系统启动过程中临时生成,关机后就没有了,是一个虚拟目录, 它是内存的映射,包括系统信息和进程信息。 |

3-目录和路径-1

赞(2)
未经允许不得转载:工具盒子 » Linux 命令行基础