Linux Shell 学习笔记

文件管理

ls 命令

ls 来自英文单词中的 "list" 的缩写,用于列出目录中文件以及其属性信息。

1
ls [参数] [文件名]

常用参数

参数 解释
-a 显示所有文件及目录
-A -a 的基础上不显示当前目录和父目录
-d 显示目录本身的属性信息
-i 显示文件的 inode 属性
-l 显示文件的详细属性信息,包括类型、权限等
-m 以逗号为间隔符,水平显示文件信息
-r 依据首字母将文件以相反次序显示
-R 递归显示所有子文件
-S 依据内容大小将文件排序显示
-t 依据最后修改时间将文件排序显示
-X 依据拓展名将文件排序显示
--color 显示信息带有着色效果

不添加任何参数的情况下,ls 命令会列出当前工作目录的文件信息。

cp 命令

cp 命令来自英文单词中 "copy" 的缩写,用于复制文件或目录。

1
cp [参数] 源文件名 目标文件名/复制目录

常用参数

参数 解释
-b 覆盖目标文件前先进行备份
-d 复制链接文件时,将目标文件也建立成链接文件
-f 若目标文件已存在,则会直接覆盖
-i 若目标文件已存在,则会询问是否覆盖
-l 对源文件建立硬链接,而非复制文件
-p 保留源文件或者目录的所有基本属性
-r 递归复制所有子文件
-s 对源文件建立软链接,而非复制文件
-a 功能等同于 -d -p -r
-v 显示执行过程详细信息

示例

  1. 在同一目录下复制 demo.txt 的副本:

    1
    cp demo.txt demo_copy.txt

  2. demo.txt 复制到 ./demo_dict 目录,如果目标文件存在则覆盖:

    1
    cp -f demo.txt ./demo_dict

  3. 建立 dmeo.txt 的软链接:

    1
    cp -s demo.txt demo_soft_link

mkdir 命令

mkdir 命令来自于英文 "Make directories" 的缩写,用于创建目录文件。

1
mkdir [参数] 目录名

常用参数

参数 解释
-m 创建目录的同时设置权限
-p 递归创建多级目录
-v 显示执行过程详细信息
-z 设置目录安全上下文

示例

  1. 创建一个权限为 740 的文件:

    1
    mkdir -m 740 dir_test

    1
    2
    3
    ls -ld dir_test
    # 输出结果:
    drwxr-----@ 2 username staff 64 9 29 23:20 dir_test

  2. 一次创建多个嵌套关系的目录:

    1
    mkdir -p dir1/dir2/dir3

mv 命令

mv 指令,来自于英文单词中的 "move",用于移动或者更改文件名。

1
mv [参数] 源文件名 目标文件名

常用参数

参数 解释
-b 覆盖前为目标文件创建备份
-f 若文件已存在,强制覆盖目标文件
-i 若文件已存在,则询问用户是否覆盖
-n 不要覆盖已有文件
-u 当源文件比目标文件更新时,才执行覆盖操作
-v 显示执行过程详细信息
-Z 设置文件安全上下文

示例

  1. demo.txt 改名为 demo2.txt

    1
    mv demo.txt demo2.txt

  2. dir1 移动到 dir2

    1
    mv dir1 ./dir2

  3. 在 (1) 的基础上将 dir1 重命名为 dir0

    1
    mv dir1 ./dir2/dir0

pwd 命令

pwd 指令来自于英文中的 "Print working directory" 的缩写,用于显示当前工作目录的路径。

1
pwd [参数]

常用参数

参数 解释
-L 显示逻辑路径(默认)
-P 显示实际物理地址
tar 命令

tar 指令用于压缩和解压文件,能解压或压缩 Linux 系统中常见的 .tar.tar.gztar.bz2 等格式的压缩包文件。

1
tar 参数 压缩包名 [文件或目录名]

常用参数

