本文档涵盖了在类Unix环境中用于处理、操作和转换文件及数据的命令行工具和技术。这些工具遵循Unix的哲学,即创建小型、专注的实用工具,这些工具可以以强大的方式组合使用。我们重点关注常见的文件操作、文本处理、结构化数据处理以及不同格式之间的转换。
有关帮助诊断性能问题的系统调试工具,请参阅系统调试。有关将这些工具组合成紧凑的单行命令的高级技术,请参阅单行命令和高级技术。
来源:README.md215
文件和数据处理的命令行工具遵循一种模式:输入源通过各种转换进行处理,结果被定向到输出目的地。大多数工具设计为通过管道协同工作,从而实现复杂的数据处理流程。
命令行提供了几种定位文件的方法,每种方法都针对不同的用例进行了优化
find:根据名称、类型、大小或其他属性在目录层次结构中搜索文件locate:使用预构建的数据库快速按名称查找文件(需要定期运行updatedb)ack、ag(Silver Searcher)和rg(ripgrep),用于高效的代码和内容搜索Unix提供了丰富的工具集,用于转换、过滤和分析文本数据。这些工具可以在管道中组合起来执行复杂的操作。
| 工具 | 主要目的 | 通用选项 | 示例 |
|---|---|---|---|
sort | 对文本行进行排序 | -n(数字)、-h(人类可读)、-r(反向)、-k(键) | sort -k2,2 file.txt |
uniq | 报告或过滤重复的行 | -c(计数)、-d(仅重复项)、-u(仅唯一项) | sort file.txt | uniq -c |
cut | 删除每行的部分 | -d(分隔符)、-f(字段) | cut -d, -f1,3 file.csv |
paste | 合并文件的行 | -d(分隔符) | paste file1 file2 |
join | 在共同字段上连接两个文件的行 | -t(字段分隔符)、-1(file1 字段)、-2(file2 字段) | join -t, -1 2 -2 1 file1 file2 |
wc | 计算行数、单词数、字符数 | -l(行)、-w(单词)、-c(字节)、-m(字符) | wc -l file.txt |
tee | 从标准输入读取并写入标准输出和文件 | -a(追加) | cmd | tee file.txt |
用于更复杂的数据处理任务
sed和awk:强大的流编辑器和模式扫描工具perl:用于复杂文本替换和转换的单行命令datamash:对表格数据进行统计运算处理文本时的关键注意事项
LC_ALL=C应用基于字节的排序以获得更好的性能TZ=Pacific/Fiji date为命令设置特定的环境变量命令行提供了用于在不同数据格式之间进行转换的专用工具
具体的转换工具包括
pandoc:通用文档转换器(Markdown、HTML、docx 等)lynx -dump -stdin:将 HTML 转换为纯文本xmlstarlet:处理 XML 文件jq:JSON 处理(配合 jid 和 jiq 以实现交互式使用)shyaml:YAML 处理csvkit:处理 CSV 文件的工具(in2csv、csvcut、csvjoin 等)iconv 和 uconv:字符编码转换来源:README.md221-232 README.md287-294
用于更改文件名和内容
perl -pi.bak -e 's/old-string/new-string/g' files:原地字符串替换repren:多文件搜索和替换,并可更改文件名rename:批量重命名(因 Linux 发行版而异)用于高效地复制和同步文件
rsync:快速文件复制和同步,本地或远程mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dirpv、pycp、pmonitor、progress、rsync --progress用于分割或合并文件
split:按大小分割文件csplit:根据上下文(模式)分割文件shuf:随机打乱文件中的行或选择随机条目处理二进制数据的工具
hd、hexdump、xxd:创建二进制文件的十六进制转储bvi、hexedit、biew:二进制编辑器strings:从二进制文件中提取文本内容xdelta3:二进制差异工具(增量压缩)用于处理压缩数据
zless、zmore、zcat、zgrep:直接处理压缩文件,无需解压来源:README.md300
用于管理文件属性和权限
chattr:设置特殊文件属性(例如,不可修改标志,使用sudo chattr +i /critical/file)getfacl 和 setfacl:保存和恢复文件权限使用sort和uniq进行文本文件的集合操作
sort a b | uniq > c # c is a union b
sort a b | uniq -d > c # c is a intersect b
sort a b b | uniq -u > c # c is set difference a - b
针对特定列或字段的操作
awk '{ x += $3 } END { print x }' myfile # Sum third column
用于比较带有规范化格式的 JSON 文件
diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R
文件和数据处理工具构成了一个生态系统,其中每个工具都专注于一项特定任务,但都可以与其他工具结合使用,创建强大的数据管道。
在处理文件和数据时,请注意区域设置如何影响操作
LC_ALL=C来实现传统的基于字节的排序顺序和更快的处理速度iconv或uconv(具有增强的 Unicode 支持)TZ=Pacific/Fiji date等环境变量前缀来处理特定时区的操作来源: README.md245-248 README.md287-294
Unix 命令行提供了一套丰富的工具来处理文件和数据。通过管道和重定向组合这些工具,您可以创建强大的数据处理流水线,以满足特定需求。理解这些工具及其交互作用,可以让您在无需复杂编程的情况下,高效地操纵、转换和分析数据。