资讯动态

Serenity OS 中 cut 命令的完整指南:按字节、字符与字段裁剪文本行

发布时间:2026/9/10 15:10:51 来源:尧图企业网站定制
Serenity OS 中 cut 命令的完整指南按字节、字符与字段裁剪文本行【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity本指南以 Serenity Operating System 的cut命令手册页Base/usr/share/man/man1/cut.md为主体结合其源码实现 Userland/Utilities/cut.cpp系统讲解该命令的语法、全部选项、范围range语法规则与典型实战用法。读完本文你将掌握在 Serenity OS 的 Shell 中利用cut精准提取文本行中的字节、字符与字段并能理解其在底层是如何解析与合并选择范围的。命令概览从每行文本中切除并输出指定部分cut是一个面向文本行的按列裁剪工具其核心语义是按行读取输入从每一行中选出指定的字节、字符或字段field并输出到标准输出。它不修改原文件只负责选择并打印非常适合配合管道与其他文本处理命令组合使用。与 GNU coreutils 中的cut类似Serenity OS 的实现遵循以下约定如果没有指定文件或指定的文件为-则从标准输入读取选择范围range中的位置编号从 1 开始每一行输出后自动追加换行符。用法与参数Synopsis$ cut option... [file...]Arguments参数说明file要裁剪的文件可指定多个省略或为-时读取标准输入Options选项长选项说明-b list--byteslist只选择指定的字节位置-c list--characterslist只选择指定的字符位置-f list--fieldslist只选择指定的字段同时会打印不包含分隔符的行-d delim--delimiterdelim用delim取代默认的制表符作为字段分隔符-s--only-delimited抑制不打印任何不包含字段分隔符的行说明手册页中列出的是-b、-f、-d、-s四个选项而源码 cut.cpp 中额外注册了-c/--characters选项按字符选择实际使用时同样可用其行为与按字节选择的-b的区别在于对多字节 UTF-8 字符的处理。关键约束来自源码的强制校验在 cut.cpp 的serenity_main中程序启动后会执行如下合法性检查违反任一条件都会输出错误并返回退出码 1必须且只能指定一种选择模式-b、-c、-f三者必须指定其一且不能同时指定多个cut: you must specify a list of bytes, characters, or fields/cut: you must specify only one of bytes, characters, or fields分隔符必须是单个字符cut: the delimiter must be a single character。范围list语法详解-b、-c、-f接受的list参数由逗号分隔的多个范围项组成。范围项的解析逻辑位于expand_list函数cut.cpp支持四种形式形式含义示例N单个位置5表示第 5 个位置N-M闭区间范围含两端2-4表示第 2、3、4 个位置N-从第 N 个位置到行尾3-表示第 3 个位置及其之后-M从第 1 个位置到第 M 个位置-3表示第 1、2、3 个位置多个范围项用逗号连接例如1,3-5,8-。源码会依次做如下处理边界校验位置从 1 开始计数任何位置为 0 的写法都会报错cut: byte/character positions are numbered from 1N-M中N M时报错cut: invalid decreasing range单独的-无端点报错cut: invalid range with no endpoint排序解析出的所有范围按起点m_from升序排列cut.cpp合并重叠区间相邻或相交的范围会被合并为不相交的区间列表disjoint_ranges见 cut.cpp避免同一位置被重复输出。实战示例手册页给出了完整的运行示例以下逐一复现并补充说明。假设example.txt内容如下每行由制表符分隔的 5 个字段组成245:789 4567 M:4540 Admin 01:10:1980 535:763 4987 M:3476 Sales 11:04:1978按字段裁剪-f# 显示第 1 和第 3 个字段默认以制表符分隔 $ cut example.txt -f 1,3 245:789 M:4540 535:763 M:3476从源码process_line_fieldscut.cpp可以看到字段模式的具体行为行按分隔符切分ByteString(line).split(delimiter, SplitBehavior::KeepEmpty)空字段会被保留若整行只切出 1 个字段即不包含分隔符默认会原样输出该行除非指定了-s选中的字段会重新用同一分隔符拼接后输出。自定义分隔符-d# 使用 : 作为分隔符显示第 1 和第 3 个字段 $ cut example.txt -d : -f 1,3 245:4540 Admin 01 535:3476 Sales 11注意此处-d :后每行会被切成245、789 4567 M、4540 Admin、01、10、1980共 6 个字段第 1 和第 3 个字段用:重新拼接输出。字段编号是切分后的编号而不是视觉上第几列这是使用自定义分隔符时最容易踩的坑。按字节裁剪-b# 显示第 5 个字节 $ echo serenity is cool | cut -b 5 necho serenity is cool输出serenity is cool\n第 5 个字节是n。该示例同时演示了cut从标准输入读取数据的用法省略文件名时读取 stdin。按字符裁剪-c当文本包含多字节 UTF-8 字符时-c按字符与-b按字节的结果会不同。源码process_line_characterscut.cpp通过String::from_utf8(line)将输入解码为 Unicode 码点序列再按码点位置输出因此对中文、emoji 等多字节字符能给出符合直觉的结果而-b会按原始 UTF-8 字节逐个输出可能截断字符。进阶用法与行为细节组合使用管道中的文本处理# 提取 /etc/passwd 风格文件中每个用户的用户名第 1 个字段以 : 分隔 $ cut -d : -f 1 /etc/passwd # 从命令输出中取前 3 个字段 $ ls -l | cut -f 1-3多文件与错误处理cut支持一次处理多个文件位置参数可多个见 cut.cpp若某个文件无法打开会输出cut: Could not open file xxx并继续处理其余文件而非整体退出cut.cpp。与 head / cat 的协同cut常与 head(1)、cat(1) 等命令配合cat负责拼接多个文件内容head负责截取行数cut负责截取行内片段。三者组合可以完成从多份日志文件中提取前 N 行的第 M 个字段这类典型的运维文本处理任务。源码位置与构建cut的实现源码位于 Userland/Utilities/cut.cpp其构建集成在 Userland/Utilities/CMakeLists.txt 中该文件被列入CMD_SOURCES第 34 行并作为REQUIRED_TARGETS第 237 行之一随系统默认构建、安装到bin/cut。它基于LibCore::ArgsParser解析命令行参数cut.cpp并使用LibCore::InputBufferedFile以PAGE_SIZE缓冲逐行读取输入cut.cpp保证大文件下也能高效处理。结语Serenity OS 的cut命令虽然小巧但在参数校验、范围解析与区间合并等细节上做工扎实。掌握-b/-c/-f三种选择模式、N/N-M/N-/-M四种范围写法以及-d、-s的配合足以覆盖绝大多数按列裁剪文本的场景让它成为你 Shell 文本处理工具箱中可靠的一环。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价