菜单

单行命令和高级技巧

相关源文件

目的与范围

本文档涵盖了强大的命令行一键命令和高级命令行技术,可实现高效的文本处理、数据操作和系统管理任务。命令行一键命令代表了 Unix 哲学核心的组合小而专业的工具来解决复杂问题。这些技术对于数据处理、日志分析和系统监控任务尤其有价值。

有关基本的命令行使用,请参阅 命令行基础。有关特定的文件处理技术,请参阅 文件和数据处理。本文重点介绍如何以强大的方式组合命令以及利用鲜为人知但有效的工具。

来源: README.md356-402

理解命令行一键命令

一行命令是简洁的命令序列,它使用管道(|)、重定向(>>>)和其他运算符将多个工具组合起来,在一行中执行复杂操作。它们代表了命令组合的力量——Unix 哲学的一个基本原则。

图示:命令行一键命令的结构

来源: README.md356-402 README.md235-250

文本文件的集合操作

数据处理中最强大的模式之一是使用 sortuniq 对文本文件执行集合操作。这些操作即使在大型文件上也能高效运行,因为排序不受内存限制。

# Union (lines in either a or b)
cat a b | sort | uniq > c

# Intersection (lines in both a and b)
cat a b | sort | uniq -d > c

# Difference (lines in a but not in b)
cat a b b | sort | uniq -u > c

请注意,这些操作取决于区域设置。为了获得一致且更快的处理,您可以使用 export LC_ALL=C 来使用基于字节的排序。

来源: README.md360-365

图示:命令行中的集合操作

来源: README.md360-365 README.md226-228

强大的数据处理一键命令

文本文件操作

目的命令 一键命令描述
对列中的值求和awk '{ x += $3 } END { print x }' file.txt对文件中第三列的所有值求和
查看目录树大小find . -type f -ls显示带有大小信息的文件的递归列表
提取并计数模式grep -o 'pattern' file.txt | sort | uniq -c | sort -rn提取模式,计算出现次数,按频率排序
监控文件更改watch -d -n 2 'ls -rtlh | tail'监控目录,每 2 秒更新一次,突出显示更改
快速查看目录内容grep . *显示目录中所有文件的内容,并附带文件名

来源: README.md376-390

JSON 和结构化数据处理

专用工具使得结构化数据格式的高效处理成为可能

# Compare two normalized JSON files with colored output
diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R

其他用于结构化数据的强大工具包括

  • 用于 JSON 的 jq
  • 用于 XML 的 xmlstarlet
  • 用于 YAML 的 shyaml
  • 用于 CSV 文件的 csvkit(包括 in2csvcsvcutcsvjoincsvgrep

来源: README.md367-370 README.md226-232

高级命令组合技术

进程替换

进程替换(<(command))允许将命令输出视为文件,从而能够对本地和远程内容或命令输出之间进行操作。

# Compare local and remote files
diff /etc/hosts <(ssh somehost cat /etc/hosts)

来源: README.md147-150

图示:命令组合模式

来源: README.md147-150 README.md98-105 README.md159-167

高级 xargs 技术

xargs 命令对于应用操作到多个项目并控制并行和格式化特别强大。

选项描述示例
-L为每行命令处理指定数量的项目find . -name "*.log" | xargs -L 1 gzip
-P并行运行多个进程find . -name "*.png" | xargs -P 4 -I{} convert {} {}.jpg
-I{}用输入项替换占位符cat hosts | xargs -I{} ssh root@{} hostname
-0处理空终止输入(用于带空格的文件名)find . -type f -print0 | xargs -0 grep pattern

来源: README.md98-102 README.md125-127

专用文件和文本处理工具

许多专用工具支持那些否则难以实现的复杂操作。

工具目的示例用法
awk模式扫描和文本处理awk '{ x += $3 } END { print x }' file.txt
sed用于文本转换的流编辑器sed -i 's/old/new/g' file.txt
tr字符转换cat file | tr '[:lower:]' '[:upper:]'
cut从行中提取部分cut -d',' -f1,3 file.csv
join关系数据库运算符join -t, file1.csv file2.csv
comm逐行比较排序后的文件comm -12 file1 file2
paste合并文件的行paste -d, file1 file2
tee将输出重定向到文件和 stdoutcmd | tee file.txt | grep pattern

来源: README.md235-250 README.md405-430 README.md360-365

图示:文本处理管道架构

来源: README.md235-250 README.md405-430 README.md360-365

系统分析和调试的一键命令

高级的一键命令对于系统调试和监控尤其有价值。

# Find which process is using a deleted file but still holding disk space
lsof | grep deleted | grep "filename-of-my-big-file"

# Monitor network settings continuously, highlighting changes
watch -d -n 2 ifconfig

# Find most frequently requested URLs in a web server log
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -n 10

# Check disk usage by directory, sorted by size
du -sk * | sort -rn | head

来源:README.md352-354 README.md390-392

创建和使用自定义单行命令

对于经常使用的单行命令,您可以在 shell 配置中创建函数或别名

# Example function to get a random command line tip
function taocl() {
  curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
    sed '/cowsay[.]png/d' |
    pandoc -f markdown -t html |
    xmlstarlet fo --html --dropdtd |
    xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
    xmlstarlet unesc | fmt -80
}

将常用函数保存在您的 .bashrc.bash_profile 中,以便在所有会话中都能使用。

来源:README.md392-402

高级命令行工具

除了标准的 Unix 工具集之外,这些专用工具还能够执行更强大的操作

类别工具目的
文本处理pandociconvuconvfmt文档转换、编码转换
文件操作rsyncspongesplitcsplit同步、就地编辑、文件分割
数据分析jqdatamashcsvkitJSON 处理、统计运算、CSV 处理
网络mtrsocatngrephttpie网络调试、协议分析、HTTP 交互
系统监控dstatglancesiotopnethogs资源使用可视化、瓶颈识别
进程管理htoppstreepkilltimeout进程可视化、信号处理、执行控制

来源:README.md405-550

优化单行命令

为最大化单行命令的效率,请考虑以下最佳实践

  1. 区域设置考虑:对于性能关键的操作,请使用 export LC_ALL=C
  2. 内存使用:对于大文件,请优先使用逐行处理工具,如 awk,而不是加载整个文件
  3. 错误处理:在包含单行命令的脚本中,添加错误检查,使用 set -e
  4. 可重用性:将复杂的单行命令保存为带参数的 shell 函数
  5. 可读性:在复杂的单行命令中使用反斜杠进行行续接

来源:README.md226-228 README.md128-132

跨平台考量

虽然大多数单行命令在类 Unix 系统上都可以工作,但有些需要注意兼容性

平台注意事项
Linux完全支持所有描述的技术
macOS命令的 BSD 版本选项不同;如有需要,请通过 Homebrew 安装 GNU 版本
Windows/Cygwin对某些命令的支持有限;为获得更好的兼容性,请使用 WSL

来源:README.md565-567

通过掌握单行命令和高级命令行技术,您可以在文本处理、数据操作和系统管理任务中显著提高工作效率。