Linux命令手册

命令合集

1. 基础命令

  • echo: 用于打印消息或输出变量的值。

    1
    2
    echo "Hello, World!"
    echo "Current user: $USER"
  • cd: 更改当前目录。

    1
    cd /path/to/directory
  • pwd: 显示当前工作目录。

    1
    pwd
  • ls: 列出目录中的文件和子目录。

    1
    2
    ls -l   # 详细信息
    ls -a # 包括隐藏文件
  • touch: 创建空文件。

    1
    touch newfile.txt
  • cp: 复制文件或目录。

    1
    cp source.txt destination.txt
  • mv: 移动或重命名文件/目录。

    1
    2
    mv oldname.txt newname.txt
    mv /path/to/source /path/to/destination
  • rm: 删除文件或目录。

    1
    2
    rm file.txt
    rm -r directory/ # 递归删除目录

2. 条件语句

条件语句在 Linux 脚本编程中用于根据特定条件执行不同的操作。条件语句通常用于检查文件、变量值或其他条件,并基于这些条件控制程序的流程。主要的条件语句包括 if-elsecasetest。以下是详细的解释和示例:

  1. if-else 语句

if-else 语句是最常用的条件语句,用于根据条件执行不同的代码块。

基本语法:

1
2
3
4
5
if [ condition ]; then
# 如果条件为真,则执行这部分代码
else
# 如果条件为假,则执行这部分代码
fi

示例:

检查文件是否存在:

1
2
3
4
5
6
7
8
9
#!/bin/bash

file="/path/to/file.txt"

if [ -f "$file" ]; then
echo "File exists."
else
echo "File does not exist."
fi
  • **-f "$file"**:检查指定的路径是否存在且是一个文件。
  • **"$file"**:变量引用,双引号防止路径中有空格导致的问题。

示例:检查目录是否存在且是否为空:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

dir="/path/to/directory"

if [ -d "$dir" ]; then
if [ "$(ls -A $dir)" ]; then
echo "Directory is not empty."
else
echo "Directory is empty."
fi
else
echo "Directory does not exist."
fi
  • **-d "$dir"**:检查指定路径是否是一个目录。
  • **ls -A $dir**:列出目录中的所有文件(包括隐藏文件),如果结果不为空则表示目录不为空。
  1. case 语句

case 语句用于多重条件判断,适合于选择不同的代码块来处理不同的情况。

基本语法:

1
2
3
4
5
6
7
8
9
10
11
case "$variable" in
pattern1)
# 如果 $variable 匹配 pattern1,则执行这部分代码
;;
pattern2)
# 如果 $variable 匹配 pattern2,则执行这部分代码
;;
*)
# 如果 $variable 不匹配任何模式,则执行这部分代码
;;
esac

示例:

根据用户输入执行不同操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

read -p "Enter a day of the week: " day

case "$day" in
Monday)
echo "Start of the work week."
;;
Friday)
echo "End of the work week."
;;
Saturday | Sunday)
echo "Weekend!"
;;
*)
echo "Invalid day."
;;
esac
  • Monday 和 **Friday**:匹配具体的字符串。
  • **Saturday | Sunday**:匹配多个模式。
  • *****:默认情况,如果没有匹配到任何模式则执行。
  1. test 命令