参数 说明
-A 添加文件到已存在压缩包
-B 设置区块大小
-c 创建新的压缩包
-C 解压缩到指定目录
-d 记录文件的差别
-f 指定压缩包文件
-j 使用 bzip2 压缩格式
-l 设置文件系统边界
-m 保护文件不被覆盖
-N 只将较新日期的文件保存到压缩包中
-p 保留原来的文件权限和属性
-t 显示压缩包的内容
-u 更新压缩包内的文件
-v 显示执行过程详细信息
-w 确认压缩包的完整性
-x 从压缩包内提取文件
-z 使用 gzip 压缩格式
--exclude 排除指定的文件不压缩
--remove-files 操作完后删除源文件

示例

  1. 使用 gzip 压缩格式将 demo 目录打包,压缩包后缀指定为 .tar

    1
    tar -czvf demo.tar ./demo

  2. demo.tar 解压到当前工作目录:

    1
    tar -xvf demo.tar

  3. 查看压缩包 demo.tar 内到文件信息:

    1
    tar -tvf demo.tar

chmod 命令

chmod ,来自英文缩写 "change mode",用于更改文件权限。

1
chmod [参数] 权限 文件名

常用参数

参数 解释
-c 改变文件权限成功后再输出成功信息
-f 改变文件权限失败后不显示错误信息
-R 递归处理所有子文件

权限

权限可以用数字表示,例如 755,表示 rwxr-xr-x 权限,也可以使用 +- 进行权限追加。

文件所属者、群组用户和外部用户分别用 ugo 表示;

读、写、执行的权限分别用 rwx 表示。

示例

  1. demo.txt 的权限设置为 755:

    1
    chmod 755 demo.txt

  2. 给所有用户增加读 demo.txt 的权限:

    1
    chmod +r demo.txt 

  3. 剥夺外部用户写 demo.txt 的权限:

    1
    chmod o-w demo.txt

lsof 命令

lsof(List Open Files)是在 Unix、Linux 以及其他类 Unix 操作系统中非常强大的命令行工具,用于列出系统中当前打开的文件。在 Unix 和 Linux 中,几乎一切都被视为文件,包括硬件设备、管道、套接字和目录。lsof 命令因此能提供关于系统中正在使用哪些文件的宝贵信息。

lsof 可以用来:

  • 列出所有打开的文件
  • 列出某个特定用户打开的文件
  • 列出某个特定进程打开的文件
  • 列出打开特定文件的所有进程
  • 列出所有打开某个特定端口的进程
  • 列出所有网络连接和监听端口

示例

  1. 列出所有打开文件:

    1
    lsof

  2. 列出特定用户打开的文件:

    1
    lsof -u username

  3. 列出特定进程打开的文件:

    1
    lsof -p 945 # 945 是 PID

  4. 查找监听特定端口的进程:

    1
    lsof -i :3306 # 3306 是端口号

  5. 列出所有网络连接:

    1
    lsof -i

  6. 列出某个目录下被打开的文件:

    1
    lsof +D /path

  7. 找出删除文件后仍被进程占用的情况:

    1
    lsof | grep deleted

文档编辑

cat 命令

cat 命令来自于英文中 "concatenate files and print" 的缩写,用于在终端设备上显示文件内容。

1
cat [参数] 文件名

常用参数

参数 解释
-b 显示行数
-E 每行结束时以 $ 结尾
-n 显示行数,空行也编号
-s 显示行数,多个空行算一个编号

示例

  1. 查看文件 demo.txt 并显示行数:

    1
    cat -n demo.txt

  2. 查看当前操作系统的用户列表:

    1
    cat /etc/passwd

more 命令

more 是一个用于在 Linux Shell 中分页显示文本文件内容的命令行工具,它允许用户逐页查看文件。

1
more [参数] 文件名

使用方法

  • 按空格键:向下滚动一页。
  • 按 Enter 键:向下滚动一行。
  • q 键:退出 more,返回到 Shell 提示符。
  • / 键:进行文本搜索,然后输入要搜索的文本并按 Enter 键。
  • n 键:查找下一个匹配的搜索结果。
  • p 键:查找上一个匹配的搜索结果。

