本文档涵盖了强大的命令行一键命令和高级命令行技术,可实现高效的文本处理、数据操作和系统管理任务。命令行一键命令代表了 Unix 哲学核心的组合小而专业的工具来解决复杂问题。这些技术对于数据处理、日志分析和系统监控任务尤其有价值。
有关基本的命令行使用,请参阅 命令行基础。有关特定的文件处理技术,请参阅 文件和数据处理。本文重点介绍如何以强大的方式组合命令以及利用鲜为人知但有效的工具。
来源: README.md356-402
一行命令是简洁的命令序列,它使用管道(|)、重定向(>、>>)和其他运算符将多个工具组合起来,在一行中执行复杂操作。它们代表了命令组合的力量——Unix 哲学的一个基本原则。
来源: README.md356-402 README.md235-250
数据处理中最强大的模式之一是使用 sort 和 uniq 对文本文件执行集合操作。这些操作即使在大型文件上也能高效运行,因为排序不受内存限制。
# 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
专用工具使得结构化数据格式的高效处理成为可能
# Compare two normalized JSON files with colored output
diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R
其他用于结构化数据的强大工具包括
jqxmlstarletshyamlcsvkit(包括 in2csv、csvcut、csvjoin、csvgrep)来源: 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 命令对于应用操作到多个项目并控制并行和格式化特别强大。
| 选项 | 描述 | 示例 |
|---|---|---|
-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 | 将输出重定向到文件和 stdout | cmd | 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 中,以便在所有会话中都能使用。
除了标准的 Unix 工具集之外,这些专用工具还能够执行更强大的操作
| 类别 | 工具 | 目的 |
|---|---|---|
| 文本处理 | pandoc、iconv、uconv、fmt | 文档转换、编码转换 |
| 文件操作 | rsync、sponge、split、csplit | 同步、就地编辑、文件分割 |
| 数据分析 | jq、datamash、csvkit | JSON 处理、统计运算、CSV 处理 |
| 网络 | mtr、socat、ngrep、httpie | 网络调试、协议分析、HTTP 交互 |
| 系统监控 | dstat、glances、iotop、nethogs | 资源使用可视化、瓶颈识别 |
| 进程管理 | htop、pstree、pkill、timeout | 进程可视化、信号处理、执行控制 |
为最大化单行命令的效率,请考虑以下最佳实践
export LC_ALL=Cawk,而不是加载整个文件set -e来源:README.md226-228 README.md128-132
虽然大多数单行命令在类 Unix 系统上都可以工作,但有些需要注意兼容性
| 平台 | 注意事项 |
|---|---|
| Linux | 完全支持所有描述的技术 |
| macOS | 命令的 BSD 版本选项不同;如有需要,请通过 Homebrew 安装 GNU 版本 |
| Windows/Cygwin | 对某些命令的支持有限;为获得更好的兼容性,请使用 WSL |
通过掌握单行命令和高级命令行技术,您可以在文本处理、数据操作和系统管理任务中显著提高工作效率。