the-art-of-command-line - 一页掌握命令行

Created at: 2015-05-20 23:11:03
Language:

🌍 ČeštinaDeutschΕλληνικάEnglishEspañolFrançaisIndonesiaItaliano日本語한국어polskiPortuguêsRomânăРусскийSlovenščinaУкраїнська简体中文 ∙ 繁體中文

命令行的艺术

注意:我计划对此进行修改,并寻找新的合著者来帮助将其扩展为更全面的指南。虽然它非常受欢迎,但它可能更广泛、更深入。如果你喜欢写作并且接近成为该材料的专家并愿意考虑提供帮助,请给我留言至 josh (0x40) holloway.com。–jlevy霍洛威。谢谢!

卷曲 -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' |egrep -o '\w+' |tr -d ''' |牛赛-W50

命令行的流畅性是一项经常被忽视或被认为是晦涩难懂的技能,但它以明显和微妙的方式提高了你作为工程师的灵活性和生产力。以下是有关使用命令行的注释和提示,我们发现这些注释和提示在 Linux 上工作时很有用。有些技巧是基本的,有些是相当具体、复杂或晦涩的。这个页面不长,但如果你能使用和回忆这里的所有项目,你就会知道很多。

这项工作是许多作者和翻译家的成果。 其中一些最初出现在Quora上, 但后来它搬到了 GitHub,在那里,比原作者更有才华的人做出了许多改进。如果你有与命令行相关的问题,请提交问题。如果你看到错误或可能更好的东西,请做出贡献

范围:

  • 本指南适用于初学者和有经验的用户。目标是广度(所有重要的东西)、具体性(给出最常见情况的具体例子)和简洁(避免不必要的事情或你可以在其他地方轻松查找的题外话)。在某些情况下,每个提示都是必不可少的,或者比其他提示显着节省时间。
  • 这是为 Linux 编写的,但“仅限 macOS”和“仅限 Windows”部分除外。许多其他项目适用于或可以安装在其他 Unices 或 macOS(甚至 Cygwin)上。
  • 重点是交互式 Bash,尽管许多技巧适用于其他 shell 和一般的 Bash 脚本。
  • 它既包括“标准”Unix 命令,也包括需要特殊软件包安装的命令——只要它们足够重要,值得包含。

笔记:

  • 为了将其保留在一个页面上,内容通过引用隐式包含。你足够聪明,一旦你知道这个想法或命令给谷歌,你就可以在其他地方查找更多细节。使用 、 、 、 或(视情况而定)安装新程序。
    apt
    yum
    dnf
    pacman
    pip
    brew
  • 使用 Explainshell 可以对命令、选项、管道等功能进行有用的细分。