参数

参数 解释
-l 显示进程名和 PID
-d 显示文件名和当前行号
-c 清屏后显示内容
-f 忽略控制字符
-s 合并多个空行为一个空行
wc 命令

wc(word count)用于计算字数、行数、字符数(byte 和 character)以及文件中最长行的长度的常用工具。这个命令在文本处理、统计信息以及编程中非常有用,尤其是在处理大量文本数据时,可以迅速给出文件或输入的基本统计信息。

1
wc [参数] [文件]

常用参数

参数 解释
-l 计算行数
-w 计算词数
-c 计算字节数
-m 计算字符数
awk 命令

awk 是一种强大的文本处理工具,广泛用于 Unix 和类 Unix 系统中。它非常擅长处理结构化数据,并对文本和数据进行分析、转换和生成报告。awk 通过在数据流或文件上执行定义好的脚本来工作,脚本中包含了一系列的模式和对应的动作。当数据匹配到特定模式时,awk 就执行对应的动作。

1
awk '模式' 文件 

示例

  1. 打印文件 demo.txt 每一行:

    1
    awk '{ print }' demo.txt

  2. 打印文件 demo.txt 第一列:

    1
    awk '{ print $1 }' demo.txt

  3. 使用条件语句:

    1
    awk '$2 > 5000 { print $1 $2}' demo.txt

echo 命令

echo 在英文中译为回声,用于在终端输出字符串或提取后的变量值。

1
echo [参数] 字符串或${变量名}

常用参数

参数 解释
-E 禁止转义字符
-e 启动转义字符的解释
-n 不输出结尾的换行符

示例

  1. 打印两行话到终端:

    1
    echo -e "Hello\nWorld!"

  2. 打印环境变量 PATH

    1
    echo ${PATH}

  3. 显示当前系统的运行时间和当前系统负载的信息:

    1
    echo $(uptime)

rm 命令

rm 命令来自英文单词 "remove" 的缩写,用来删除文件或目录。

1
rm [参数] 文件名

常用参数

参数 解释
-d 删除无子文件的空目录
-f 强制删除文件不询问
-i 删除文件前询问用户是否删除
-r 递归删除目录及其全部子文件
-v 显示执行过程详细信息

示例

  1. 强制删除当前工作目录下所有 .txt 后缀的文件:

    1
    rm -f *.txt

  2. 强制删除目录 dir 以及其所有子文件:

    1
    rm -rf dir

grep 命令

grep 命令来自英文 "Global search regular expression and print out the line" 的缩写,是一个强大的文本搜索工具。

1
grep [参数] 文件名

常用参数

参数 解释
-b 显示匹配行距文件头部的偏移量
-c 只显示匹配的行数
-E 支持拓展正则表达式
-F 匹配固定字符串的内容
-h 搜索多文件时不显示文件名
-i 忽略关键词大小写
-l 只显示符合匹配条件的文件名
-n 显示所有匹配行及其行号
-o 显示匹配词距文件头部的偏移量
-q 静默执行模式
-r 递归搜索模式
-s 不显示没有匹配文本的错误信息
-v 显示不包括匹配文本的所有行
-w 精准匹配整词
-x 精准匹配整行

示例

  1. 查找文件 OS.md 中所有包含 process 的行,并且显示其行号:

    1
    grep -n process OS.md

  2. 搜索当前工作目录中包含关键词 Java 的文件:

    1
    grep -lrs Java *

tail 命令

顾名思义,tail 命令用于查看文件尾部内容。

1
tail [参数] 文件名

常用参数

参数 解释
-c 设置显示文件尾部的字符数
-f 持续显示文件尾部的最新内容
-n 设置显示文件尾部的行数

示例

  1. 显示 demo.txt 最后 15 行:

    1
    tail -n 15 demo.txt

  2. 显示 demo.txt 最后 20 个字符:

    1
    tail -c 20 demo.txt

rmdir 命令

rmdir 命令来自于英文中的 "Remove directory" 的缩写,用于删除空目录文件。

