Appearance
Linux 常用命令
基础命令
文件、目录
基础命令:
pwd查看用户的当前目录cd切换目录.表示当前目录..表示当前目录的上一级目录(父目录)-表示用cd命令切换目录前所在的目录~表示用户主目录的绝对路径名
ls:显示文件或目录信息;mkdir:当前目录下创建一个空目录;rmdir:要求目录为空;touch:生成一个空文件或更改文件的时间;cp:复制文件或目录;mv:移动文件或目录、文件或目录改名;rm:删除文件或目录;ln:建立链接文件;find:查找文件;file/stat:查看文件类型或文件属性信息;cat:查看文本文件内容;more:可以分页看;less:不仅可以分页,还可以方便地搜索,回翻等操作;tail -10:查看文件的尾部的 10 行;head -20:查看文件的头部 20 行;echo:把内容重定向到指定的文件中,有则打开,无则创建;
管道命令 |:将前面的结果给后面的命令,例如:ls -la | wc,将 ls 的结果传给 wc 命令来统计字数。
重定向 > 是覆盖模式,>> 是追加模式,例如:echo "Java3y,zhen de hen xihuan ni" > qingshu.txt 把左边的输出覆盖到右边的文件里去。
grep
grep 用于在文件中搜索指定的模式(正则表达式),然后输出包含该模式的行。基础语法:
ABNF
"grep" [options] pattern [file]Tip:省略
file时表示在标准输入中查找。
| 示例 | 命令 | 说明 |
|---|---|---|
| 递归搜索 | grep -r pattern directory | 递归地在指定目录及其子目录中搜索匹配 pattern 的行 |
| 忽略大小写 | grep -i pattern file | 默认为大小写敏感匹配 |
| 显示行号 | grep -n pattern file | 显示匹配行的行号 |
| 反向匹配 | grep -v pattern file | 显示不匹配模式的行 |
| 扩展正则表达式 | grep -E "pattern" file | 使用扩展正则表达式(ERE)进行匹配 |
| 兼容正则表达式 | grep -P "pattern" file | 使用兼容正则表达式(PCRE)进行匹配 |
| 统计匹配行数 | grep -c pattern file | 只显示匹配的行数,而不是具体的匹配行 |
| 显示匹配部分 | grep -o pattern file | 只显示匹配的部分,而不是整行 |
grep 默认使用基本正则表达式(BRE),在 BRE 中 ?、+、{、|、( 和 ) 是普通字符。
要使其具备特殊含义,有两种方法:
- 使用转义形式,例如
\|来表示或操作; - 使用
grep -E扩展正则表达式(ERE),而无需进行转义。
sed
sed(Stream Editor,流编辑器)是一种非交互式的行编辑器,主要用于对文本流(文件或管道输入)进行自动化的查找、替换、删除、插入等操作。sed 以行为单位处理文本,默认不会修改原文件,而是将处理结果输出到标准输出(屏幕),适合脚本自动化和管道结合使用。
ABNF
sed = "sed" [options] "'" script "'" file
script = [address] command [parameters]address:指定作用的行范围(如数字、正则、$表示最后一行);command:如s(替换)、d(删除)、p(打印)、i(插入)、a(追加)。
常见选项:
| 选项 | 说明 |
|---|---|
-n | 安静模式,抑制默认输出(只输出明确指定的行,常与 p 命令配合) |
-i | 就地编辑,直接修改原文件 |
-e | 允许多个脚本命令 |
-f | 从脚本文件读取命令 |
'-E', -r | 使用扩展正则表达式(ERE) |
假设有一个测试文件 test.txt 内容如下:
Text
hello world
linux is great
sed is powerful
hello linux替换(
s命令)替换每行第 1 次出现
Bashsed 's/hello/hi/' test.txt输出:
Texthi world linux is great sed is powerful hi linux替换每行第 n 次出现(如第 2 次)
Bashsed 's/hello/hi/2' test.txt全局替换(加
g)Bashsed 's/hello/hi/g' test.txt就地替换原文件
Bashsed -i 's/hello/hi/g' test.txt
删除行(
d命令)删除指定行(如第 3 行)
Bashsed '3d' test.txt删除匹配行(如包含
hello的行)Bashsed '/hello/d' test.txt删除范围(如第 2 到最后一行)
Bashsed '2,$d' test.txt
打印行(
p命令)常与
-n配合。打印指定行
Bashsed -n '1,3p' test.txt打印匹配行
Bashsed -n '/linux/p' test.txt
插入/追加(
i/a命令)在匹配行前插入
Bashsed '/hello/i\New line before' test.txt在匹配行后追加
Bashsed '/hello/a\New line after' test.txt
其他高级用法
多命令组合(用分号或
-e)Bashsed -e 's/hello/hi/g' -e '3d' test.txt使用正则:支持正则表达式,如删除空行
Bashsed '/^$/d' test.txt
tee
tee 命令用于从标准输入读取数据,并同时将数据输出到标准输出和一个或多个文件。即,可以在不影响管道后续处理的情况下,将中间结果保存到文件。
ABNF
"tee" [options] *file| 选项 | 说明 |
|---|---|
-a | 追加到文件,而不是覆盖 |
-i | 忽略中断信号(如 Ctrl+C) |
典型使用场景:
写入文件的同时查看输出
Bashecho "hello world" | tee output.txt追加写入文件(不覆盖)
默认情况下,
tee会覆盖文件内容。使用-a参数可以变成追加:Bashecho "new line" | tee -a output.txt在管道中保存中间结果
这是
tee最常见、也是最重要的用途。Bashps aux | tee ps.log | grep javaps aux的完整输出被保存到ps.log,同时将输出继续传给grep java进行过滤,不会 “截断” 管道。同时写入多个文件
Bashdate | tee file1.txt file2.txt结合
sudo写入受限文件重定向符号
>在 shell 中执行,可能导致权限不足,而tee可绕过这一限制:Bashecho "127.0.0.1 example.com" | sudo tee -a /etc/hosts
压缩包
常用的压缩的命令有:
gzip filenamebzip2 filenametar -czvf filename
常用的解压命令有:
gzip -d filename.gzbzip2 -d filename.bz2tar -xzvf filename.tar.gz
命令别名
查看已定义的别名
Bash
$ alias
alias ls='ls --color=auto'添加 lsc 命令别名
以添加 lsc 命令别名(LC_COLLATE=C ls)解决文件排序 “异常” 问题为例。
在 Debian 12(默认使用 en_US.UTF-8,可以通过 locale | grep LC_COLLATE 命令查看)下,文件系统的排序(Collation)基于 Unicode Collation Algorithm,受 LC_COLLATE 影响。标点符号如 -(连字符,ASCII 45)、.(点,ASCII 46)和 _(下划线,ASCII 95)在主要级别(Primary Level)被忽略,这导致有效排序键仅考虑字母数字字符。例如:
30-xxx的有效键 ≈30xxx30.5-xx的有效键 ≈305xx30_5-xx的有效键 ≈305xx
由于 305xx 在字符串比较中通常小于 30xxx(假设 xxx 以字母开头,如 x 的 ASCII 120 > '5' 的 53),因此 30.5-xx、30_5-xx 排到 30-xxx 前面。这不是 Bug,而是 locale 的字典式排序规则(忽略标点以模拟自然语言顺序)。
检查
~/.bashrc是否包含类似如下的命令行:Bash$ cat ~/.bashrc # ... if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi # ...1
2
3
4
5
6如果有则执行步骤 2,否则执行步骤 3。
添加
lsc命令别名到~/.bash_aliasesBashecho "alias lsc='LC_COLLATE=C ls --color=auto'" >> ~/.bash_aliases && source ~/.bash_aliases添加
lsc命令别名到~/.bashrcBashecho "alias lsc='LC_COLLATE=C ls --color=auto'" >> ~/.bashrc && source ~/.bashrc
服务器管理
时区
获取时区
Bash
timezone=$(timedatectl show -p Timezone --value 2>/dev/null || cat /etc/timezone 2>/dev/null || readlink /etc/localtime | sed 's#.*/zoneinfo/##')这条命令依次尝试三种方式:
timedatectl show -p Timezone --value最准确、最标准的方式(适用于 systemd 系统,Ubuntu、Debian、RHEL、Arch、Fedora 等)。
cat /etc/timezone某些旧版 Debian/Ubuntu 使用此文件直接存储时区。
readlink /etc/localtime+sed对于没有上面两者的系统(如 Alpine、macOS),通过解析
/etc/localtime的符号链接获得时区名。
如果只是想获取与 UTC 的偏移量(而非时区名),可以用:
Bash
offset=$(date +%z) # +0800时区缩写:
Bash
timezone=$(date +%Z) # CST查看可用时区
Bash
$ timedatectl list-timezones | grep -i -E 'china|beijing|shanghai'
Asia/Shanghai如果不清楚对应地区可用的时区有哪些,则可以使用 tzselect 交互式命令来帮助选择时区。注意,tzselect 命令只是帮助选择时区并将其显示出来,它实际并不会生效。
修改时区
可以在使用 systemd 的 Linux 上使用 timedatectl 命令来设置或修改时区。
首先使用
timedatectl命令查看当前系统时区;然后使用
sudo timedatectl set-timezone yourtimezone命令来修改系统时区:例如,将系统时区设置为东八区:
Bash$ sudo timedatectl set-timezone Asia/Shanghai
如果系统上没有 timedatectl 命令,也可以通过修改链接文件 /etc/localtime 到 /usr/share/zoneinfo 目录下的时区文件来修改时区。例如:
Bash
$ sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime将系统时区设置为东八区。
磁盘管理
查看磁盘使用情况
查看分区整体使用情况
Bash$ df -hT --exclude-type=tmpfs --exclude-type=devtmpfs --exclude-type=overlay Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 ext4 24G 14G 9.1G 60% /参数说明:
-h:人类可读格式(human-readable),以 GB、MB 显示;-T:显示文件系统类型(如 ext4, xfs, btrfs);-i:查看 inode 使用情况(有时空间没满但 inode 耗尽)。
查看某个目录空间占用情况
Bashdu -ahx / --max-depth=1 --exclude=/proc --exclude=/sys --threshold=100M | sort -hr | head -20参数 说明 /从根目录开始统计 -a,--all显示所有文件和目录的大小(不只是目录), du默认只显示目录-h,--human-readable以人类可读的格式显示大小(如 1.2G、850M、15K 等),而不是字节数 -x,--one-file-system只统计当前文件系统(避免统计挂载的别的分区,如 /mnt、/media等)--max-depth=1只显示一级子目录和文件的大小 --exclude=/proc排除 /proc虚拟文件系统--threshold=100M只显示大于等于 100MB 的项目 sort -hr按人类可读格式逆序排序
systemd 服务
查看所有 systemd 服务
Bashsystemctl list-unit-files --type=service运行中的服务
Bashsystemctl list-units --type=service --state=runninglist-units与list-unit-files对比项目 list-unit-fileslist-units显示内容 已安装的 unit 文件(配置) 正在运行或加载的 unit(状态) 数据源 文件系统(systemd unit 文件) systemd 内存中的运行状态 是否显示 inactive 单元 √(只要安装了就显示) ×(默认只显示加载过的) 是否显示未安装但已运行的实例 × √ 常用于 查看启用/禁用状态 查看当前系统运行状态
Bash 脚本
获取当前脚本所在的目录
Bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"信息
BASH_SOURCE 是 Bash 提供的一个内置数组变量,它记录了当前执行的 Bash 脚本的文件名(含路径),即使脚本是被 source 进来的,也能正确反映它的真实位置。