命令行艺术

jlevy 的头像

·

·

·

14,288 次阅读
curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`w+`' | tr -d '`' | cowsay -W50

流畅地使用命令行是一个常被忽略的技能,或被认为是神秘的奥义。但是,它会以明显而微妙的方式改善你作为工程师的灵活度和生产力。这是我在 Linux 上工作时发现的有用的命令行使用小窍门和笔记的精粹。有些小窍门是很基础的,而有些是相当地特别、复杂、或者晦涩难懂。这篇文章不长,但是如果你可以使用并记得这里的所有内容,那么你就懂得很多了。

其中大部分最初出现Quora上,但是考虑到兴趣所在,似乎更应该放到 Github 上,这里的人比我更能提出改进建议。如果你看到一个错误,或者更好的某种东西,请提交问题或 PR!(当然,提交前请看看必读小节和已有的 PR/Issue。)

必读

范围:

  • 本文是针对初学者和专业人员的,选题目标是覆盖面广(全都很重要)、有针对性(大多数情况下都给出具体实例)而简洁(避免不必要内容以及你能在其它地方轻松找到的离题的内容)。每个小窍门在某种情形下都很必需的,或者能比替代品大大节省时间。
  • 这是为 Linux 写的。绝大部分条目都可以同样应用到 MacOS(或者甚至 Cygwin)。
  • 主要针对交互式 Bash,尽管大多数小窍门也可以应用到其它 shell,以及常规 Bash 脚本。
  • 包括了“标准的”UNIX 命令以及那些需要安装的软件包(它们很重要,值得安装)。

注意:

  • 为了能在一篇文章内展示尽量多的东西,一些具体的信息会被放到引用页里。你可以使用 Google 来获得进一步的内容。(如果需要的话,)你可以使用 apt-get/yum/dnf/pacman/pip/brew 来安装这些新的程序。
  • 使用 Explainshell 来获取命令、参数、管道等内容的解释。

基础

  • 学习基本 Bash 技能。实际上,键入man bash,然后至少浏览一遍所有内容;它很容易理解,没那么长。其它 shell 也不错,但是 Bash 很强大,而且到处都可以找到(如果在你自己的笔记本上学习 zsh、fish 之类,会在很多情形下受到限制,比如使用现存的服务器时)。
  • 至少学好一种基于文本的编辑器。理想的一个是 Vim(vi),因为在终端中编辑时随时都能找到它(即使大多数时候你在使用 Emacs、一个大型的 IDE、或一个现代的时髦编辑器)。
  • 学习怎样使用 man 来阅读文档(好奇的话,用 man man 来列出分区号,比如 1 是常规命令,5 是文件描述,8 用于管理员)。用 apropos 找到帮助页。了解哪些命令不是可执行程序,而是 Bash 内置的,你可以用 helphelp -d 得到帮助。
  • 学习使用 >< 来进行输出和输入重定向,以及使用 | 来管道重定向,学习关于 stdout 和 stderr 的东西。
  • 学习 *(也许还有 ?{} )文件通配扩展和应用,以及双引号 " 和单引号 ' 之间的区别。(更多内容请参看下面关于变量扩展部分)。
  • 熟悉 Bash 作业管理:&ctrl-zctrl-cjobsfgbgkill 等等。
  • 掌握ssh,以及通过 ssh-agentssh-add 等进行无密码验证的基础技能。
  • 基本的文件管理:lsls -l(特别是,知道ls -l各个列的意义),lessheadtailtail -f(或者更好的less +F),lnln -s(知道硬链接和软链接的区别,以及硬链接相对于软链接的优势),chownchmoddu(用于查看磁盘使用率的快速摘要:du -sk *)。文件系统管理:dfmountfdiskmkfslsblk
  • 基本的网络管理: ipifconfigdig
  • 熟知正则表达式,以及各种使用grep/egrep的选项。-i-o-A-B 选项值得掌握。
  • 学会使用 apt-getyumdnfpacman(这取决于你的发行版)来查找并安装软件包。确保你可以用 pip 来安装基于 Python 的命令行工具(下面的一些东西可以很容易地通过 pip 安装)。

日常使用

  • 对于 Web 调试,curlcurl -I 很方便灵活,或者也可以使用它们的同行 wget,或者更现代的 httpie
  • 要了解磁盘、CPU、网络的状态,使用 iostatnetstattop(或更好的 htop)和(特别是)dstat。它们对于快速获知系统中发生的状况很好用。
  • 对于更深层次的系统总览,可以使用 glances。它会在一个终端窗口中为你呈现几个系统层次的统计数据,对于快速检查各个子系统很有帮助。
  • 要了解内存状态,可以运行 freevmstat,看懂它们的输出结果吧。特别是,要知道“cached”值是Linux内核为文件缓存所占有的内存,因此,要有效地统计“free”值。
  • Java 系统调试是一件截然不同的事,但是对于 Oracle 系统以及其它一些 JVM 而言,不过是一个简单的小把戏,你可以运行 kill -3 <pid>,然后一个完整的堆栈追踪和内存堆的摘要(包括常规的垃圾收集细节,这很有用)将被转储到stderr/logs。
  • 使用 mtr 作路由追踪更好,可以识别网络问题。
  • 对于查看磁盘满载的原因,ncdu 会比常规命令如 du -sh * 更节省时间。
  • 要查找占用带宽的套接字和进程,试试 iftopnethogs 吧。
  • (Apache附带的)ab工具对于临时应急检查网络服务器性能很有帮助。对于更复杂的负载测试,可以试试 siege
  • 对于更仔细的网络调试,可以用 wiresharktsharkngrep
  • 掌握 straceltrace。如果某个程序失败、挂起或崩溃,而你又不知道原因,或者如果你想要获得性能的大概信息,这些工具会很有帮助。注意,分析选项(-c)和使用 -p 关联运行进程。
  • 掌握 ldd 来查看共享库等。
  • 知道如何使用 gdb 来连接到一个运行着的进程并获取其堆栈追踪信息。
  • 使用 /proc。当调试当前的问题时,它有时候出奇地有帮助。样例:/proc/cpuinfo/proc/xxx/cwd/proc/xxx/exe/proc/xxx/fd//proc/xxx/smaps
  • 当调试过去某个东西为何出错时,sar 会非常有帮助。它显示了 CPU、内存、网络等的历史统计数据。
  • 对于更深层的系统和性能分析,看看 stap (SystemTap),perfsysdig 吧。
  • 确认是正在使用的 Linux 发行版版本(支持大多数发行版):lsb_release -a
  • 每当某个东西的行为异常时(可能是硬件或者驱动器问题),使用dmesg

单行程序

  • expr:实施算术或布林操作,或者求正则表达式的值
  • m4:简单的宏处理器
  • yes:大量打印一个字符串
  • cal:漂亮的日历
  • env:(以特定的环境变量设置)运行一个命令(脚本中很有用)
  • look:查找以某个字符串开头的英文单词(或文件中的行)
  • cutpaste 以及 join:数据处理
  • fmt:格式化文本段落
  • pr:格式化文本为页/列
  • fold:文本折行
  • column:格式化文本为列或表
  • expandunexpand:在制表符和空格间转换
  • nl:添加行号
  • seq:打印数字
  • bc:计算器
  • factor:分解质因子
  • gpg:加密并为文件签名
  • toe:terminfo 条目表
  • nc:网络调试和数据传输
  • socat:套接字中继和 tcp 端口转发(类似 netcat
  • slurm:网络流量可视化
  • dd:在文件或设备间移动数据
  • file:识别文件类型
  • tree:以树形显示目录及子目录;类似 ls,但是是递归的。
  • stat:文件信息
  • tac:逆序打印文件
  • shuf:从文件中随机选择行
  • comm:逐行对比分类排序的文件
  • hdbvi:转储或编辑二进制文件
  • strings:从二进制文件提取文本
  • tr:字符转译或处理
  • iconvuconv:文本编码转换
  • splitcsplit:分割文件
  • units:单位转换和计算;将每双周(fortnigh)一浪(浪,furlong,长度单位,约201米)转换为每瞬(blink)一缇(缇,twip,一种和屏幕无关的长度单位)(参见: /usr/share/units/definitions.units)(LCTT 译注:这都是神马单位啊!)
  • 7z:高比率文件压缩
  • ldd:动态库信息
  • nm:目标文件的符号
  • ab:Web 服务器基准测试
  • strace:系统调用调试
  • mtr:用于网络调试的更好的路由追踪软件
  • cssh:可视化并发 shell
  • rsync:通过 SSH 同步文件和文件夹
  • wiresharktshark:抓包和网络调试
  • ngrep:从网络层摘取信息
  • hostdig:DNS查询
  • lsof:处理文件描述符和套接字信息
  • dstat:有用的系统统计数据
  • glances:高级,多个子系统概览
  • iostat:CPU和磁盘使用率统计
  • htop:top的改进版
  • last:登录历史
  • w:谁登录进来了
  • id:用户/组身份信息
  • sar:历史系统统计数据
  • iftopnethogs:按套接口或进程的网络使用率
  • ss:套接口统计数据
  • dmesg:启动和系统错误信息
  • hdparm:SATA/ATA 磁盘操作/改善性能
  • lsb_release:Linux 发行版信息
  • lsblk:列出块设备,以树形展示你的磁盘和分区
  • lshw:硬件信息
  • fortuneddatesl:嗯,好吧,它取决于你是否认为蒸汽机车和 Zippy 引用“有用”

更多资源

除了非常小的任务外,其它都写出了代码供大家阅读。伴随力量而来的是责任。事实是,你在Bash中做的,并不意味着是你所应该做的!;)


via: https://github.com/jlevy/the-art-of-command-line

作者:jlevy 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

2 条回复

  1. Shadow-華 的头像
    Shadow-華

    赞。。。

    来自武威
  2. 浩浩君 的头像
    浩浩君

    没看完

    来自南昌

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注