1
rmdir [参数] 目录名

常用参数

参数 解释
-p 递归处理所有子文件
-v 显示执行过程详细信息
diff 指令

diff 指令是一个非常有用的工具,它可以比较两个文件或者两组文件之间的差异。diff 不仅能帮助用户理解文件之间的不同,还常被用于程序代码的版本比较,从而辅助代码的审查和合并工作。

1
diff [参数] 文件1 文件2

示例

  1. 并排查看两个文件的差异:

    1
    diff -y demo1.txt demo2.txt

  2. 比较两个目录:

    1
    diff -r dir1 dir2

  3. 使用上下文格式:

    1
    diff -c demo1.txt demo2.txt

  4. 生成补丁文件:

    1
    diff -u demo1.txt demo2.txt > patchfile

系统管理

find 命令

find 命令的功能是用于根据给定的路径和条件查找相关文件或目录,参数灵活方便,且支持正则表达式

1
find [路径] [条件] 文件名

常用参数:

参数 解释
-name 匹配文件名
-perm 匹配文件权限
-user 匹配文件所属主
-group 匹配文件所属组
-mtime 匹配最后修改文件内容的时间
-atime 匹配最后读取文件内容的时间
-ctime 匹配最后修改文件属性的时间
-type 匹配文件类型
-size 匹配文件大小
-exec ... {} \ 进一步执行语句

示例:

  1. 查找当前目录下所有 zip 压缩包:

    1
    find ./ -name *.zip

  2. 查找当前目录下 demo_dir 文件夹下所有大于 1M 的文件:

    1
    find ./demo_dir -size +1M

  3. 查找工作目录最近 3 天被修改过的文件并且打印其长格式:

    1
    find ./ -mtime +3 -exec ls -l {} \;

ps 命令

ps 命令是 "process" 的缩写,用于显示进程信息。

1
ps [参数]

如果 ps 不添加任何参数,则会显示当前 Shell 的进程。

常用参数:

参数 解释
-a 显示当前终端会话的所有进程
-x 显示没有控制终端的进程
-e 显示系统所有进程
-f 显示详细的进程信息
-l 以长格式显示进程信息
aux 也是显示系统所有进程,但输出格式更加详细
-u 显示与指定用户标识符(UID)相关的进程
-d 显示指定用户正在运行的进程
-p 显示特定 PID 的进程
-o 自定义输出进程格式
-t 显示在特定终端运行的进程
-H 显示进程的层次结构,包括父进程和子进程

示例:

  1. 显示系统所有进程,展示其 PID 和控制终端:

    1
    ps -eo pid,tty

  2. 显示 PID 为 100 的进程信息:

    1
    ps -p 100

pstree 命令

pstree 命令是一个用于显示进程树的实用程序。它以一种层次结构的方式展示正在运行的进程,显示进程之间的父子关系。

1
pstree [参数]

常用参数

参数 解释
-u 显示与指定用户标识符(UID)相关的进程
-p 显示特定 PID 的进程
-h 以水平格式显示进程树
pgrep 命令

pgrep 命令来自英文词组 "process global regular expression print" 的缩写,其功能是用于检索进程 PID 号码。pgrep 命令通过正则表达式进行检索,因此用户只需要输入服务名称中的一部分即可进行搜索操作,对于不记得全名的服务程序特别好用。

1
pgrep [参数] 服务器名

常用参数

参数 解释
-f 匹配进程名
-g 匹配进程组 ID
-u 匹配有效用户 ID
-t 匹配终端号
-c 显示进程数量
kill 命令

kill 命令用于向单个进程发送一个信号,以请求其终止。

1
kill [参数] PID

常用参数

参数 解释
-a 不限制命令行与进程号的对应关系
-l 显示系统支持的信号列表
-p 不发送任何信号
-s 设置向进程发送的信号
pkill 命令

pkill 命令用于根据进程名或其他进程属性来终止进程。它可以一次终止多个匹配的进程。

1
pkill [参数] 进程名称