基本

  • 学习基本的 Bash。实际上,输入并至少浏览整个内容;它很容易遵循,而且不会那么长。备用 shell 可能很好,但 Bash 功能强大且始终可用(学习 zsh、fish 等,虽然在你自己的笔记本电脑上很诱人,但在许多情况下会限制你,例如使用现有服务器)。

    man bash

  • 至少学好一个基于文本的编辑器。编辑器是基本编辑(打开、编辑、保存、搜索)最简单的编辑器之一。然而,对于文本终端的高级用户来说,Vim () 是无可替代的,Vim () 是一个难以学习但令人尊敬、快速且功能齐全的编辑器。许多人也使用经典的 Emacs,特别是对于较大的编辑任务。(当然,任何从事大型项目的现代软件开发人员都不太可能只使用纯基于文本的编辑器,并且还应该熟悉现代图形 IDE 和工具。

    nano
    vi

  • 查找文档:

    • 知道如何阅读官方文档(对于好奇者,列出部分编号,例如 1 是“常规”命令,5 是文件/约定,8 是管理)。查找包含 的手册页。
      man
      man man
      apropos
    • 要知道,有些命令不是可执行文件,而是 Bash 内置的,你可以通过 和 获得有关它们的帮助。你可以使用 找出命令是可执行文件、shell 内置命令还是别名。
      help
      help -d
      type command
    • curl cheat.sh/command
      将给出一个简短的“备忘单”,其中包含如何使用 shell 命令的常见示例。
  • 了解如何使用 和 以及管道使用 重定向输出和输入。Know 覆盖输出文件并追加。了解 stdout 和 stderr。

    >
    <
    |
    >
    >>

  • 了解 file glob 扩展(也许还有 ...)和引号,以及双引号和单引号之间的区别。(请参阅下面的有关变量扩展的更多信息。

    *
    ?
    [
    ]
    "
    '

  • 熟悉 Bash 作业管理:、ctrl-z、ctrl-c、、、、、等。

    &
    jobs
    fg
    bg
    kill

  • 了解 和 无密码身份验证的基础知识,通过 、 等。

    ssh
    ssh-agent
    ssh-add

  • 基本文件管理:和(特别是了解每一列的含义)、、、和(甚至更好的是,)、和(了解硬链接与软链接的区别和优点)、、、(有关磁盘使用情况的快速摘要:)。对于文件系统管理,、 、 、 、 。了解 inode 是什么 ( 或 )。

    ls
    ls -l
    ls -l
    less
    head
    tail
    tail -f
    less +F
    ln
    ln -s
    chown
    chmod
    du
    du -hs *
    df
    mount
    fdisk
    mkfs
    lsblk
    ls -i
    df -i

  • 基本网络管理:或 、 、 、 。

    ip
    ifconfig
    dig
    traceroute
    route

  • 学习和使用版本控制管理系统,例如 .

    git

  • 熟悉正则表达式,以及 / 的各种标志。、 、 、 和 选项值得了解。

    grep
    egrep
    -i
    -o
    -v
    -A
    -B
    -C

  • 了解如何使用 、 或 (取决于发行版) 来查找和安装软件包。并确保你必须安装基于 Python 的命令行工具(以下几个最容易通过 安装)。

    apt-get
    yum
    dnf
    pacman
    pip
    pip

日常使用

  • 在 Bash 中,使用 Tab 完成参数或列出所有可用命令,使用 ctrl-r 搜索命令历史记录(按下后,键入搜索,反复按 ctrl-r 循环浏览更多匹配项,按 Enter 执行找到的命令,或按向右箭头将结果放在当前行中以允许编辑)。

  • 在 Bash 中,使用 ctrl-w 删除最后一个单词,使用 ctrl-u 将当前光标中的内容删除回行首。使用 alt-b 和 alt-f 按字移动,ctrl-a 将光标移动到行首,ctrl-e 将光标移动到行尾,ctrl-k 终止到行尾,ctrl-l 清除屏幕。 请参阅 Bash 中的所有默认键绑定。有很多。例如,alt-. 循环显示前面的参数,而 alt-* 则扩展一个 glob。

    man readline

  • 或者,如果你喜欢 vi 样式的键绑定,请使用(并将其放回原处)。

    set -o vi
    set -o emacs

  • 对于编辑长命令,在设置编辑器(例如)后,ctrl-x ctrl-e 将在编辑器中打开当前命令进行多行编辑。或者以 vi 风格,escape-v

    export EDITOR=vim

  • 要查看最近的命令,请使用 。跟随(命令编号在哪里)再次执行。你还可以使用许多缩写,最有用的可能是用于最后一个参数和最后一个命令(请参见手册页中的“HISTORY EXPANSION”)。但是,这些通常很容易替换为 ctrl-ralt-.

    history
    !n
    n
    !$
    !!

  • 使用 转到你的主目录。使用前缀访问相对于主目录的文件(例如 )。在脚本中,将主目录称为 。

    cd
    ~
    ~/.bashrc
    sh
    $HOME

  • 要返回上一个工作目录,请执行以下操作: .

    cd -

  • 如果你在输入命令的中途改变了主意,请按 alt-# 在开头添加 a 并将其作为注释输入(或使用 ctrl-a#enter)。然后,你可以稍后通过命令历史记录返回到它。

    #

  • 使用 (或 )。它非常强大。请注意,你可以控制每行执行的项目数 () 以及并行度 ()。如果你不确定它是否能做正确的事情,请先使用。另外,很方便。例子:

    xargs
    parallel
    -L
    -P
    xargs echo
    -I{}

      find . -name '*.py' | xargs grep some_function
      cat hosts | xargs -I{} ssh root@{} hostname
  • pstree -p
    是进程树的有用显示。

  • 使用 和 按名称查找或发出信号进程(很有帮助)。

    pgrep
    pkill
    -f

  • 了解你可以发送进程的各种信号。例如,要挂起进程,请使用 。有关完整列表,请参阅

    kill -STOP [pid]
    man 7 signal

  • 如果希望后台进程永远保持运行,请使用 OR。

    nohup
    disown

  • 检查哪些进程正在通过 or 侦听(对于 TCP;对于 UDP 添加)或(这也适用于 macOS)。

    netstat -lntp
    ss -plat
    -u
    lsof -iTCP -sTCP:LISTEN -P -n

  • 另请参阅 和 打开的套接字和文件。

    lsof
    fuser

  • 查看或了解系统运行了多长时间。

    uptime
    w

  • 用于为常用命令创建快捷方式。例如,创建一个新的别名 。

    alias
    alias ll='ls -latr'
    ll

  • 保存你常用的别名、shell 设置和函数,并安排登录 shell 来获取它。这将使你的设置在所有 shell 会话中都可用。

    ~/.bashrc

  • 将环境变量的设置以及登录时应执行的命令放入 .对于从图形环境登录和作业启动的 shell,需要单独的配置。

    ~/.bash_profile
    cron

  • 同步你的配置文件(例如 和 ) 在具有 Git 的各种计算机之间。

    .bashrc
    .bash_profile

  • 了解当变量和文件名包含空格时需要小心。用引号将 Bash 变量括起来,例如 .首选 or 选项以启用空字符来分隔文件名,例如 或。要循环访问 for 循环中包含空格的文件名,请仅使用 将 IFS 设置为换行符。

    "$FOO"
    -0
    -print0
    locate -0 pattern | xargs -0 ls -al
    find / -print0 -type d | xargs -0 ls -al
    IFS=$'\n'

  • 在 Bash 脚本中,使用(或记录原始输入的变体,包括未展开的变量和注释)来调试输出。使用严格模式,除非你有充分的理由不这样做: 用于在错误时中止(非零退出代码)。用于检测未设置的变量用法。也要考虑中止管道中的错误(但如果你这样做,请多读一读,因为这个话题有点微妙)。对于更复杂的脚本,也可以在 EXIT 或 ERR 上使用。一个有用的习惯是启动这样的脚本,这将使它检测并中止常见错误并打印一条消息:

    set -x
    set -v
    set -e
    set -u
    set -o pipefail
    trap

      set -euo pipefail
      trap "echo 'error: Script failed: see failed command above'" ERR
  • 在 Bash 脚本中,子 shell(用括号书写)是对命令进行分组的便捷方式。一个常见的例子是临时移动到不同的工作目录,例如
      # do something in current dir
      (cd /some/other/dir && other-command)
      # continue in original dir
  • 请注意,在 Bash 中,有很多种变量扩展。检查变量是否存在: .例如,如果 Bash 脚本需要单个参数,只需编写 .如果变量为空,则使用默认值:。如果要在上一个示例中添加其他(可选)参数,可以使用类似 .如果省略,因此为空,则设置为 。算术展开:.序列:。字符串的修剪:和 .例如,如果 ,则打印 。

    ${name:?error message}
    input_file=${1:?usage: $0 input_file}
    ${name:-default}
    output_file=${2:-logfile}
    $2
    output_file
    logfile
    i=$(( (i + 1) % 5 ))
    {1..10}
    ${var%suffix}
    ${var#prefix}
    var=foo.pdf
    echo ${var%.pdf}.txt
    foo.txt

  • 使用...可以减少重新键入相似文本和自动组合项目的必要性。这在(移动两个文件)、(扩展为 )或(扩展所有可能的组合并创建目录树)等示例中很有用。在任何其他扩展之前执行支具扩张。

    {
    }
    mv foo.{txt,pdf} some-dir
    cp somefile{,.bak}
    cp somefile somefile.bak
    mkdir -p test-{a,b,c}/subtest-{1,2,3}

  • 扩展的顺序为:大括号扩展;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);拆词;和文件名扩展。(例如,不能用变量来表示 这样的范围。请改用 或 循环,例如 or 。

    {1..20}
    {$a..$b}
    seq
    for
    seq $a $b
    for((i=a; i<=b; i++)); do ... ; done

  • 命令的输出可以像文件一样处理(称为进程替换)。例如,将本地与远程进行比较:

    <(some command)
    /etc/hosts

      diff /etc/hosts <(ssh somehost cat /etc/hosts)
  • 编写脚本时,你可能希望将所有代码放在大括号中。如果缺少右大括号,则脚本将因语法错误而无法执行。当你的脚本要从 Web 下载时,这很有意义,因为它可以防止部分下载的脚本执行:
{
      # Your code here
}
  • “here 文档”允许重定向多行输入,就像从文件重定向一样:
cat <<EOF
input
on multiple lines
EOF
  • 在 Bash 中,通过以下方式重定向标准输出和标准错误: 或 .通常,为了确保命令不会将打开的文件句柄留给标准输入,将其绑定到你所在的终端,添加 .

    some-command >logfile 2>&1
    some-command &>logfile
    </dev/null

  • 用于具有十六进制和十进制值的良好 ASCII 表。对于常规编码信息,、 和 很有帮助。

    man ascii
    man unicode
    man utf-8
    man latin1

  • 使用 或 tmux 对屏幕进行多路复用,这在远程 ssh 会话以及分离和重新连接到会话时特别有用。 可以通过提供更多信息和更轻松的管理来增强屏幕或 TMUX。仅会话持久性的更次要的替代方法是 dtach

    screen
    byobu

  • 在 ssh 中,知道如何使用 or (偶尔)进行隧道移植很有用,例如从远程服务器访问网站。

    -L
    -D
    -R

  • 对 ssh 配置进行一些优化可能很有用;例如,这包含一些设置,以避免在某些网络环境中断开连接,使用压缩(这对于通过低带宽连接的 SCP 很有帮助),以及使用本地控制文件将多路复用通道连接到同一服务器:

    ~/.ssh/config

      TCPKeepAlive=yes
      ServerAliveInterval=15
      ServerAliveCountMax=6
      Compression=yes
      ControlMaster auto
      ControlPath /tmp/%r@%h:%p
      ControlPersist yes
  • 与 ssh 相关的其他一些选项对安全敏感,应谨慎启用,例如,每个子网或主机或在受信任的网络中启用: ,

    StrictHostKeyChecking=no
    ForwardAgent=yes

  • 考虑将 mosh 视为使用 UDP 的 ssh 的替代方案,避免断开连接并增加旅途中的便利性(需要服务器端设置)。

  • 要获取对八进制形式的文件的权限,这对于系统配置很有用,但不可用且易于混淆,请使用类似

    ls

      stat -c '%A %a %n' /etc/timezone
  • 要从另一个命令的输出中以交互方式选择值,请使用 percolfzf

  • 若要根据另一个命令(如 )的输出与文件进行交互,请使用 (PathPicker)。

    git
    fpp

  • 对于当前目录(和子目录)中所有文件的简单 Web 服务器,可供网络上的任何人使用,请使用:(对于端口 7777 和 Python 2)和(对于端口 7777 和 Python 3)。

    python -m SimpleHTTPServer 7777
    python -m http.server 7777

  • 要以其他用户身份运行命令,请使用 。默认以 root 身份运行;用于指定其他用户。用于以该用户身份登录(系统将要求你输入密码)。

    sudo
    -u
    -i

  • 要将 shell 切换到其他用户,请使用 或 。后者带有“-”,获得一个环境,就好像另一个用户刚刚登录一样。省略用户名默认为 root。系统将要求你输入要切换到的用户的密码。

    su username
    su - username

  • 了解命令行的 128K 限制。当通配符匹配大量文件时,此“参数列表太长”错误很常见。(当这种情况发生时,替代方案可能会有所帮助。

    find
    xargs

  • 对于基本的计算器(当然还有对 Python 的一般访问),请使用解释器。例如

    python

>>> 2+3
5

处理文件和数据

  • 在当前目录(或类似目录)中按名称查找文件。若要按名称在任意位置查找文件,请使用(但请记住,可能没有为最近创建的文件编制索引)。

    find . -iname '*something*'
    locate something
    updatedb

  • 对于通过源文件或数据文件进行常规搜索,有几个选项比 更高级或更快,包括(按从旧到新的粗略顺序)ackag(“银色搜索器”)和 rg (ripgrep)。

    grep -r

  • 要将 HTML 转换为文本:

    lynx -dump -stdin

  • 对于 Markdown、HTML 和各种文档转换,请尝试 pandoc。例如,要将 Markdown 文档转换为 Word 格式,请执行以下操作:

    pandoc README.md --from markdown --to docx -o temp.docx

  • 如果你必须处理XML,是旧的,但很好。

    xmlstarlet

  • 对于 JSON,请使用 jq。对于交互式使用,另请参阅 jidjiq

  • 对于 YAML,请使用 shyaml

  • 对于 Excel 或 CSV 文件,csvkit 提供 、 、 等。

    in2csv
    csvcut
    csvjoin
    csvgrep

  • 对于 Amazon S3,s3cmd 更方便,而 s4cmd 更快。 Amazon 的 aws 和改进的锯对于其他与 AWS 相关的任务至关重要。

  • 了解 和 ,包括 uniq 和 options -- 请参阅下面的单行代码。另请参见。

    sort
    uniq
    -u
    -d
    comm

  • 了解 、 和操作文本文件。许多人使用但忘记了.

    cut
    paste
    join
    cut
    join

  • 了解如何计算换行符 ()、字符 ()、单词 () 和字节 ()。

    wc
    -l
    -m
    -w
    -c

  • 了解如何从 stdin 复制到文件以及 stdout,如 .

    tee
    ls -al | tee file.txt

  • 对于更复杂的计算,包括分组、反转字段和统计计算,请考虑 datamash

  • 要知道,区域设置会以微妙的方式影响许多命令行工具,包括排序顺序(排序规则)和性能。大多数 Linux 安装会将 or 其他语言环境变量设置为本地设置,如美国英语。但请注意,如果更改区域设置,排序将发生变化。并且知道 i18n 例程可以使 sort 或其他命令的运行速度慢很多倍。在某些情况下(例如下面的集合运算或唯一性运算),你可以放心地完全忽略慢速 i18n 例程,并使用传统的基于字节的排序顺序,使用 .

    LANG
    export LC_ALL=C

  • 你可以通过在调用调用前加上环境变量设置来设置特定命令的环境,如 中所示。

    TZ=Pacific/Fiji date

  • 了解基本和简单的数据整理。有关示例,请参阅单行代码

    awk
    sed

  • 要替换一个或多个文件中出现的所有字符串,请执行以下操作:

      perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
  • 要重命名多个文件和/或在文件中搜索和替换,请尝试 repren。(在某些情况下,该命令还允许多次重命名,但要小心,因为它的功能在所有 Linux 发行版上都不相同。
    rename
      # Full rename of filenames, directories, and contents foo -> bar:
      repren --full --preserve-case --from foo --to bar .
      # Recover backup files whatever.bak -> whatever:
      repren --renames --from '(.*)\.bak' --to '\1' *.bak
      # Same as above, using rename, if available:
      rename 's/\.bak$//' *.bak
  • 正如手册页所说,确实是一个快速且非常通用的文件复制工具。它以在计算机之间同步而闻名,但在本地同样有用。当安全限制允许时,使用“而不是”允许在不从头开始重新启动的情况下恢复传输。它也是删除大量文件的最快方法之一:
    rsync
    rsync
    scp
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
  • 若要在处理文件时监视进度,请使用 pvpycppmonitorprogress、 或 对于块级复制,请使用 。

    rsync --progress
    dd status=progress

  • 用于随机播放或从文件中选择随机行。

    shuf

  • 知道的选项。对于数字,请使用 ,或用于处理人类可读的数字(例如,from )。了解按键的工作原理 ( 和 )。特别要注意的是,你需要仅按第一个字段进行排序; 表示按整行排序。稳定排序 () 可能很有用。例如,要先按字段 2 排序,然后再按字段 1 排序,可以使用 。

    sort
    -n
    -h
    du -h
    -t
    -k
    -k1,1
    -k1
    sort -s
    sort -k1,1 | sort -s -k2,2

  • 如果你需要在 Bash 的命令行中编写制表符文字(例如,用于对 -t 参数进行排序),请按 ctrl-v [Tab] 或写入(后者更好,因为你可以复制/粘贴它)。

    $'\t'

  • 修补源代码的标准工具是 和 。另请参阅差异的汇总统计信息和并排差异。Note 适用于整个目录。用于更改摘要。用于比较和编辑文件。

    diff
    patch
    diffstat
    sdiff
    diff -r
    diff -r tree1 tree2 | diffstat
    vimdiff

  • 对于二进制文件,请使用 ,或用于简单的十六进制转储,或者用于二进制编辑。

    hd
    hexdump
    xxd
    bvi
    hexedit
    biew

  • 同样对于二进制文件,(加号等)可以让你查找文本位。

    strings
    grep

  • 对于二进制差异(增量压缩),请使用 。

    xdelta3

  • 要转换文本编码,请尝试 。或用于更高级的用途;它支持一些高级Unicode的东西。例如:

    iconv
    uconv

      # Displays hex codes or actual names of characters (useful for debugging):
      uconv -f utf-8 -t utf-8 -x '::Any-Hex;' < input.txt
      uconv -f utf-8 -t utf-8 -x '::Any-Name;' < input.txt
      # Lowercase and removes all accents (by expanding and dropping them):
      uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC;' < input.txt > output.txt
  • 若要将文件拆分为多个部分,请参阅(按大小拆分)和(按模式拆分)。

    split
    csplit

  • 日期和时间:要以有用的 ISO 8601 格式获取当前日期和时间,请使用(其他选项问题)。要操作日期和时间表达式,请使用 dateutils 中的 、 等。

    date -u +"%Y-%m-%dT%H:%M:%SZ"
    dateadd
    datediff
    strptime

  • 使用 、 、 和 对压缩文件进行操作。

    zless
    zmore
    zcat
    zgrep

  • 文件属性可通过以下方式设置,并提供文件权限的较低级别替代方案。例如,为了防止意外删除文件,不可变标志:

    chattr
    sudo chattr +i /critical/directory/or/file

  • 使用 和 保存和恢复文件权限。例如:

    getfacl
    setfacl

   getfacl -R /some/path > permissions.txt
   setfacl --restore=permissions.txt
  • 要快速创建空文件,请使用(创建稀疏文件)、(ext4、xfs、btrfs 和 ocfs2 文件系统)、(几乎任何文件系统,都包含在 xfsprogs 包中)、(适用于类 Unix 系统,如 Solaris、Mac OS)。
    truncate
    fallocate
    xfs_mkfile
    mkfile

系统调试

  • 用于 Web 调试,并且很方便,或它们的等价物,或更现代的 httpie

    curl
    curl -I
    wget

  • 要了解当前的 cpu/磁盘状态,经典工具是(或更好的)、和 。用于基本 CPU 和详细的每分区磁盘统计信息和性能见解。

    top
    htop
    iostat
    iotop
    iostat -mxz 15

  • 有关网络连接的详细信息,请使用 和 。

    netstat
    ss

  • 对于系统上发生的情况的快速概述,特别有用。要获得最广泛的详细信息概述,请使用 glances

    dstat

  • 要了解内存状态,请运行并了解 和 的输出。特别要注意的是,“cached”值是 Linux 内核作为文件缓存保存的内存,因此有效地计入“free”值。

    free
    vmstat

  • Java 系统调试是另一回事,但 Oracle 和其他一些 JVM 的一个简单的技巧是,你可以运行完整的堆栈跟踪和堆摘要(包括生成垃圾回收详细信息,这些信息量很大)将被转储到 stderr/logs。JDK 的 、 、 很有用。SJK 工具更先进。

    kill -3 <pid>
    jps
    jstat
    jstack
    jmap

  • 使用 mtr 作为更好的跟踪路由,以识别网络问题。

  • 为了查看磁盘已满的原因,ncdu 比 .

    du -sh *

  • 要查找哪个套接字或进程正在使用带宽,请尝试 iftopnethogs

  • 该工具(Apache自带)有助于快速检查Web服务器性能。对于更复杂的负载测试,请尝试 。

    ab
    siege

  • 对于更严重的网络调试,wiresharktsharkngrep

  • 了解 和 .如果程序出现故障、挂起或崩溃,并且你不知道原因,或者你想大致了解性能,这些方法会很有帮助。请注意分析选项 () 和附加到正在运行的进程的功能 ()。使用跟踪子选项 () 以避免错过重要呼叫。

    strace
    ltrace
    -c
    -p
    -f

  • 了解如何检查共享库等,但切勿在不受信任的文件上运行它

    ldd

  • 了解如何连接到正在运行的进程并获取其堆栈跟踪。

    gdb

  • 用。有时在调试实时问题时,它非常有用。示例:、(其中是进程 ID 或 pid)。

    /proc
    /proc/cpuinfo
    /proc/meminfo
    /proc/cmdline
    /proc/xxx/cwd
    /proc/xxx/exe
    /proc/xxx/fd/
    /proc/xxx/smaps
    xxx

  • 在调试过去出现问题的原因时,sar 会非常有帮助。它显示 CPU、内存、网络等的历史统计数据。

  • 有关更深入的系统和性能分析,请查看 (SystemTap)、perfsysdig

    stap

  • 检查你使用的操作系统或(常规 Unix/内核信息)或(Linux 发行版信息)。

    uname
    uname -a
    lsb_release -a

  • 每当某些事情表现得非常有趣时(可能是硬件或驱动程序问题)就使用。

    dmesg

  • 如果删除文件,但该文件未释放预期的磁盘空间,如 报告的那样,请检查该文件是否正在被进程使用:

    du
    lsof | grep deleted | grep "filename-of-my-big-file"

单行

拼凑命令的几个示例:

  • 有时你可以通过 / 设置文本文件的交集、并集和差异,这非常有帮助。假设 和 是已经唯一的文本文件。这速度很快,适用于任意大小的文件,最大可达数千兆字节。(排序不受内存限制,但你可能需要使用 if is on a small root partition 选项。另请参阅上面关于 和 的选项的注释(为了清楚起见,下面省略了)。
    sort
    uniq
    a
    b
    -T
    /tmp
    LC_ALL
    sort
    -u
      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
  • 漂亮地打印两个 JSON 文件,规范化它们的语法,然后对结果进行着色和分页:
      diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R
  • 用于快速检查目录中所有文件的内容(因此每行都与文件名配对),或者(因此每个文件都有一个标题)。这对于填充了配置设置的目录很有用,例如 、 。

    grep . *
    head -100 *
    /sys
    /proc
    /etc

  • 将文本文件第三列中的所有数字相加(这可能比同等的 Python 快 3 倍,代码少 3 倍):

      awk '{ x += $3 } END { print x }' myfile
  • 要查看文件树上的大小/日期,这类似于递归,但比以下更易于阅读:
    ls -l
    ls -lR
      find . -type f -ls
  • 假设你有一个文本文件(如 Web 服务器日志)和某些行上显示的某个值,例如 URL 中存在的参数。如果你想统计每个请求的数量:
    acct_id
    acct_id
      egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
  • 要持续监控更改,请使用 ,例如,在使用 .

    watch
    watch -d -n 2 'ls -rtlh | tail'
    watch -d -n 2 ifconfig

  • 运行此函数可从此文档中获取随机提示(解析 Markdown 并提取项目):

      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 | iconv -t US
      }

晦涩难懂但有用

  • expr
    :执行算术或布尔运算或计算正则表达式

  • m4
    : 简单的宏处理器

  • yes
    :大量打印字符串

  • cal
    : 漂亮的日历

  • env
    :运行命令(在脚本中很有用)

  • printenv
    :打印环境变量(在调试和脚本中很有用)

  • look
    :查找以字符串开头的英语单词(或文件中的行)

  • cut
    和 : 数据操作
    paste
    join

  • fmt
    :设置文本段落的格式

  • pr
    :将文本格式化为页面/列

  • fold
    :换行文本

  • column
    :将文本字段格式化为对齐的固定宽度列或表格

  • expand
    和 :在制表符和空格之间转换
    unexpand

  • nl
    :添加行号

  • seq
    :打印数字

  • bc
    :计算器

  • factor
    :因子整数

  • GPG:加密和签名文件

  • toe
    :terminfo 条目表

  • nc
    :网络调试和数据传输

  • socat
    :套接字中继和 TCP 端口转发器(类似于
    netcat
    )

  • SLURM:网络流量可视化

  • dd
    :在文件或设备之间移动数据

  • file
    :识别文件类型

  • tree
    :将目录和子目录显示为嵌套树;喜欢但递归
    ls

  • stat
    : 文件信息

  • time
    :执行命令并计时

  • timeout
    :在指定的时间内执行命令,并在指定的时间完成时停止该进程。

  • lockfile
    :创建只能通过以下方式删除的信号量文件
    rm -f

  • logrotate
    :旋转、压缩和邮寄日志。

  • watch
    :重复运行命令,显示结果和/或突出显示更改

  • when-changed:每当看到文件已更改时,都会运行你指定的任何命令。也看。

    inotifywait
    entr

  • tac
    :反向打印文件

  • comm
    :逐行比较排序的文件

  • strings
    :从二进制文件中提取文本

  • tr
    :字符翻译或操作

  • iconv
    或:文本编码的转换
    uconv

  • split
    和 : 拆分文件
    csplit

  • sponge
    :在写入之前读取所有输入,对于读取然后写入同一文件很有用,例如,
    grep -v something some-file | sponge some-file

  • units
    :单位换算和计算;将每两周的弗隆数转换为每眨眼的敷数(另请参阅
    /usr/share/units/definitions.units
    )

  • apg
    :生成随机密码

  • xz
    :高比率文件压缩

  • ldd
    :动态库信息

  • nm
    :对象文件中的符号

  • ab
    wrk:对 Web 服务器进行基准测试

  • strace
    : 系统调用调试

  • MTR:更好的网络调试跟踪路由

  • cssh
    : 可视化并发 shell

  • rsync
    :通过SSH或本地文件系统同步文件和文件夹

  • WiresharkTSHARK:数据包捕获和网络调试

  • ngrep:grep 用于网络层

  • host
    和 : DNS 查找
    dig

  • lsof
    :进程文件描述符和套接字信息

  • dstat
    :有用的系统统计

  • Glances:高级、多子系统概述

  • iostat
    :磁盘使用情况统计

  • mpstat
    :CPU 使用率统计信息

  • vmstat
    :内存使用情况统计

  • htop
    : TOP的改进版

  • last
    : 登录记录

  • w
    :谁登录了

  • id
    :用户/组标识信息

  • SAR:历史系统统计

  • iftopnethogs:按套接字或进程划分的网络利用率

  • ss
    :套接字统计

  • dmesg
    :启动和系统错误消息

  • sysctl
    :在运行时查看和配置 Linux 内核参数

  • hdparm
    :SATA/ATA 磁盘操作/性能

  • lsblk
    :列出块设备:磁盘和磁盘分区的树视图

  • lshw
    、 、 、 、 硬件信息,包括 CPU、BIOS、RAID、显卡、设备等。
    lscpu
    lspci
    lsusb
    dmidecode

  • lsmod
    和 :列出并显示内核模块的详细信息。
    modinfo

  • fortune
    、 和 : 嗯,嗯,这取决于你是否认为蒸汽机车和 Zippy 报价“有用”
    ddate
    sl

仅限 macOS

这些项目仅在 macOS 上相关。

  • 使用 (Homebrew) 和/或 (MacPorts) 进行包管理。这些可用于在macOS上安装上述许多命令。

    brew
    port

  • 将任何命令的输出复制到桌面应用程序,并粘贴带有 .

    pbcopy
    pbpaste

  • 要在 macOS 终端中启用 Option 键作为 alt 键(例如在上面的命令中使用,如 alt-b、alt-f 等),请打开首选项 -> 配置文件 -> 键盘,然后选择“将 Option 用作元键”。

  • 要使用桌面应用程序打开文件,请使用 或 。

    open
    open -a /Applications/Whatever.app

  • 聚焦:使用 搜索文件,并使用 列出元数据(例如照片 EXIF 信息)。

    mdfind
    mdls

  • 请注意,macOS 基于 BSD Unix,许多命令(例如 、 、 、 )与 Linux 有许多细微的差异,这在很大程度上受到 System V 风格的 Unix 和 GNU 工具的影响。你通常可以通过注意手册页的标题为“BSD General Commands Manual”来区分它们。在某些情况下,也可以安装 GNU 版本(例如 和 for GNU awk 和 sed)。如果编写跨平台的 Bash 脚本,请避免使用此类命令(例如,考虑使用 Python 或 )或仔细测试。

    ps
    ls
    tail
    awk
    sed
    gawk
    gsed
    perl

  • 要获取 macOS 版本信息,请使用 。

    sw_vers

仅限 Windows

这些项目仅在 Windows 上相关。

在 Windows 下获取 Unix 工具的方法

  • 通过安装 Cygwin 在 Microsoft Windows 下访问 Unix shell 的强大功能。本文档中描述的大多数内容都是开箱即用的。

  • 在 Windows 10 上,可以使用适用于 Linux 的 Windows 子系统 (WSL),它通过 Unix 命令行实用工具提供熟悉的 Bash 环境。

  • 如果你主要想在 Windows 上使用 GNU 开发者工具(比如 GCC),可以考虑 MinGW 及其 MSYS 包,它提供了 bash、gawk、make 和 grep 等实用程序。与 Cygwin 相比,MSYS 不具备所有功能。MinGW 对于创建 Unix 工具的本机 Windows 端口特别有用。

  • 在 Windows 下获得 Unix 外观的另一种选择是 Cash。请注意,在此环境中只有很少的 Unix 命令和命令行选项可用。

有用的 Windows 命令行工具

  • 通过学习和使用 ,可以从命令行执行大多数 Windows 系统管理任务并编写脚本。

    wmic

  • 你可能会发现有用的本机命令行 Windows 网络工具包括 、 、 和 。

    ping
    ipconfig
    tracert
    netstat

  • 你可以通过调用该命令来执行许多有用的 Windows 任务

    Rundll32

Cygwin技巧和窍门

  • 使用 Cygwin 的包管理器安装其他 Unix 程序。

  • 用作命令行窗口。

    mintty

  • 通过 访问 Windows 剪贴板。

    /dev/clipboard

  • 运行以通过其已注册的应用程序打开任意文件。

    cygstart

  • 使用 访问 Windows 注册表。

    regtool

  • 请注意,Windows 驱动器路径将变为 Cygwin,而 Cygwin 的驱动器路径将显示在 Windows 下。使用 在 Cygwin 和 Windows 样式的文件路径之间进行转换。这在调用 Windows 程序的脚本中最为有用。

    C:\
    /cygdrive/c
    /
    C:\cygwin
    cygpath

更多资源

免責聲明

除了非常小的任务外,编写代码是为了让其他人可以阅读它。权力与责任相伴而生。你可以在 Bash 中做一些事情并不一定意味着你应该这样做!;)

许可证

知识共享许可

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可