test 命令用于评估文件属性和字符串比较,是 [ 命令的底层实现。

基本语法:

1
test expression

1
[ expression ]

常用选项:

  • 文件测试

    • **-e**:检查文件是否存在。
    • **-f**:检查是否为普通文件。
    • **-d**:检查是否为目录。
    • **-r**:检查是否可读。
    • **-w**:检查是否可写。
    • **-x**:检查是否可执行。
  • 字符串比较

    • **=**:比较两个字符串是否相等。
    • **!=**:比较两个字符串是否不相等。
    • **-z**:检查字符串是否为空。
    • **-n**:检查字符串是否非空。
  • 数字比较

    • **-eq**:等于。
    • **-ne**:不等于。
    • **-lt**:小于。
    • **-le**:小于或等于。
    • **-gt**:大于。
    • **-ge**:大于或等于。

示例:检查文件是否存在且是否为可执行文件:

1
2
3
4
5
6
7
8
9
#!/bin/bash

file="/path/to/script.sh"

if [ -x "$file" ]; then
echo "The file is executable."
else
echo "The file is not executable."
fi
  • **-x "$file"**:检查文件是否具有可执行权限。

示例:字符串比较:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

str1="hello"
str2="world"

if [ "$str1" = "$str2" ]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
  • **"$str1" = "$str2"**:比较两个字符串是否相等。

3. 循环

  • for: 遍历列表中的每个元素。

    1
    2
    3
    for file in *.txt; do
    echo "Processing $file"
    done
  • while: 基于条件的循环。

    1
    2
    3
    4
    5
    counter=1
    while [ $counter -le 5 ]; do
    echo "Counter: $counter"
    ((counter++))
    done

4. 函数

  • 定义和调用函数。

    1
    2
    3
    4
    5
    my_function() {
    echo "Hello from function!"
    }

    my_function
  • 函数带参数。

    1
    2
    3
    4
    5
    greet() {
    echo "Hello, $1"
    }

    greet "Alice"

5. 输入输出和重定向

  • 输入重定向:从文件或命令中读取输入。

    1
    cat < inputfile.txt
  • 输出重定向:将输出写入文件。

    1
    2
    echo "Some text" > outputfile.txt  # 覆盖输出文件
    echo "More text" >> outputfile.txt # 追加输出
  • **管道 (|)**:将一个命令的输出作为另一个命令的输入。

    1
    ls | grep ".txt"

6. 变量

  • 定义和使用变量。

    1
    2
    name="Alice"
    echo "Hello, $name"
  • 读取用户输入。

    1
    2
    read -p "Enter your name: " username
    echo "Welcome, $username"

7. 参数传递

  • 脚本可以接受命令行参数。

    1
    2
    3
    #!/bin/bash
    echo "First argument: $1"
    echo "Second argument: $2"
  • 获取所有参数。

    1
    echo "All arguments: $@"

8. 文件处理

创建文件

  • **touch**:创建一个空文件或更新现有文件的时间戳。

    1
    touch filename.txt
    • 如果 filename.txt 已存在,touch 会更新文件的最后修改时间。
    • 如果 filename.txt 不存在,则会创建一个空文件。
  • **echo**:创建一个文件并写入内容。

    1
    echo "Hello, World!" > hello.txt
    • 使用 > 重定向符将文本 "Hello, World!" 写入 hello.txt 文件。如果文件已存在,会被覆盖。

读取文件

  • **cat**:显示文件内容。

    1
    cat filename.txt
    • cat 命令会将整个文件的内容输出到标准输出(通常是终端)。
  • more 和 **less**:分页显示文件内容。

    1
    2
    more filename.txt
    less filename.txt
    • **more**:逐页显示文件内容,按空格键翻页,按 q 退出。
    • **less**:比 more 更强大,支持前后翻页,按 q 退出。
  • **head**:显示文件的开头部分。

    1
    head -n 10 filename.txt
    • -n 选项指定显示的行数,默认显示前10行。
  • **tail**:显示文件的结尾部分。

    1
    tail -n 10 filename.txt
    • -n 选项指定显示的行数,默认显示最后10行。
    • **tail -f filename.txt**:实时显示文件新增的内容,用于监控日志文件。

写入文件

  • **>**:将输出重定向到文件,覆盖文件内容。

    1
    echo "New content" > filename.txt
  • **>>**:将输出追加到文件末尾。

    1
    echo "Additional content" >> filename.txt
  • **tee**:将输出写入文件并显示在终端。

    1
    echo "Content" | tee filename.txt
    • tee 命令会将输出内容写入 filename.txt 文件,并同时输出到标准输出。

查找和处理文件

  • **find**:查找符合条件的文件。

    1
    find /path/to/dir -name "*.txt"
    • 查找 /path/to/dir 目录下所有 .txt 文件。
  • **grep**:在文件中查找匹配的文本。

    1
    grep "search_term" filename.txt
    • 查找 filename.txt 中包含 "search_term" 的行。
  • **sed**:流编辑器,用于查找和替换文本。

    1
    sed 's/old/new/g' filename.txt
    • filename.txt 中的所有 old 替换为 new
  • **awk**:文本处理工具,用于格式化和处理数据。

    1
    awk '{print $1}' filename.txt
    • 打印 filename.txt 中每一行的第一个字段。

修改文件

  • **mv**:移动或重命名文件。

    1
    mv oldname.txt newname.txt
    • oldname.txt 重命名为 newname.txt
    • 也可以将文件移动到不同目录。
  • **cp**:复制文件。

    1
    cp source.txt destination.txt
    • 复制 source.txt 文件到 destination.txt
  • **rm**:删除文件。

    1
    rm filename.txt
    • 删除 filename.txt 文件。
  • **chmod**:修改文件权限。

    1
    chmod 755 filename.txt
    • 修改 filename.txt 的权限为 rwxr-xr-x

处理文本文件

  • **sort**:对文件内容进行排序。

    1
    sort filename.txt
    • filename.txt 的内容进行升序排序。
  • **uniq**:去除重复行。

    1
    sort filename.txt | uniq
    • uniq 通常与 sort 命令结合使用,用于去除重复行。
  • **cut**:从文件中提取特定字段。

    1
    cut -d',' -f1 filename.txt
    • 提取 filename.txt 中以逗号分隔的第一列数据。

文件权限

  • **chmod**:修改文件权限。

    1
    chmod 644 filename.txt
    • filename.txt 的权限设置为 rw-r--r--(用户可读写,组用户和其他用户可读)。
  • **chown**:修改文件的所有者和组。

    1
    chown user:group filename.txt
    • filename.txt 的所有者更改为 user,组更改为 group

文件比较

  • **diff**:比较两个文件的差异。

    1
    diff file1.txt file2.txt
    • 显示 file1.txtfile2.txt 之间的差异。
  • **cmp**:逐字节比较两个文件。

    1
    cmp file1.txt file2.txt
    • 比较两个文件的内容,显示第一个不同的字节位置。

归档和压缩

  • **tar**:创建和解压归档文件。

    1
    tar -cvf archive.tar file1.txt file2.txt
    • 创建一个名为 archive.tar 的归档文件,包含 file1.txtfile2.txt
    1
    tar -xvf archive.tar
    • 解压 archive.tar 归档文件。
  • gzip 和 **gunzip**:压缩和解压文件。

    1
    gzip filename.txt
    • 压缩 filename.txt 文件,生成 filename.txt.gz
    1
    gunzip filename.txt.gz
    • 解压 filename.txt.gz 文件,恢复为 filename.txt

9. 退出状态

  • **exit**:返回脚本的退出状态。

    1
    2
    exit 0  # 成功退出
    exit 1 # 失败退出
  • 检查上一条命令的退出状态。

    1
    2
    3
    4
    5
    if [ $? -eq 0 ]; then
    echo "Previous command succeeded"
    else
    echo "Previous command failed"
    fi

10. 日志与调试

  • **set -x**:用于调试,显示执行的每一行命令。

    1
    set -x
  • **set +x**:关闭调试模式。

    1
    set +x
  • 日志输出:将信息输出到日志文件。

    1
    echo "Script started" >> script.log

11. 权限

在 Linux 系统中,文件和目录的权限决定了哪些用户或用户组可以对文件进行读、写、执行操作。每个文件和目录的权限由三组表示:

  1. 用户权限(owner):文件的所有者。
  2. 用户组权限(group):文件所属的用户组。
  3. 其他用户权限(others):系统中其他用户的权限。

查看权限:

使用 ls -l 命令可以查看文件的权限:

1
ls -l filename

输出示例:

1
-rwxr-xr--
  • 第一个字符表示文件类型(- 表示普通文件,d 表示目录)。
  • 后面九个字符分别表示用户、组和其他人的权限。
    • r:可读(read)。
    • w:可写(write)。
    • x:可执行(execute)。
    • 没有权限时用 - 表示。

如上面的例子:

  • rwx:用户(owner)可以读、写、执行。
  • r-x:组用户可以读和执行,但不能写。
  • r--:其他用户只能读。

修改权限:

使用 chmod 命令修改文件或目录的权限。

  1. 数字模式:

权限用三个数字表示,每个数字为权限组合值的总和:

  • 读(r):4
  • 写(w):2
  • 执行(x):1

组合值:

  • 7 = 读 + 写 + 执行
  • 6 = 读 + 写
  • 5 = 读 + 执行
  • 4 = 读

例如,给文件赋予 rwxr-xr-- 权限(用户:读写执行,组:读执行,其他用户:只读):

1
chmod 754 filename
  1. 符号模式:

使用符号来设置权限:

  • u:用户(owner)
  • g:组用户
  • o:其他用户
  • **+**:添加权限
  • **-**:移除权限
  • **=**:设置权限

示例:

1
2
3
chmod u+x filename    # 给用户添加执行权限
chmod g-w filename # 移除组用户的写权限
chmod o=r filename # 设置其他用户只有读权限

12. 进程控制

Linux 是一个多任务操作系统,进程控制是管理和操作系统中运行的程序或任务的重要功能。通过管理进程,用户可以查看、终止、暂停和恢复程序的执行。

查看进程:

使用 ps 命令查看系统中当前运行的进程。常用选项包括:

1
ps aux
  • **ps**:显示当前进程信息。
  • **aux**:显示所有用户的所有进程以及详细信息。

示例输出:

1
2
3
USER       PID  %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1 0.0 0.1 22564 1392 ? Ss 09:21 0:02 /sbin/init
user 2735 0.2 1.3 110236 25356 ? S 10:30 0:05 /usr/bin/python
  • PID:进程 ID。
  • %CPU:CPU 使用率。
  • %MEM:内存使用率。
  • COMMAND:正在执行的命令。

后台运行进程

使用 & 将进程放在后台执行:

1
./script.sh &
  • **&**:将脚本放入后台执行,终端不会等待脚本执行完毕。

停止和恢复进程

  • **Ctrl + Z**:暂停前台运行的进程。
  • **bg**:将暂停的进程放入后台继续运行。
  • **fg**:将后台进程恢复到前台。

终止进程

使用 kill 命令可以终止进程。

1
kill <PID>
  • **<PID>**:进程的 ID,通过 ps 命令获得。

强制终止进程

如果一个进程无法正常终止,可以使用 -9 强制终止:

1
kill -9 <PID>

常用进程控制命令

  1. **top**:实时显示系统中正在运行的进程以及资源使用情况。

    1
    top
  2. **htop**:功能更强大的进程监控工具,需要单独安装。

    1
    htop
  3. **jobs**:查看当前会话中的后台作业。

    1
    jobs

使用示例:

grep - 文本搜索工具

  1. 查找文件中的文本

    1
    grep "search_term" filename.txt
    • 功能:在 filename.txt 中查找包含 search_term 的行,并显示这些行。
    • 常用选项
      • -i:忽略大小写。
      • -v:显示不包含 search_term 的行。
      • -r-R:递归地在目录中查找文件。
      • -n:显示匹配行的行号。
      • -H:显示匹配的文件名。
    1
    grep -i "error" /var/log/syslog
    • 功能:在 /var/log/syslog 文件中查找包含 error(忽略大小写)的行。
  2. 查找进程相关信息

    1
    ps aux | grep "process_name"
    • 功能:列出所有进程,然后通过 grep 过滤出包含 process_name 的进程信息。
    • 常用选项
      • -e:显示所有进程。
      • -f:显示详细信息。
      • aux:结合 a(所有用户的进程)、u(以用户格式显示)和 x(显示没有控制终端的进程)。
    1
    ps aux | grep "apache"
    • 功能:列出所有进程,并显示包含 apache 的行,用于查找与 Apache 相关的进程。
  3. 显示指定目录下所有文件中包含特定内容的行

    1
    grep -r "search_term" /path/to/dir
    • 功能:递归搜索 /path/to/dir 目录及其子目录中的所有文件,查找包含 search_term 的行。

top - 实时系统监控工具

  1. 基本使用

    1
    top
    • 功能:显示系统上当前运行的进程及其资源使用情况,实时更新。
    • 常用功能
      • **P**:按 CPU 使用率排序。
      • **M**:按内存使用情况排序。
      • **q**:退出 top
  2. 指定更新间隔

    1
    top -d 5
    • 功能:每隔 5 秒更新一次显示。
  3. 显示指定用户的进程

    1
    top -u username
    • 功能:仅显示 username 用户的进程。
  4. 自定义显示

    1
    top -b -n 1
    • 功能:以批处理模式运行 top,输出一次快照并退出(适合将输出重定向到文件)。

ps - 显示进程状态

  1. 显示所有进程

    1
    ps aux
    • 功能:显示所有用户的所有进程,提供详细信息,包括 CPU 和内存使用情况。
    • 常用选项
      • a:显示所有用户的进程。
      • u:以用户格式显示。
      • x:显示没有控制终端的进程。
  2. 显示特定用户的进程

    1
    ps -u username
    • 功能:仅显示 username 用户的进程。
  3. 显示特定进程的信息

    1
    ps -p PID
    • 功能:显示进程 ID 为 PID 的进程信息。
  4. 显示树状进程结构

    1
    ps -ejH
    • 功能:以树状结构显示进程及其子进程。

结合使用

  1. 查找占用高 CPU 的进程

    1
    top -b -n 1 | grep "Cpu(s)"
    • 功能:运行 top 命令并筛选出 CPU 使用情况的行。
  2. 检查特定进程的资源使用情况

    1
    ps aux | grep "process_name" | awk '{print $1, $2, $3, $4, $11}'
    • 功能:查找 process_name 相关的进程,并使用 awk 提取用户、PID、CPU 使用率、内存使用率和命令名。
  3. 实时监控进程状态

    1
    top -p $(pgrep -d',' -f process_name)
    • 功能:实时监控与 process_name 相关的进程,pgrep 用于查找进程 ID,并将其传递给 top 命令。