常用参数

参数 解释
-c 匹配进程 ID
-g 匹配进程组
-u 匹配用户 ID
-n 匹配最近生成的进程
-o 匹配最早生成的进程
top 命令

top 是一个非常常用的命令行工具,用于实时监视和显示正在运行的进程的系统性能信息。它在类 Unix 系统(如Linux、MacOS)上非常有用,可以让用户实时查看 CPU 使用率、内存利用率、进程列表和其他系统性能指标。

1
top

操作

  • 使用键盘上的箭头键可以在进程列表中滚动。
  • 按下 q 键可退出 top
  • 按下 k 键可终止选定的进程。
  • 按下 F 键可调整排序顺序或显示的字段。
  • 按下 h 键可查看帮助和快捷键列表。

一般情况下,top 显示的信息包括:

  • 进程ID(PID):每个进程的唯一标识符。
  • 用户(USER):运行该进程的用户。
  • 调度优先级(PR):表示进程的调度优先级(Priority)。
  • Niceness(NI):表示进程的 Niceness 值。
  • 虚拟内存使用量(VIRT)VIRT 表示进程的虚拟内存(Virtual Memory)使用量
  • 物理占用内存(RES)RES 表示进程的实际物理内存占用(Resident Set Size),也就是实际分配给进程并存储在物理内存中的内存量。
  • 共享内存大小(SHR)SHR 表示进程共享的内存大小(Shared Memory),也就是多个进程之间共享的内存量。这包括进程使用的共享库和共享的内存段。
  • 状态(S):进程的状态(如运行、休眠、停止等)。
  • CPU% (CPU%):进程占用的CPU百分比。
  • 内存% (MEM%):进程占用的内存百分比。
  • 累计时间(TIME+)TIME+ 列表示自进程启动以来的累积 CPU 时间。这个值以小时、分钟和秒的格式表示,显示了进程占用 CPU 的时间量。
  • 命令 (COMMAND):启动进程的命令行。

uname 命令

uname 命令来自英文中的 "Unix name",用于查看系统主机名、内核及硬件架构等信息。

1
uname [参数]

常用参数:

参数 说明
-s 显示内核名称(默认)
-a 显示系统所有相关信息
-i 显示硬件平台
-m 显示计算机硬件架构
-n 显示主机名称
-o 显示操作系统名称
-p 显示主机处理器类型
-r 显示内核发行版本号
-v 显示内核版本
set 命令

set 指令是一个内建命令,用于设置和查看 shell 的运行时参数。它可以用来更改 shell 环境的行为,或者设置定位参数,即 $1$2 等。set 指令非常灵活,提供了多种选项来影响 shell 的行为,以及处理脚本中的参数。

示例

  1. 列出所有可以被设置的选项及其当前状态:

    1
    set -o

  2. 如果任何命令以非零状态退出,则立即退出脚本:

    1
    set -e # 使用 set +e 取消s

  3. 当尝试使用未初始化的变量时,则立即退出脚本:

    1
    set -u

  4. 在执行命令前,将命令打印在标准错误输出中:

    1
    set -x

  5. 只要管道中的任何命令失效,整个管道就会失效:

    1
    set -o pipefail

磁盘管理

df 命令

df 命令是 "Report file system disk space usage" 的缩写,用于显示磁盘空间的使用情况。

1
df [参数] 磁盘分区

常用参数

参数 解释
-a 显示所有文件系统
-h 以更易读的方式显示
-H 以 1 KB = 1000 Byte 为换算单位
-i 显示索引字节信息
-k 设置显示时块的大小
-l 只显示本地文件系统

示例

  1. 以容量单位显示系统全部磁盘的使用量情况:

    1
    df -h

  2. 指定具体分区:

    1
    df -h /boot

网络通讯

ssh 命令

ssh 命令可以让我们轻松地基于 SSH 加密协议进行远程主机访问,从而实现对远程服务器的管理工‍作。

1
ssh [参数] 域名|IP

常用参数

