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

Created at: 2015-05-20 23:11:03
开发语言:

🌍 切什蒂纳德语Ελληνικά英语西班牙语法语印度尼西亚意大利语日本語한국어 ∙ 波兰语 ∙ 葡萄牙语 ∙ 罗马语 Русский斯洛文尼亚语 Українська简体中文 ∙ 繁體中文

命令行的艺术

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

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

    man bash

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

    nano
    vi

  • 查找文档:

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

    >
    <
    |
    >
    >>

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

    *
    ?
    [
    ]
    "
    '

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

    &
    jobs
    fg
    bg
    kill

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

    ssh
    ssh-agent
    ssh-add

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

    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 风格中,转义 v

    export EDITOR=vim

  • 要查看最近的命令,请使用 。跟随 (其中 是命令编号) 再次执行。你还可以使用许多缩写,最有用的可能是最后一个参数和最后一个命令(请参阅手册页中的“历史扩展”)。但是,这些通常很容易被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

  • 使用或者如果你希望后台进程永远运行。

    nohup
    disown

  • 检查哪些进程正在通过 或(对于 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 脚本中,子外壳(用括号编写)是对命令进行分组的便捷方法。一个常见的例子是暂时移动到不同的工作目录,例如
      # 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
}
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 中,知道如何使用 或(偶尔)移植隧道很有用,例如从远程服务器访问网站。

    -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

  • 要根据另一个命令(如)的输出与文件进行交互,请使用(路径选取器)。

    git
    fpp

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

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

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

    sudo
    -u
    -i

  • 要将外壳切换到其他用户,请使用 或 。带有“-”的后者获得的环境就像另一个用户刚刚登录一样。省略用户名默认为 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 更快。亚马逊的AWS和改进的锯对于其他与AWS相关的任务至关重要。

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

    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 安装会将其他区域设置变量设置为本地设置,如美国英语。但请注意,如果你更改区域设置,排序将发生变化。并且知道 i18n 例程可以使排序或其他命令的运行速度慢很多倍。在某些情况下(例如下面的集合运算或唯一性运算),你可以安全地完全忽略慢速 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
  • 要在处理文件时监视进度,请使用 pvpycp监视进度、,或者对于块级复制,请使用 。

    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'

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

    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

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

    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

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

    dstat

  • 要了解内存状态,请运行并了解 和 的输出。特别是,请注意,“缓存”值是 Linux 内核作为文件缓存持有的内存,因此实际上计入“免费”值。

    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"

单行

拼凑命令的几个示例:

  • 有时,你可以通过 / 设置文本文件的交集、并集和差异,这非常有用。假设 和 是已经唯一的文本文件。这很快,适用于任意大小的文件,最大可达数 GB。(排序不受内存限制,但如果位于小型根分区上,则可能需要使用该选项。另请参阅有关上述和 的选项的说明(为清楚起见,下文省略了)。
    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
  • 要持续监控更改,请使用 ,例如,使用 检查目录中文件的更改或网络设置的更改,同时使用 对 wifi 设置进行故障排除。

    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
    :术语信息条目表

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

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

  • slurm:网络流量可视化

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

  • file
    :识别文件类型

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

  • stat
    :文件信息

  • time
    :执行和计时命令

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

  • lockfile
    :创建只能由
    rm -f

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

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

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

    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
    :可视并发外壳

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

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

  • ngrep:用于网络层的 grep

  • host
    和:DNS 查找
    dig

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

  • dstat
    :有用的系统统计信息

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

  • iostat
    :磁盘使用情况统计信息

  • mpstat
    :CPU 使用率统计信息

  • vmstat
    :内存使用情况统计信息

  • htop
    :顶部的改进版本

  • 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 等),请打开首选项 -> 配置文件 -> 键盘,然后选择“使用选项作为元键”。

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

    open
    open -a /Applications/Whatever.app

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

    mdfind
    mdls

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

    ps
    ls
    tail
    awk
    sed
    gawk
    gsed
    perl

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

    sw_vers

仅窗口

这些项目仅在 Windows 上相关。

在Windows下获取Unix工具的方法

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

  • 在Windows 10上,你可以使用Windows Subsystem for Linux(WSL),它通过Unix命令行实用程序提供熟悉的Bash环境。

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

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

有用的窗口命令行工具

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

    wmic

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

    ping
    ipconfig
    tracert
    netstat

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

    Rundll32

小天鹅提示和技巧

  • 使用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 国际许可协议进行许可。