参数 解释
-1 使用 SSH 协议版本 1
-2 使用 SSH 协议版本 2
-4 基于 IPv4 网络协议
-6 基于 IPv6 网络协议
-l 设置登录用户名
-f 后台执行 SSH 命令
-p 设置远程服务器的端口号

示例

  1. 基于 SSH 指令访问远程主机:

    1
    ssh 192.168.10.10

  2. 制定登录用户:

    1
    ssh -l linuxprobe 192.168.10.10

scp 命令

scp(安全拷贝协议)是一个在 Linux 和 Unix 系统上用来在本地和远程之间安全传输文件的命令行工具。它利用 SSH 为文件传输提供安全的加密连接,确保数据在传输过程中的安全和隐私。scp 命令可以用来复制文件和目录,既可以在本地计算机之间传输文件,也可以在本地计算机和远程计算机之间传输文件。

1
scp [选项] 源文件路径 目标文件路径

常用参数

参数 解释
-P 指定端口号
-r 递归复制整个文件
-C 自动压缩文件,减少传输时间

示例

  1. 将本地文件复制到远程服务器:

    1
    scp localfile.txt username@server:/path/file

  2. 从远程服务器复制文件到本地:

    1
    scp username@server:/path/file localfile.txt

  3. 递归复制整个目录到远程服务器:

    1
    scp -r localdir username@server:/path/file

netstat 命令

netstat 命令来自英文词组 “Network statistics” 的缩写,其功能是显示各种网络相关信息,例如网络连接状态、路由表信息、接口状态、NAT、多播成员等。

1
netstat [参数]

常用参数

参数 解释
-a 显示所有连接中的接口信息
-c 持续显示网络状态
-C 显示路由配置信息
-F 显示路由缓存信息
-n 直接使用 IP 地址
-p 显示正在使用接口的程序识别码和名称
-r 显示路由表信息
-i 显示网络界面信息表单
-t 显示 TCP 传输协议的连接状态
-u 显示 UDP 传输协议的连接状态

示例

  1. 显示网络所有连接信息:

    1
    netstat -a

  2. 显示系统网络状态中的 UDP 连接信息:

    1
    netstat -nu

  3. 显示网卡当前状态:

    1
    netstat -i

nc 命令

nc(或称 Netcat)是一个功能强大的网络工具,常被称为“网络瑞士军刀”。它可以通过 TCP 或 UDP 的方式读写数据,对于网络调试和探测非常有用。nc 可以用于创建任何种类的连接,包括端口扫描、发送原始数据包、监听传入连接等。

1
nc [参数] [目标 IP 或域名] [端口号]

常用参数

参数 解释
-l 侦听传入的连接,而不是发起连接
-p 指定监听的端口
-u 使用 UDP 而不是默认的 TCP
-v 在操作中提供更多的输出信息,可以帮助调试
-w 设置超时时间,防止命令永久挂起
-z 扫描监听模式,用于扫描开放的端口,而不是建立真正的连接

常用工具

bc 命令

bc 是一个用于进行任意精度计算的命令行计算器。它的名称是 "Basic Calculator" 的缩写,它允许你进行大数运算,包括整数和浮点数,而不受标准计算器或编程语言中固定精度的限制。bc 是一个非常强大的工具,特别适用于需要高精度计算的数学任务。

bc 支持的运算如下:

  1. 基本算术运算

    • 加法:+
    • 减法:-
    • 乘法:*
    • 除法:/
    • 模运算:%
    • 幂运算:^
    • 自增运算:++
    • 自减运算:--
  2. 逻辑运算

    • 逻辑非(取反):!
    • 逻辑与:&&
    • 逻辑或:||
  3. 比较运算

    • 等于:==
    • 不等于:!=
    • 大于:>
    • 小于:<
    • 大于等于:>=
    • 小于等于:<=
  4. 数学函数

    bc 支持许多数学函数,包括但不限于以下几种:

    • 平方根:sqrt(x)
    • 指数函数:e(x)
    • 自然对数:l(x)
    • 正弦函数:s(x)
    • 余弦函数:c(x)
    • 正切函数:a(x)
    • 对数函数:l(x)
    • 阶乘函数:factorial(x)
    • 取整函数:floor(x)
    • 绝对值函数:abs(x)
    • 四舍五入函数:scale(n)
  5. 控制结构

    • if 语句:if (condition) { ... } else { ... }
    • for 循环:for (init; condition; update) { ... }
    • while 循环:while (condition) { ... }
  6. 变量和函数

    • 定义变量:var_name = value
    • 自定义函数:define function_name(parameters) { ... }
  7. 位运算

    bc 也支持位运算,包括按位与、按位或、按位异或等位运算操作符。

date & ntpdate 命令

date

date 命令在 Unix 和 Linux 系统中用于显示和设置系统的日期和时间。这个命令可以显示当前的日期和时间,也可以根据用户的需要调整系统的日期和时间。date 命令的基本用法非常简单,仅通过输入 date 就可以查看当前的日期和时间。

1
date

ntpdate

ntpdate 命令用于通过网络时间协议(NTP)设置系统的日期和时间,以便与世界上其他计算机同步。它通常在系统启动时运行,或者在需要手动校正系统时钟时使用。ntpdate 会与一个或多个 NTP 服务器通信,根据这些服务器的时间来设置本地系统时间。这对于需要高精度时间同步的网络服务和应用非常重要。

1
ntpdate [参数] [服务器]

示例:

  1. pool.ntp.org 这个公共 NTP 服务器同步时间:

    1
    sudo ntpdate pool.ntp.org

  2. 使用多个 NTP 服务器:

    1
    sudo ntpdate 0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org

请注意,由于 ntpdate 直接更改系统时间,通常需要超级用户权限来执行,因此在命令前使用sudo

管道表达式

在 Linux Shell 中,管道表达式是一种非常有用的工具,它允许将一个命令的输出直接传递给另一个命令的输入,以便进行数据处理和流水线操作。管道操作符是 |

  1. 基本语法: 管道操作符 | 用于连接两个或多个命令。它的一般语法如下:

    1
    command1 | command2 | command3

    这将使 command1 的输出成为 command2 的输入,而 command2 的输出成为 command3 的输入,依此类推。

  2. 用途: 管道表达式在 Shell 中广泛用于以下情况:

    • 数据筛选:通过将数据传递给 grepawksed 等工具,可以筛选、搜索和处理文本数据。
    • 数据排序:使用 sort 命令对数据进行排序。
    • 数据计算:使用工具如 awkbc 进行数学计算。
    • 数据统计:使用 wc 命令进行行、单词和字符的统计。
    • 数据转换:将数据从一种格式转换为另一种格式,例如将文本数据转换为 CSV 格式。
  3. 示例: 以下是一些使用管道表达式的示例:

    • 使用 ls 列出当前目录的文件,然后使用 grep 过滤文件名中包含 "txt" 的文件名:

      1
      ls | grep "txt"

    • 统计一个文件中的行数、单词数和字符数:

      1
      cat myfile.txt | wc

    • 从一个文本文件中读取数据,然后使用 awk 对数据进行处理:

      1
      cat data.txt | awk '{print $2, $1}' | sort

    • 使用管道连接多个命令以完成一系列复杂的任务。

  4. 错误处理: 管道中的每个命令都运行在自己的子 Shell 中,因此如果其中一个命令失败,管道可能会终止。您可以使用 set -o pipefail 来使管道在任何命令失败时终止整个管道。

    例如:

    1
    2
    set -o pipefail
    command1 | command2 | command3

    这将确保如果 command1command2command3 中的任何一个失败,整个管道将失败。

管道表达式是 Linux Shell 中非常强大和有用的功能,它允许将多个命令组合在一起,以便以更有效的方式处理和操作数据。


Linux Shell 学习笔记
https://goer17.github.io/2023/09/21/Linux Shell 学习笔记/
作者
Captain_Lee
发布于
2023年9月21日
许可协议