终端原理及操作

本文对 shell 中的概念及命令进行总结, 也涵盖一些终端工具的使用, 涉及到 Linux 及 Mac 系统.

himg

常见概念理解

  • terminal: 一个程序, Mac 自带 terminal, 也有第三方软件比如 xterm, iterm, kvt 等, terminalshell 的 UI, shell 运行在 terminal
  • shell: 命令行解释器. 根据字面意义来看就是机器外面的一层壳, 用于在机器与人交互过程中传递信息. 不限于操作系统, 编程语言, 操作方式和表现形式.
    具体表现是用户输入一条命令后 shell 就立刻进行执行并返回结果. CLI(Command Line Interface) 与 GUI(Graphic User Interface) 都是 shell,
    只不过是不同的表现形式而已.
  • interactivenon-interactive: 如果打开 Mac 上的 iterm, 输入 bash 代码, 按下回车后有返回任何信息就被称为 interactive; 如果输入了若干行的
    shell 脚本, 那么这些 shell 代码就运行在 non-interactive shell
  • loginnon-login: login shell 指登录系统后获得的顶层 shell, 比如最常用的 ssh 登录, 登陆完后会获得一个 login shell; 如果是在 Mac
    上直接打开 iterm 进入了 shell 则是 non-login shell
  • shell 类型
    • bash: 全称: Bourne-Again Shell, 是最常见的 shell. Mac 中的 terminal 默认就是 bash
    • zsh: Mac 中最常用的 shell, 一大半的原因是因为 on-my-zsh 这个配置集. zsh 兼容 bash, 还有自动补全的功能. zsh 的配置文件为 ~/.zshrc
    • cmd: Windows 下的默认 shell, 全称为 command interpreter
    • Jshell: Java 的第三方解释器 (只要一门编程语言有解释器, 就可以作为一个 shell, PHP 也有 PHP Shell)
  • Linux 发行版: GNU/Linux 是基于 GPL 开源许可协议的操作系统内核, 但仅仅有内核还不是一个完整的操作系统, 要想可以使用还需要集成各种应用软件. Linux
    发行版就是指预先集成好的 Linux 操作系统及各种应用软件, 一般情况下用户直接安装就可以使用, 不需要再重新编译. 我们平常所说的安装个 Linux
    操作系统指的都是安装一个 Linux 的发行版.
    • RHEL: Red Hat Enterprise Linux, 是 Redhat 公司推出的企业级 Linux 发行版, 属于开源操作系统; 但是收费!
    • Fedora: 是 Redhat 公司推出的实验性 Linux 发行版, 新特性都会首先出现在 Fedora 上, 稳定后放在 RHEL 中.
    • CentOS: 直接将 RHEL 的源码拿过来, 去掉相关的版权图标信息, 而后发型, 其版本号与 RHEL 基本相同. 法律上是完全没问题的, 因为发布出来的
      CentOS 同样也遵守了 GPL. 除了一些 Redhat 的商业应用软件, CentOS 追求的是与 RHEL 100% 兼容. CentOS 作为从 RHEL 源码直接编译的发行版,
      其作为服务器的高效率及稳定性等方面都是经过实践验证的, 所以如果自己有丰富的服务器运维经验, 那你可以选择 CentOS. 但如果没有专业的运维团队,
      又需要大规模部署, 那还是选择 RHEL 比较明智, Redhat 团队会为你提供专业的, 标准化的解决方案和专业的技术支持.
    • Arch Linux: 巨大的定制潜力, Antergos 提供了一种更加友好的 Linux 体验; 不适合容易放弃的人
    • Ubuntu: 界面漂亮, 非常适合新手, LTS 版本的安全性和稳定性; 不适合服务器端 (需要较多的内存空间), 对非 LTS 版本短暂的支持
    • Ubuntu Studio: 昂贵生产软件的绝佳替代品, 允许访问主 Ubuntu 中的包, 支持音频插件; 由于功能强大, 所以操作系统不够精简
    • Debian: 最适合服务器的操作系统, 稳定得无与伦比, 内存占用小, 常年不需要重启; 由于其发展路线, 帮助文档略少, 技术资料也略少.
    • Elementary OS: 设计巧妙, 看起来很棒; 预装的应用程序并不多
    • Linux Mint: 非常适合从 Windows / Mac 切换过来的用户, 良好的媒体支持, 开箱即用, 令人印象深刻的定制选项; 高级玩家可能不会喜欢
    • Tails: 强调安全和隐私, 易于使用的操作界面; 功能比较基本
    • openSUSE: 非常精美, 安全, 允许你创建自己的操作系统版本; 默认的软件选择略显臃肿
  • GNOME: Linux 系统就是一个纯命令行的操作系统, GNOMELinux 提供了桌面操作环境. GNOME 是由 GNU Network Object Model Environment
    的第一个字母所组成, GNOME 属于 GNU 计划中的一部份.

Linux 的图形显示层次是: Linux 本身 -> X 服务器 <- [通过 X 协议交谈] -> 窗口管理器 (综合桌面环境) -> X 应用程序.

  • KDE: 与 GNOME 并列的两种最流行的桌面操作环境, 全称是 K Desktop Environment. 其他的一些比较流行的桌面操作环境有:
    • XFCE
    • CINNAMON
    • UNITY
    • MATE
    • DEEPIN
    • PANTHEON
    • BUDGIE
    • MANOKWARI
  • GNU: GNU 计划开始于 1984 年, 专注于发展类似 UNIX 且完全免费的操作系统.

common environment variables

  • echo $SHELL: 查看当前使用的 shell 类型 (2019.12.10 目前使用 zsh)
  • echo $TERM: 查看当前使用的终端类型
  • echo $PATH: 查看当前系统的路径顺序
  • exprot PATH="/usr/local/sbin:$PATH": 将 /usr/local/sbin 加入到系统环境中并使之成为第一顺位
  • echo 'export PATH="/usr/local/sbin:$PATH"'>> ~/.zshrc: 将字符 export PATH="/usr/local/sbin:$PATH" 输出到 ~/.zshrc 文件的末尾
  • echo $PATH: 输出当前系统的路径读取顺序
  • echo ${(t)fpath}: 输出 fpath 的类型
  • echo ${(t)FPATH}: 输出 FPATH 的类型
  • PS4='+%x:%I>' zsh -i -x -c '' |& grep ***: 检查别名的定义位置, 用于查找 alias 的详细位置

快捷键

  • C-c: 终止正在执行的命令
  • C-p/n: 浏览已执行的历史记录
  • C-f: 向后移动一个字符
  • C-b: 向前移动一个字符
  • C-a: 光标移动到行首
  • C-e: 光标移到行尾
  • C-z: 将当前进程最小化
  • C-l: 清除整个屏幕
  • C-u: 从光标位置删除到行首 (bash); 删除当前行 (zsh)
  • C-k: 从光标位置删除到行尾
  • C-y: 粘贴上一次删除的字符串
  • C-h: 删除光标前一个字符
  • C-d: 删除光标后一个字符, 在删除完光标后会删除当前 shell 会话
  • C-i: 与 tab 作用相同
  • C-_: undo
  • C-x C-u: undo, same as c-_
  • C-t: 交换光标前的两个字符的位置
  • esc-t: 交换光标前的两个词的位置
  • alt-t: 交换光标下的当前单词与前一个单词的位置
  • alt-backspace: 删除前一个单词
  • alt-.: 使用上一次的参数
  • alt-u: 使当前光标至结尾的单词大写
  • C-w: 移除光标前一个单词
  • C-x-e: 在编辑器 (vi) 中编辑当前命令行文本
  • C-q: 将当前命令暂时隐藏, 等待下一个命令执行完毕后再弹出
  • ↑/↓: 浏览已执行的历史记录
  • C-r: 搜索之前打开过的命令
  • C-s: 向后搜索历史命令
  • C-xx: 在行首与当前光标处切换
  • Esc-d / alt-d: 删除光标所在字符
  • Esc-f / alt-f: 光标右移一个单词
  • Esc-b / alt-b: 光标左移一个单词
  • ⌘ E: 向下滚动一行
  • ⌘ Y: 向上滚动一行
  • 双击 Tab: 列出所有的补全列表并直接进入选择模式, 补全项可以使用 ctrl+n/p/f/b 上下左右切换
  • 上下键: 显示历史的命令, 如果在特定前缀命令下只会显示同样的命令, 比如输入 ls 情况下只会查找用过的 ls 命令

纯内置命令 (不包含 gnu coreutils 实现的)

  • set -o noglob / set -f: 关闭扩展
  • set +o noglob / set +f: 打开扩展

  • pushd <directory>: 与 cd 类似, 会进入某目录, 但是会将此次的进入目录放入堆栈中, 使用 popd 可以进入堆栈的上一目录
  • pushd +3: 从栈顶算起的 3 号目录 (从 0 开始), 移动到栈顶
  • popd: 进入堆栈的上一目录
  • popd -3: 删除从栈底算起的 3 号目录 (从 0 开始)

  • pwd: 列出当前所在的目录

  • rmdir [路径]: 删除一个文件夹 (无法删除含有文件的文件夹)

  • zsh_stats: 查看当前使用频率最高的 20 条命令

  • dirs: 查看堆栈内容

    • -c: 清空目录栈.

    • -l: 用户主目录不显示波浪号前缀, 而打印完整的目录.

    • -p: 每行一个条目打印目录栈, 默认是打印在一行.

    • -v: 每行一个条目, 每个条目之前显示位置编号 (从 0 开始).

    • +N: N 为整数, 表示显示堆顶算起的第 N 个目录, 从零开始.

    • -N: N 为整数, 表示显示堆底算起的第 N 个目录, 从零开始.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      $ pwd # 当前处在主目录, 堆栈为空
      /home/me

      # 进入 /home/me/foo
      $ pushd ~/foo # 当前堆栈为 /home/me/foo /home/me

      # 进入 /etc
      $ pushd /etc # 当前堆栈为 /etc /home/me/foo /home/me

      # 进入 /home/me/foo
      $ popd # 当前堆栈为 /home/me/foo /home/me

      # 进入 /home/me
      $ popd # 当前堆栈为 /home/me

      # 目录不变, 当前堆栈为空
      $ popd

  • ./test.sh: 执行当前目录下的 test.sh 文件, 必须使用 ./, 如果直接使用 test.sh 的话系统会在 PATH 中查找有没有 test.sh,
    通常是不在的, 因此会报错, 使用 ./test.sh 表示就在当前目录找 test.sh, 这样就能顺利找到了
  • /bin/sh test.sh: 与上面的运行方式类似, 不过指定了解释器

  • which python: 输出当前使用的 python 路径
  • where python: 输出当前环境下所有可用的 python 路径

  • type echo: 查看 echo 是否是 shell 内置命令, 如果不是内置则显示其路径
  • type -a <command>: 查找某个命令被定义在的位置
  • type -a echo: 查看 echo 的所有路径位置 (如果是内置命令也会显示)
  • type -t if: 显示某个命令的类型, if 的类型是 keyword

  • alias python='/usr/local/bin/python3': 设置应用的别名 (如果需要取消设置需使用 unalias vim, 如果想要在 .zshrc 中设置需将 ' 改为 ")
  • alias: 列出系统所有已设置的别名

  • history: 显示会话开始后的所有历史命令
  • history -c: 清理所有历史命令
  • history 10: 显示最近 10 个历史命令

  • compgen -c: 显示当前终端所有可调用命令

  • set / env: 显示所有环境变量

  • !!: run previous command(i.e. sudo !!)
  • !vi: run previous command that begins with vi
  • !vi:p: print previously run command that begins with vi
  • !n: execute nth command in history
  • !$: last argument of last command
  • !^: first argument of last command
  • ^abc^xyz: replace first occurance of abc with xyz in last command and execute it

系统环境路径

/etc/paths 中规定了系统路径查找顺序

1
2
3
4
5
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Homebrew 安装的软件都会在 /usr/local/bin 中有一个快捷方式 (具体的文件在 /usr/local/Cellars 中), 因此要将系统环境路径设置为 /usr/local/bin
为第一个检查, 这样在键入 vim 命令时 Homebrew 安装的 vim 就会被先检测到, 内置的 vim 不会被启动

可在终端使用 echo $path 检查当前系统的路径读取顺序.

.zshrc 中追加路径可加入 export PATH="/usr/local/sbin:$PATH", 这样会将 /usr/local/sbin 路径加入到路径列表并成为第一顺位.

源码编译安装

尽管已经有些包管理软件, 但是仍然不可避免地要编译安装一些源码, 本例以 CentOS 编译安装 Python3.8.3 为例

  1. 编译环境准备

    1
    2
    3
    yum groupinstall 'Development Tools'
    yum install -y ncurses-libs zlib-devel mysql-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel \
    db4-devel libpcap-devel xz-devel
  2. 删除系统中已有的 python3

    /usr/bin/usr/local/bin 中查找 python3 与 pip3 的相关文件, 然后删除. 这一步是为了后面我们将编译出的文件链接到此两个文件夹中

  3. 下载 Python3.8.3 源码到桌面并解压

    1
    2
    3
    cd /home/hanley/Desktop/https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
    tar -xvf Python-3.8.3.tgz
    cd Python-3.8.3.tgz
  4. 配置编译选项

    1
    ./configure --prefix=/usr/local/python3.8.3 --enable-optimizations

    解释下这些选项的含义:

    • --prefix 选项是配置安装的路径, 如果不配置该选项, 安装后可执行文件默认放在 /usr/local/bin, 库文件默认放在 /usr/local/lib, 配置文件默认放在
      /usr/local/etc, 其它的资源文件放在 /usr/local/share, 比较凌乱.

    • --enable-optimizations 是优化选项 (LTO, PGO 等) 加上这个 flag 编译后, 性能有 10% 左右的优化, 但是这会明显的增加编译时间, 老久了.

      ./configure 命令执行完毕之后创建一个文件 Makefile, 供下面的 make 命令使用, 执行 make install 之后就会把程序安装到我们指定的文件夹中去.

  5. 进行编译, 编译结果会放到 [第 4 步](# 第四步) 配置的文件夹中

    1
    make && make install
  6. 进入编译结果文件夹, 将编译出的结果软链接到 /usr/bin

    1
    2
    3
    4
    5
    6
    7
    cd /usr/local/Python3.8.3/bin
    ln -s python3.8 /usr/bin/python
    ln -s python3.8 /usr/bin/python3
    ln -s python3.8 /usr/bin/python3.8
    ln -s pip3.8 /usr/bin/pip
    ln -s pip3.8 /usr/bin/pip3
    ln -s pip3.8 /usr/bin/pip3.8

    因为终端寻找命令是根据我们定义的 PATH 的顺序来查找的, 我们的编译结果文件夹 /usr/local/Python3.8.3 并不在我们的 PATH 中,
    因此我们要将其中的结果软链接到已经在 PATH 的文件夹中

    同时, 如果不想做软链接, 也可以直接将编译结果文件夹加入到 PATH

    1
    2
    3
    vim /etc/profile # 编辑 etc/profile 文件
    export PATH=/usr/local/Python3.8.3/bin:$PATH # 在文件末尾直接加入我们的编译结果文件夹
    source etc/profile # 更新配置

    不过这样的话我们每编译一次软件可能就要编辑一次 PATH, 而且也会导致 PATH 过多, 因此更方便的方法还是使用软链接的方式

标准输入与参数区别

有一些命令不接受标准输入, 这些命令不能用于管道符之后, 比如 where connect.sh | rm 是错误的, 这个时候我们只能使用参数传入该命令:
rm "$(where connect.sh)"

而有些命令既接受标准输入, 又接受命令行参数. 比如 cat

如果命令能够让终端阻塞, 说明该命令接收标准输入, 反之就是不接受, 比如你只运行 cat 命令不加任何参数, 终端就会阻塞, 等待你输入字符串并回显相同的字符串.

后台运行程序

可以在命令之后加一个 & 符号, 这样命令行不会阻塞, 可以响应你后续输入的命令, 但是如果你退出服务器的登录, 就不能访问该网页了.
如果你想在退出服务器之后仍然能够访问 web 服务, 应该这样写命令 (cmd &)

1
2
3
4
$ (python manager.py runserver 0.0.0.0 &)
Listening on 0.0.0.0:8080...

$ logout

单引号与双引号的区别

不同的 shell 行为会有细微区别, 但有一点是确定的, 对于 $, (, ) 这几个符号, 单引号包围的字符串不会做任何转义, 双引号包围的字符串会转义.

shell 的行为可以测试, 使用 set -x 命令, 会开启 shell 的命令回显, 你可以通过回显观察 shell 到底在执行什么命令:

himg

可见 echo $(cmd)echo "$(cmd)", 结果差不多, 但是仍然有区别. 注意观察, 双引号转义完成的结果会自动增加单引号, 而前者不会.

也就是说, 如果 $ 读取出的参数字符串包含空格, 应该用双引号括起来, 否则就会出错.

工具使用

cd

cd: 在你知道路径的情况下, 比如 /usr/local/bin 你可以输入 cd /u/l/b 然后按进行补全快速输入 (路径分为绝对路径与相对路径, 绝对路径总以 / 开头, 相对路径直接以文件名开头)

  • cd ~/.oh-my-zsh/themes && ls: 查看当前 zsh 涵盖主题

  • cd..: 返回到上一级目录

  • cd../.vim: 返回到上一级目录, 并进入上一级目录下的 .vim 目录下

  • cd -: 返回到上一次访问的目录

  • cp: 复制

mv

mv: 移动

cat

  • cat [option] <file>: 从第一行输出文件内容到终端
    • -A: 相当于 -vET 的整合选项, 可列出一些特殊字符而不是空白而已;
    • -b: 列出行号, 仅针对非空白行做行号显示, 空白行不标行号!
    • -E: 将结尾的断行字节 $ 显示出来;
    • -n: 打印出行号, 连同空白行也会有行号, 与 -b 的选项不同;
    • -T: 将 [tab] 按键以 ^I 显示出来;
    • -v: 列出一些看不出来的特殊字符
    • cat > filename: 新建一个文件并编辑其内容 (使用 ⌃D 退出编辑状态)
    • cat file1 file2 > file: 将两个文件合并为一个文件 (仅合并, 不输出)
    • cat /etc/shells: 常看当前系统支持的 shell 类型
  • tac: 从最后一行输出文件内容到终端

cut

  • printf "%-20s%s\n" "Size:" "$(gls -lah "${FILE}" | cut -d ' ' -f 5)": To cut out the fifth field of text or stdoutput that is delimited by a space

awk

AWK 是一种处理文本文件的语言, 是一个强大的文本分析工具.

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho, Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符.

awk [options] 'script' var=value file(s) / awk [options] -f scriptfile var=value file(s)

options

  • -F fs: 指定文件拆分符, fs 可以是一个字符串或者一个正则表达式
  • -v var=value: 赋值一个用户自定义变量
  • -f scriptfile / --file scriptfile: 从脚本读取 awk 命令
  • --traditional / --compat: 兼容模式下运行 awk, 所以 gawk 的行为和标准的 awk 完全一样, 所有的 awk 扩展都被忽略.
  • --copyright: 打印简短的版权信息
  • --help / --usage: help
  • --lint: 打印不能向传统 unix 平台移植的结构的警告
  • --lint-old: 打印关于不能向传统 unix 平台移植的结构的警告
  • --re-inerval: 允许间隔正则表达式的使用, 参考 (grep 中的 Posix 字符类), 如括号表达式 [[:alpha:]].
  • --source program-text: 使用 program-text 作为源代码, 可与 -f 命令混用.

example

  • awk '{print $1,$4}' log.txt: 每行按空格或 tab 分割, 输出文本中的 1,4 项
  • printf "%-20s%s\n" "Size:" "$(gls -lah "${FILE}" | awk -F " " '{ print $5 }')": 使用 awk 处理输入

touch

  • touch filename: 新建一个文件

env

  • env: 总是指向 /usr/bin/env 文件, 或者说, 这个二进制文件总是在目录 /usr/bin
  • /usr/bin/env bash: 返回 bash 可执行文件的位置, 前提是 bash 的路径是在 $PATH 里面.
    • -i: –ignore-environment, 不带环境变量启动.
    • -u: –unset=NAME, 从环境变量中删除一个变量.
    • --help: 显示帮助.
    • --version: 输出版本信息.
  • env -i /bin/sh: 新建一个不带任何环境变量的 Shell

ln

  • ln -s source/file.txt destination/file.txt: 将 source 文件夹的 file.txt 文件在 destination 文件夹创建一个符号链接 (软链接)
  • ln source/file.txt destination/file.txt: 将 source 文件夹的 file.txt 文件在 destination 文件夹创建一个硬链接

bc

bc 命令是任意精度计算器语言, 通常在 linux 下当计算器用.

bc [option][args]

options

  • -i: 强制进入交互模式
  • -l: 定义使用的标准数学库
  • -w: 对 posix bc 的扩展给出警告信息

example

  • echo "15+5" | bc: 20
  • echo 'scale=2; (2.777 - 1.4744) / 1' | bc: 1.30, 设定小数位 (默认小数位数为零)
  • echo "ibase=2;111" | bc: 7, 进制换算
  • abc=192; echo "obase=2;$abc" | bc: 11000000, 用 bc 将十进制转换为二进制
  • echo "10^10" | bc: 1000000000
  • echo "sqrt(100)" | bc: 10

users

  • groups: 查看当前用户所属组

    • wheel: 是系统管理员组, 默认有用户 root, 此组中的用户拥有系统最高权限, 100% 的控制系统, wheel 源于 BSD UNIX, 而 wheel 又有掌舵意思, 意味这掌控着系统方向
    • admin: 是用户管理员组, 在此组中的成员可以通过 sudo 命令暂时升级为 root 去执行命令, 和 wheel 同样身为管理员, 但是在平时, 如果不使用 sudo 的话就和普通用户没什么区别, 安全性更好
    • staff: 本机的用户都会在此组中, 注意, 并不包括用户 guest
    • everyone: 直译过来就是任何人, 包括任何用户, 比如 guest 或者是远程连接过来的用户
  • groups user_name: 查看指定用户所属组

  • groupadd [option] [groupname]: 添加某一用户组

    • -g: 指定新用户组的组标识号 (GID).
    • -o: 一般与 - g 选项同时使用, 表示新用户组的 GID 可以与系统已有用户组的 GID 相同.
  • groupdel [groupname]: 删除某一用户组

  • groupmode [option] [groupname]: 修改某一个用户组属性

    • -g: GID 为用户组指定新的组标识号.

    • -o: 与 - g 选项同时使用, 用户组的新 GID 可以与系统已有用户组的 GID 相同.

    • -n: 新用户组 将用户组的名字改为新名字

      groupmod –g 10000 -n group3 group2: 将组 group2 的标识号改为 10000, 组名修改为 group3.

  • newgrp root: 将用户切换到 root 组中 (前提是 root 组中是有本用户的)

  • cat /etc/passwd: 查看所有用户

  • cat /etc/group: 查看所有用户组

  • w: 查看当前活跃用户

  • whoami: 当前用户

  • useradd [option] hanley: 添加用户 hanley

    • -c: comment 指定一段注释性描述.
    • -d: 目录 指定用户主目录, 如果此目录不存在, 则同时使用 -m 选项, 可以创建主目录.
    • -g: 指定用户所属的 primary group (一个用户只能有一个).
    • -G: 指定用户所属的 secondary group (一个用户可以有 0 个或多个). sudo user add -g root -G wheel docker hanleylee
    • -s: 指定用户的登录 Shell. sudo useradd -s /usr/bin/zsh hanley
    • -u: 用户号 指定用户的用户号, 如果同时有 - o 选项, 则可以重复使用其他用户的标识号.
    • -D: 单用显示默认新建用户的配置, 如 sudo useradd -D; 后面添加其他参数时用于修改新创建的默认用户的配置, 例如 sudo useradd -D -s /bin/zsh
  • userdel [option] hanley: 删除用户 hanley

    • -r: 将用户的主目录一起删除
  • usermod [option] hanley: 修改用户 hanley 的配置

    • -c: comment 指定一段注释性描述.

    • -d: 目录 指定用户主目录, 如果此目录不存在, 则同时使用 -m 选项, 可以创建主目录.

    • -g: 指定用户所属的 primary group

    • -G: 指定用户所属的 secondary group

    • -s: Shell 文件 指定用户的登录 Shell.

    • -u: 用户号 指定用户的用户号, 如果同时有 - o 选项, 则可以重复使用其他用户的标识号.

      usermod -s /bin/ksh -d /home/z –g developer hanley: 此命令将用户 sam 的登录 Shell 修改为 ksh, 主目录改为 / home/z, 用户组改为 developer.

  • id username 查看当前用户的详情 (用户名, 所属组)

  • passwd [option] hanley: 修改用户 hanley 的密码

    • -l: 锁定口令, 即禁用账号.

    • -u: 口令解锁.

    • -d: 使账号无口令.

    • -f: 强迫用户下次登录时修改口令.

      非 root 下不能修改指定用户名的密码, 只能使用 passwd 修改自身密码

  • su - hanley: 切换到用户 hanley

  • su: 切换到 root

chmod

chmod -R 777 <file/folder>: 后面加文件名修改某个文件权限为可读可写, 后面加文件夹名修改其下所有文件为可读可写

1
2
[root@localhost test] # ls -al log2012.log
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log # 从左到右依次是: 权限. 硬链接次数. 创建者. 创建者所属组. inode 号. 创建时间. 文件名

chmod 用于修改文件对于所有者及其他人的权限, 标准的完整写法为: sudo chmod [-cfvR] [--help] [mode] file

参数

  • [-cfvR]:
    • -c: 当发生改变时, 报告处理信息
    • -f: 错误信息不输出
    • -R: 处理指定目录以及其子目录下的所有文件
    • -v: 运行时显示详细处理信息
  • [mode]:
    • r: 可读, 对应数字 4
    • w: 可写, 对应数字 2
    • x: 可执行, 对应数字 1

范例

  • chmod +x <file/folder>: 为某文件加上可执行属性 (对三种用户都生效)
  • chmod -x <file/folder>: 为某文件删除可执行属性 (对三种用户都生效)
  • chmod u+rx script.sh: 只给脚本拥有者读权限与执行权限
  • chmod u=rwx,g=rx,o=r <file>: 不使用数字的方式, 直接使用缩写 u, g, o 的方式改变属主, 属组, 其他用户对某文件的读写权限, 等价于上一命令
  • chown mysql auth.log: 将文件 auth.log 的属主更改为 mysql
  • sudo chown -R $(whoami) /Library/Ruby/Gems/*: 为文件夹下的所有文件的属主改为当前用户
  • chown root:root auth.log: 将文件 auth.log 的属主与数组更改回 root
  • chgrp -R mysql apache2: 把文件 apache2 及该文件所属目录下的所有递归文件的所在组更改为 mysql
  • dscl. -list /Groups: 查看所有组
  • dscl. -list /Group PrimaryGroupID: 查看所有组及其 id
  • dscl. -read /groups: 查看所有组的所有详细信息
  • dscl. -read /Groups/admin 查看指定组 admin 的详细信息
  • dscl. -read /Groups/admin GroupMembership: 查看指定组 admin 的所有成员
  • dscl. -list /Users: 查看所有用户
  • dscl. -list /Users UniqueID: 查看所有用户及 ID
  • dscl. create /Groups/test: 创建 test 组
  • dscl. -delete /Groups/test_group: 删除 test 组
  • dscl. -create /Users/test_user: 创建 test_user 用户
  • dscl. -passwd /Users/test_user 'goodpwd'
  • dscl. -append /Groups/admin GroupMembership test_user: 将用户加入指定用户组 admin
  • dscl. -delete /Groups/test_group GroupMembership test_user: 从 admin 组中删除用户

osascript

  • osascript -e 'id of app"qq"': 获取 QQ 软件的 bundle identifier

ps

  • ps -axu Chew | grep WeChat: 查看 Chew 用户名下的进程名为 WeChat 的进程
    • -a: 列出所有用户的进程
    • -u: 列出属于某用户的进程, Chew 为用户名
    • -x: 包括无控制终端的进程
    • grep: 过滤进程

openssl

  • openssl rsa -in temp.key -out temp.pem: 将 .key 转换为 .pem
  • openssl x509 -in tmp.crt -out tmp.pem: 将 .crt 转换为 .pem

defaults

  • defaults write com.apple.desktopservices DSDontWriteNetworkStores true: 禁止 Mac 以后产生 .DS_Store 文件
  • defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE: 作用同上
  • defaults delete com.apple.desktopservices DSDontWriteNetworkStores: 恢复 .DS_Store 文件生成

nmcli

  • nmcli g: 查看网络状态
  • nmcli d: 查看设备信息
  • nmcli d connect deviceName: 根据自身真实网卡名字对应修改 deviceName
  • nmcli connection modify enp0s5 connection.autoconnect yes: 设置此网卡开机自动连接网络

systemctl

  • cat /etc/inittab: 获得系统支持的模式, CentOS8 只支持 multi-user.targetgraphical.target 模式
  • systemctl get-default: 查看当前系统启动后默认进入的模式, 是命令行模式还是图形化模式
  • systemctl set-default multi-user.target: 设置系统启动后默认进入命令行模式
  • systemctl set-default graphical.target: 设置系统启动后默认进入图形化模式
  • systemctl start sshd.service: 开启 sshd 服务
  • systemctl stop sshd.service: 停止 sshd 服务
  • systemctl restart sshd.service: 重启 sshd 服务
  • systemctl enable sshd.service: 开机默认启动 sshd 服务
  • yum groupinstall -y "Server with GUI": 安装图形化桌面系统 (在设置了启动进入图形化模式后还是没有进入图形化模式时使用)

alternatives

  • alternatives --install <path1> <name> <path2> <priority>: 将 path2 的可执行文件在 path1 中以 name 创建符号链接 (如果没有的话), 并为其设置优先级
  • alternatives --config <name>: 列出可选值, 然后手动选择可选值
  • alternatives --remove <name> <path>: 移除某个命令的可选值
  • alternatives --set <name> <path>: 为已有的某个命令添加可选值 (典型代表是 python, python 配置可选值只能通过此项, 因为系统提供了一个 unversioned-python)
  • alternatives --list | grep <name>: 列出针对某个命令可选值

netstat

  • netstat -lnp|grep 80: 查看所有监听了 80 端口的进程

gkill

发送信号到进程

本 kill 讨论的是 gnu coreutils 中的 gkill

信号

  • 1: HUP, Hangup, 终端挂断
  • 2: INT, Interrupt, 中断 (同 C-c)
  • 3: QUIT, Quit, 退出 (同 C-\)
  • 4: ILL, Illegal instruction
  • 5: TRAP, Trace/BPT trap
  • 6: ABRT, Abort trap
  • 7: EMT, EMT trap
  • 8: FPE, Floating point exception
  • 9: KILL, Killed, 强制终止
  • 10: BUS, Bus error
  • 11: SEGV, Segmentation fault
  • 12: SYS, Bad system call
  • 13: PIPE, Broken pipe
  • 14: ALRM, Alarm clock
  • 15: TERM, Terminated, 终止
  • 16: URG, Urgent I/O condition
  • 17: STOP, Suspended (signal), 暂停 (同 C-z)
  • 18: TSTP, Suspended
  • 19: CONT, Continued, 继续 (与 STOP 相反, fg/bg 命令)
  • 20: CHLD, Child exited
  • 21: TTIN, Stopped (tty input)
  • 22: TTOU, Stopped (tty output)
  • 23: IO, I/O possible
  • 24: XCPU, Cputime limit exceeded
  • 25: XFSZ, Filesize limit exceeded
  • 26: VTALRM, Virtual timer expired
  • 27: PROF, Profiling timer expired
  • 28: WINCH, Window size changes
  • 29: INFO, Information request
  • 30: USR1, User defined signal 1
  • 31: USR2, User defined signal 2

命令

  • gkill -l: 打印信号名称或转换给定数字到信号名称
  • gkill -l: list signal names, or convert signal names to/from numbers
  • gkill -t: print a table of signal information

实例

  • kill -s KILL 25158: 向 PID 为 25158 的进程发送 信号 9(SIGKILL)
  • kill -s KILL %1: 终止作业标识符为 1 的作业
  • kill -s STOP 181357
  • kill -l: 显示所有可接受的信号名
  • kill -L: 显示所有信号名与信号数字的对应关系

logout

  • logout: 退出远程终端模拟器

df

df [-ahikHtm] [file/folder]: 检查文件系统的磁盘空间占用情况

options

  • -a: 列出所有的文件系统, 包括系统特有的 /proc 等文件系统;
  • -k: 以 KBytes 的容量显示各文件系统;
  • -m: 以 MBytes 的容量显示各文件系统;
  • -h: 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
  • -H: 以 M=1000K 取代 M=1024K 的进位方式;
  • -T: 显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
  • -i: 不用硬盘容量, 而以 inode 的数量来显示

du

  • du [-ahskm] [file/folder]: 对文件和目录磁盘使用的空间的查看 (比 df 简洁的多)

options

  • -a: 列出所有的文件与目录容量, 因为默认仅统计目录底下的文件量而已.
  • -h: 以人们较易读的容量格式 (G/M) 显示;
  • -s: 列出总量而已, 而不列出每个各别的目录占用容量;
  • -S: 不包括子目录下的总计, 与 -s 有点差别.
  • -k: 以 KBytes 列出容量显示;
  • -m: 以 MBytes 列出容量显示;

fdisk

  • fdisk -l [device name]: 列出装置的所有分区

mkfs

  • mkfs [-t 文件系统格式]: 装置文件名, 格式化磁盘

fsck

  • fsck [-t 文件系统] [-ACay] 装置名称: 磁盘检查
    • -t: 给定档案系统的型式, 若在 /etc/fstab 中已有定义或 kernel 本身已支持的则不需加上此参数
    • -s: 依序一个一个地执行 fsck 的指令来检查
    • -A: 对 / etc/fstab 中所有列出来的 分区 (partition) 做检查
    • -C: 显示完整的检查进度
    • -d: 打印出 e2fsck 的 debug 结果
    • -p: 同时有 -A 条件时, 同时有多个 fsck 的检查一起执行
    • -R: 同时有 -A 条件时, 省略 / 不检查
    • -V: 详细显示模式
    • -a: 如果检查有错则自动修复
    • -r: 如果检查有错则由使用者回答是否修复
    • -y: 选项指定检测每个文件是自动输入 yes, 在不确定那些是不正常的时候, 可以执行 # fsck -y 全部检查修复.

mount

  • mount [-t 文件系统] [-L Label 名] [-o 额外选项] [-n] 装置文件名 挂载点: 挂载磁盘
  • umount [-fn] 装置文件名或挂载点: 卸载磁盘
    • -f: 强制卸除! 可用在类似网络文件系统 (NFS) 无法读取到的情况下;
    • -n: 不升级 /etc/mtab 情况下卸除.

codesign

  • codesign [option] < 证书名 > <file>: 以某证书对某文件进行签名
    • -f: 强制的意思, 一般用来重新签名进行覆盖时使用
    • -s: 进行签名
  • codesign --remove-signature <file>: 清除动态库签名
  • codesign -v <file>: 查看签名

sync

  • sync: 将数据由内存同步到硬盘中.

yum

yumcentos 上的包管理工具, 作用类似于 Mac 上的 Homebrew, 有如下特点

  • yum 是 Linux 下用于安装 rpm 软件包的一个工具, 要使用它安装软件包, 必须提前配置 yum 源.
  • yum 源分为本地 yum 源和网络 yum 源. 本地 yum 源指软件仓库在本地; 网络 yum 源指软件仓库在远程.
  • 软件仓库里既有软件包也要有 repodata 目录, 即存放软件之间的依赖关系
  • yum 工具安装 rpm 软件包的最大优势就是解决软件包的依赖关系, 提高工作效率

源的安装方式

yum 的源位于 /etc/repos.d/ 文件夹中, 有两种方式安装

  • 自定义书写源

    /etc/repos.d/ 文件夹中直接创建以 .repo 结尾的文件, 格式按照 [源的格式](# 源的格式) 进行书写即可

  • 使用国内镜像源

    1
    2
    3
    4
    5
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 备份当前源
    wget http://mirrors.163.com/.help/CentOS6-Base-163.repo # 下载 163 源
    mv CentOS6-Base-163.repo CentOS-Base.repo # 重命名 163 源
    yum clean all # 清除之前源的缓存
    yum makecache # 生成新 163 源的缓存

源的格式

1
2
3
4
5
[local] #仓库的名字, 不要有特殊符号 (自定义)
name=local #yum 仓库描述, 可以不写
baseurl=file:///mnt #指定 yum 仓库的路径 (重要),file:// 表示本地仓库, 如果是网络仓库的话就是链接地址 (baseusl=http://mirrors.aliyun.com/centos/6/os/x86_64/)
enabled=1 #表示启用该仓库, 1 表示启用; 0 表示不启用
gpgcheck=0 #不用校验仓库里软件包的签名, 0 表示不校验; 1 表示校验

命令

yum 很多命令需要用到超级管理员的权限, 所以你需要在命令的前面加上 sudo, 比如 sudo yum install … 或者先执行一下 su 这个命令.

  • yum search <package name>: 安装包之前, 先搜索一下是否有此包
  • yum info <package name>: 查看此包的具体信息, 包含版本号, 尺寸, 所属仓库, 网址等
  • yum install <package name>: 安装包
  • yum install <package name> -y: 安装包, 提前加上 y, 不需要在中途再次被确认操作
  • yum reinstall <package name>: 重新安装包
  • yum install <repo>: 安装仓库, 比如 yum install epel-release 是安装一个叫 Extra Packages for Enterprise Linux 的仓库
  • yum list available: 列出所有可用的包
  • yum list installed: 列出已经安装的包
  • yum list installed | less: 列出已经安装的包 (以分页方式显示)
  • yum list installed | grep http: 列出已经安装的含有关键字 http 的包
  • yum provides <path>:: 判断文件来自哪个包
  • yum deplist <package name>: 列出软件包的依赖
  • yum repolist: 查看系统里所有被启用的仓库列表
  • yum check-update: 检查所有可以更新的包
  • yum clean packages: 清除暂存中的 rpm 包文件
  • yum clean headers: 清除暂存中的 rpm 包的头文件
  • yum clean oldheaders: 清除暂存中的旧的 rpm 包的头文件
  • yum clean all: 清除缓存中的旧的 rpm 头文件与包文件 (相当于 yum clean packages + yum clean oldheaders)
  • yum update: 更新所有包
  • yum update <package name>: 更新指定包
  • yum remove <package name>: 删除指定包 (还会把仅此包所使用的依赖删除)
  • yum remove all: 删除所有包 (慎用!)
  • yum groupinstall [packages1...] | yum groupupdate [package1...] | yum grouplist [package1...] | yum groupremove [package1...]: 批量操作

gem

gem 是管理 ruby 库和程序的标准包, 通过 Ruby Gem (如 http://rubygems.org/) 源来查找, 安装, 升级和卸载软件包, 非常的便捷

ruby 语言从 1.9.2 开始默认安装 Ruby Gem

命令

  • gem update --system: 更新 gem 自身, 为了系统的稳定性, 某些 linux 禁止执行此命令
  • gem update: 更新所有已安装的 gem 包
  • gem update [gemname]: 更新指定的 gem 包
  • gem install [gemname]: 安装包
  • gem install -l [gemname].gem: 安装本地包
  • gem install [gemname] --version=[ver]: 安装指定版本的包
  • gem uninstall [gemname]: 卸载包
  • gem uninstall [gemname] --version=[ver]: 卸载指定版本的包
  • gem list [--local]: 列出所有已安装的包

rpm

rpm 用于安装下载到本地的离线包

  • rpm -ivh <package path>: 安装下载到本地的包
  • rpm -q <package name>: 检查包是不是已经被安装了
  • rpm -qi <package path>: 查看包
  • rpm -qf <path>: 检查文件属于哪个包
  • rpm -Uvh <package name>: 更新安装的包
  • rpm -e <package name>: 移除安装的包
  • rpm -qa: 查看所有安装到本地的包
  • rpm -qa | less: 查看安装的包 (以分页的方式显示)

DNF

DNF 新一代的 RPM 软件包管理器. 他首先出现在 Fedora 18 这个发行版中. 目前已经取代了 YUM, 正式成为 Fedora 22 的包管理器.

说明: DNF 包管理工具只是代替 yum 客户端的工具, 实质上 dnf 和 yum 都还是使用同一个 YUM 源.

DNF 包管理器克服了 YUM 包管理器的一些瓶颈, 提升了包括用户体验, 内存占用, 依赖分析, 运行速度等多方面的内容.

提示: 实际使用中, dnf 确实比 yum 快很多.

安装

  1. 首先安装 epel-release: sudo yum install epel-release
  2. 通过 yum 安装 dnf: sudo yum install dnf

命令

  • dnf -version: 查看 DNF 包管理器版本
  • dnf repolist: 查看系统中可用的 DNF 软件库
  • dnf repolist all: 查看系统中可用和不可用的所有的 DNF 软件库 (用处: 该命令用于显示系统中可用和不可用的所有的 DNF 软件库)
  • dnf list: 列出所有 RPM 包 (用处: 该命令用于列出用户系统上的所有来自软件库的可用软件包和所有已经安装在系统上的软件包)
  • dnf list installed: 列出所有安装了的 RPM 包 (用处: 该命令用于列出所有安装了的 RPM 包)
  • dnf list available: 列出所有可供安装的 RPM 包 (用处: 该命令用于列出来自所有可用软件库的可供安装的软件包)
  • dnf search <package name>: 搜索软件库中的 RPM 包 (用处: 当你不知道你想要安装的软件的准确名称时, 你可以用该命令来搜索软件包. 你需要在”search” 参数后面键入软件的部分名称来搜索.)
  • dnf provides /bin/bash: 查找某一文件的提供者 (用处: 当你想要查看是哪个软件包提供了系统中的某一文件时, 你可以使用这条命令.)
  • dnf info <package name>: 查看软件包详情 (用处: 当你想在安装某一个软件包之前查看它的详细信息时, 这条命令可以帮到你.)
  • dnf install <package name>: 安装软件包

apt

Debian 与 Ubuntu 的包管理工具

命令

apt 命令 等价的命令 命令的功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search apt-cache search 搜索应用程序
apt show apt-cache show 显示装细节
apt list 列出包含条件的包 (已安装, 可升级等)
apt edit-sources 编辑源列表

APT 包管理系统会将下载的 .deb 包缓存在 /var/cache/apt/archives

find

查找文件的利器

find [path...] [expression]

options

  • path: find 命令所查找的目录路径. 例如用. 来表示当前目录, 用 / 来表示系统根目录
  • expression: expression 可以分为——“-options [-print -exec -ok…]”
    • -options, 指定 find 命令的常用选项, 下节详细介绍
      • -name: 文件名字, find. -name "*.c"
      • -iname: 不区分大小写的 name
      • -type: 文件类型
        • f: 普通文件
        • d: 目录
        • l: 符号链接文件
        • b: 块设备文件
        • c: 字符设备文件
        • p: 管道文件
      • -user: 按照文件属主来查找文件 find ~ -user sam -print
      • -perm: 按照文件权限来查找文件 find. -perm 755 -print
      • -nogroup: 查找无有效属组的文件
      • -nouser: 查找无有效属主的文件
      • -size: 查找文件长度为 n 块的文件, 带有 c 时表示文件长度以字节计.
      • -depth: 深度
      • -follow: 遇到符号链接文件时, 跟踪至链接指向的文件
    • -print, find 命令将匹配的文件输出到标准输出
    • -exec, find 命令对匹配的文件执行该参数所给出的 shell 命令. 相应命令的形式为 'command' {} \;, 注意 {}\; 之间的空格
    • -ok, 和 -exec 的作用相同, 只不过以一种更为安全的模式来执行该参数所给出的 shell 命令, 在执行每一个命令之前, 都会给出提示, 让用户来确定是否执行.

example

  • find /etc -type d –print: 在 / etc 目录下查找所有的目录
  • find.! -type d –print: 在当前目录下查找除目录以外的所有类型的文件
  • find /etc -type l –print: 在 / etc 目录下查找所有的符号链接文件
  • find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找
  • find./ -size 0 -exec rm { } \;: 删除文件大小为零的文件
  • find. -type f -exec ls -l { } \;: 用 ls -l 命令列出所匹配到的文件
  • find. -name '*.tmp' -exec rm { } \;: 找到并删除
  • find /logs -type f -mtime +5 -exec rm { } \;: 在 / logs 目录中查找更改时间在 5 日以前的文件并删除它们
  • find. -size +1000000c –print: 在当前目录下查找文件长度大于 1 M 字节的文件
  • find /home/apache -size 100c –print: 在 / home/apache 目录下查找文件长度恰好为 100 字节的文件
  • find. -size +10 –print: 在当前目录下查找长度超过 10 块的文件 (一块等于 512 字节)
  • sudo find / -name ".DS_Store" -depth -exec rm {} \;: 删除 Mac 中所有的 .DS_Store 文件
  • find. -name '*.DS_Store' -type f -delete: 删除本路径下的所有的 .DS_Store 文件

mkdir

  • mkdir: 新建一个文件夹

参数

  • -v

范例

rm

rm filename: 删除一个文件

范例

  • rm -R: 删除文件夹及其下所有的文件
  • rm dir/*: 删除文件夹及其下所有的文件 (不删除 dir 文件夹本身及子文件夹)
  • rm -r dir/*: 删除文件夹及其下所有的文件 (不删除 dir 文件夹本身)

ls

  • ls: 列出当前目录下的所有文件及文件夹 (包括隐藏文件, 但是不包括以 . 开头的文件
    • ls ~/.oh-my-zsh/themes: 查看 zsh 下可用的主题
    • ls -d: 仅列出当前目录下的目录, 不列出文件
    • ls -a: 列出所有文件, 包括以 . 开头的文件
    • ls -l: 列出文件的详细信息 (以 line 形式列出文件及信息), 信息包含文件属性, 权限, 修改时间等
    • ls -l **/*.sh: 使用 * 进行匹配

head [option] [file]: 从开始的位置正序查看文件

参数

  • -q: 隐藏文件名
  • -v: 显示文件名
  • -c<num>: 显示的字符数
  • -n<num: 显示的行数

范例

  • head text.log: 显示前 10 行 (默认就是 10 行)
  • head -n 5 test.log: 显示前 5 行
  • head -c 20 test.log: 显示前 20 个字符

tail

tail [option] <file>: 从末尾的地方倒序查看文件

参数

  • -f: 循环读取
  • -q: 不显示处理信息
  • -v: 显示详细的处理信息
  • -c<数目>: 显示的字节数
  • -n<行数>: 显示文件的尾部 n 行内容
  • --pid=PID: 与 -f 合用, 表示在进程 ID,PID 死掉之后结束
  • -q, --quiet, --silent: 从不输出给出文件名的首部
  • -s, --sleep-interval=S: 与 -f 合用, 表示在每次反复的间隔休眠 S 秒

范例

  • tail notes.log: 显示最后 10 行
  • tail -f notes.log: 此命令显示 notes.log 文件的最后 10 行. 当将某些行添加至 notes.log 文件时, tail 命令会继续显示这些行. 显示一直继续, 直到按下 (Ctrl-C) 组合键停止显示.
  • tail -n +20 notes.log: 从第 20 行到末尾
  • tail -c 10 notes.log: 显示文件的最后 10 个字符

xargs

很多命令是不支持管道作为其输入的, 比如 echo, echo "hello world" | echo 是不会有任何输出的. 我们可以使用 xargs 将上一管道的输出转换为命令行参数, 进而使本管道的命令可以正常使用. echo "hello world" | xargs echo

绝大多数情况下, xargs 都是配合管道使用的.

参数

  • -d: delim, 分隔符, 默认的 xargs 分隔符是回车, argument 的分隔符是空格, 这里修改的是 xargs 的分隔符.
  • -p: 当每次执行一个 argument 的时候询问一次用户.

himg

  • -t: 表示先打印命令, 然后再执行. 与 -p 的不同是可以不经过确认直接执行, 仅提示

  • -I {}: 将传入的参数命名为 {}, 之后便可以使用 {} 代替传入的参数.

  • -0: findfd 默认的输出文件是以空格为分隔符, findfd 可以使用 -0 命令输出以 null (也叫 \0) 分隔的结果,
    然后 xargs 指定 -0 便可以接受此类型的数据, 因此正好与之相匹配!

  • -L num: 从标准输入一次读取 num 行转换为命令行参数

    1
    2
    3
    4
    $ echo -e "a\nb\nc" | xargs -L 1 echo
    a
    b
    c
  • -n num: 每次将多少项转换为命令行参数

    1
    2
    3
    4
    5
    6
    $ echo {0..9} | xargs -n 2 echo
    0 1
    2 3
    4 5
    6 7
    8 9
  • -a: file 从文件中读入作为 stdin

  • -e: flag, 注意有的时候可能会是 -E, flag 必须是一个以空格分隔的标志, 当 xargs 分析到含有 flag 这个标志的时候就停止.

  • -r: no-run-if-empty 当 xargs 的输入为空的时候则停止 xargs, 不用再去执行了.

  • -s num: 命令行的最大字符数, 指的是 xargs 后面那个命令的最大命令行字符数.

  • -l: 同 -L.

  • -x: exit 的意思, 主要是配合 -s 使用..

  • -P: 修改最大的进程数, 默认是 1, 为 0 时候为 as many as it can, 这个例子我没有想到, 应该平时都用不到的吧.

范例

  • fd -0 -e md Blog | xargs -0 -I {} echo {}: 查找名字中含 Blog 的 md 文件, 然后打印出来 (xargs 指定参数名为 {})
  • fd -0 -e md Blog | xargs -0 -p -I {} echo "{}\n": 打印输出结果并换行
  • find. -type f -print | xargs file 查找系统中的每一个普通文件, 然后使用 xargs 命令来测试它们分别属于哪类文件
  • find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件 (core dump), 然后把结果保存到 / tmp/core.log 文件中:
  • find. -type f -print | xargs grep "hostname" 用 grep 命令在所有的普通文件中搜索 hostname 这个词
  • find./ -mtime +3 -print|xargs rm -f –r 删除 3 天以前的所有东西 (find. -ctime +3 -exec rm -rf {} ;)
  • find./ -size 0 | xargs rm -f & 删除文件大小为零的文件

shutdown

  • shutdown: 关机指令, 你可以 man shutdown 来看一下帮助文档. 例如你可以运行如下命令关机:
  • shutdown -h now: 立马关机
  • shutdown -h +10: 十分钟后关机
  • shutdown -h 10: 计算机将在 10 分钟后关机, 并且会显示在登陆用户的当前屏幕中.
  • shutdown -h 20:25: 系统会在今天 20:25 关机
  • shutdown -r now: 系统立马重启
  • shutdown -r +10: 系统十分钟后重启
  • reboot: 就是重启, 等同于 shutdown –r now
  • halt: 关闭系统, 等同于 shutdown –h now 和 poweroff

netstat

  • netstat -tunlp | grep 端口号

    • -t: (tcp) 仅显示 tcp 相关选项
    • -u: (udp) 仅显示 udp 相关选项
    • -n: 拒绝显示别名, 能显示数字的全部转化为数字
    • -l: 仅列出在 Listen(监听) 的服务状态
    • -p: 显示建立相关链接的程序名
  • netstat -ntlp: 查看当前所有 tcp 端口

  • netstat -ntulp | grep 3306: 查看所有 3306 端口使用情况

grep

grep (global search regular expression(RE) and print out the line, 全面搜索正则表达式并把行打印出来) 是一种强大的文本搜索工具, 它能使用正则表达式搜索文本, 并把匹配的行打印出来.

匹配模式

  • ^: 锚定行的开始 如: ^grep 匹配所有以 grep 开头的行.
  • $: 锚定行的结束 如: grep$ 匹配所有以 grep 结尾的行.
  • .: 匹配一个非换行符的字符 如: gr.p 匹配 gr 后接一个任意字符, 然后是 p.
  • *: 匹配零个或多个先前字符 如: *grep 匹配所有一个或多个空格后紧跟 grep 的行. .* 一起用代表任意字符.
  • []: 匹配一个指定范围内的字符, 如’[Gg]rep’匹配 Grep 和 grep.
  • [^]: 匹配一个不在指定范围内的字符, 如: [^A-FH-Z]rep 匹配不包含 A-F 和 H-Z 的一个字母开头, 紧跟 rep 的行.
  • \(..\): 标记匹配字符, 如: \(love\), love 被标记为 1.
  • \<: 锚定单词的开始, 如: \<grep 匹配包含以 grep 开头的单词的行.
  • \>: 锚定单词的结束, 如 grep\> 匹配包含以 grep 结尾的单词的行.
  • x\{m\}: 连续重复字符 x, m 次, 如: o\{5\} 匹配包含连续 5 个 o 的行.
  • x\{m,\}: 连续重复字符 x, 至少 m 次, 如: o\{5,\} 匹配至少连续有 5 个 o 的行.
  • x\{m,n\}: 连续重复字符 x, 至少 m 次, 不多于 n 次, 如: o\{5,10\} 匹配连续 5–10 个 o 的行.
  • \w: 匹配一个文字和数字字符, 也就是 [A-Za-z0-9], 如: G\w*p 匹配以 G 后跟零个或多个文字或数字字符, 然后是 p.
  • \W: w 的反置形式, 匹配一个非单词字符, 如点号句号等. \W * 则可匹配多个.
  • \b: 单词锁定符, 如: \bgrep\b 只匹配 grep, 即只能是 grep 这个单词, 两边均为空格.

命令参数

  • -?: 同时显示匹配行上下的? 行, 如: grep -2 pattern filename 同时显示匹配行的上下 2 行.
  • -b, --byte-offset: 打印匹配行前面打印该行所在的块号码.
  • -r, -d recurse: 递归搜索
  • -c,--count: 只打印匹配的行数, 不显示匹配的内容.
  • -f File, --file=File: 从文件中提取模板. 空文件中包含 0 个模板, 所以什么都不匹配.
  • -h, --no-filename: 当搜索多个文件时, 不显示匹配文件名前缀.
  • -i, --ignore-case: 忽略大小写差别.
  • -q, --quiet: 取消显示, 只返回退出状态. 0 则表示找到了匹配的行.
  • -l, --files-with-matches: 打印匹配模板的文件清单.
  • -L, --files-without-match: 打印不匹配模板的文件清单.
  • -n, --line-number: 在匹配的行前面打印行号.
  • -s, --silent: 不显示关于不存在或者无法读取文件的错误信息.
  • -v, --revert-match: 反检索, 只显示不匹配的行.
  • -w, --word-regexp: 如果被 <和 > 引用, 就把表达式做为一个单词搜索.
  • -V, --version: 显示软件版本信息.

范例

  • ls -l | grep '^a': 通过管道过滤 ls -l 输出的内容, 只显示以 a 开头的行.
  • grep 'test' d*: 显示所有以 d 开头的文件中包含 test 的行.
  • grep 'test' aa bb cc: 显示在 aa, bb, cc 文件中匹配 test 的行.
  • grep '[a-z]' aa: 显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行.
  • grep 'w(es)t.*' aa: 如果 west 被匹配, 则 es 就被存储到内存中, 并标记为 1, 然后搜索任意个字符 (.*), 这些字符后面紧跟着另外一个 es(),
    找到就显示该行. 如果用 egrep 或 grep -E, 就不用 “”号进行转义, 直接写成 'w(es)t.*' 就可以了.
  • grep -i pattern files: 不区分大小写地搜索. 默认情况区分大小写
  • grep -l pattern files: 只列出匹配的文件名,
  • grep -L pattern files: 列出不匹配的文件名,
  • grep -w pattern files: 只匹配整个单词, 而不是字符串的一部分 (如匹配‘magic’, 而不是‘magical’),
  • grep -C number pattern files: 匹配的上下文分别显示 [number] 行,
  • grep pattern1 | pattern2 files: 显示匹配 pattern1 或 pattern2 的行,
  • grep pattern1 files | grep pattern2: 显示既匹配 pattern1 又匹配 pattern2 的行.

cp

命令参数

  • -a: 此参数的效果和同时指定 “-dpR” 参数相同;
  • -d: 当复制符号连接时, 把目标文件或目录也建立为符号连接, 并指向与源文件或目录连接的原始文件或目录;
  • -f: 强行复制文件或目录, 不论目标文件或目录是否已存在;
  • -i: 覆盖既有文件之前先询问用户;
  • -l: 对源文件建立硬连接, 而非复制文件;
  • -p: 保留源文件或目录的属性;
  • -R/r: 递归处理, 将指定目录下的所有文件与子目录一并处理;
  • -s: 对源文件建立符号连接, 而非复制文件;
  • -u: 使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时, 才复制文件;
  • -S: 在备份文件时, 用指定的后缀 “SUFFIX” 代替文件的默认后缀;
  • -b: 覆盖已存在的文件目标前将目标文件备份;
  • -v: 详细显示命令执行的操作.

范例

  • cp -r aaa/.*./bbb: 将 aaa 目录下的, 所有 . 开头的文件, 复制到 bbb 目录中.
  • cp -rfb./*../backup: 将当前目录下所有文件, 复制到当前目录的兄弟目录 backup 文件夹中
  • cp file /usr/men/tmp/file1: 将文件 file 复制到目录 /usr/men/tmp 下, 并改名为 file1
  • cp -R /usr/men /usr/zh 将目录 /usr/men 下的所有文件及其子目录复制到目录 / usr/zh 中

scp

scp 是基于 ssh 协议的 cp, 我们使用 scp 时相当于使用 ssh 登录后再进行拷贝操作
-p 参数用来保留修改时间 (modification time), 访问时间 (access time), 文件状态 (mode) 等原始文件的信息.

命令参数

1
scp [option] source destination
  • -c: 指定文件拷贝数据传输的加密算法
  • -C: 是否在传输时压缩文件
  • -F: 用来指定 ssh_config 文件, 供 ssh 使用.
  • -l: 用来限制传输数据的带宽速率, 单位是 Kbit/sec. 对于多人分享的带宽, 这个参数可以留出一部分带宽供其他人使用.
  • -P: 用来指定远程主机的 SSH 端口. 如果远程主机使用默认端口 22, 可以不用指定, 否则需要用 - P 参数在命令中指定.
  • -q: 用来关闭显示拷贝的进度条.
  • -r: 表示是否以递归方式复制目录.
  • -v: 用来显示详细的输出.

示例

  • scp SourceFile user@host:directory/TargetFile
  • scp file.txt remote_username@10.10.0.2:/remote/directory
  • scp -r documents username@server_ip:/path_to_remote_directory: 将本机的 documents 目录拷贝到远程主机, 会在远程主机创建 documents 目录
  • scp -r localmachine/path_to_the_directory username@server_ip:/path_to_remote_directory/: 将本机整个目录拷贝到远程目录下
  • scp -r localmachine/path_to_the_directory/* username@server_ip:/path_to_remote_directory/: 将本机目录下的所有内容拷贝到远程目录下
  • scp user@host:directory/SourceFile TargetFile: 远程文件复制到本地
  • scp -r username@server_ip:/path_to_remote_directory local-machine/path_to_the_directory/: 拷贝一个远程目录到本机目录下
  • scp -r username@server_ip:/path_to_remote_directory/* local-machine/path_to_the_directory/: 拷贝远程目录下的所有内容, 到本机目录下
  • scp user@host1:directory/SourceFile user@host2:directory/SourceFile: 两个远程系统之间复制数据

sed

sed 是一种流编辑器, 它是文本处理中非常重要的工具, 能够完美的配合正则表达式使用, 功能不同凡响. 处理时, 把当前处理的行存储在临时缓冲区中, 称为
模式空间 (pattern space), 接着用 sed 命令处理缓冲区中的内容, 处理完成后, 把缓冲区的内容送往屏幕. 接着处理下一行, 这样不断重复, 直到文件末尾.
文件内容并没有 改变, 除非你使用重定向存储输出. Sed 主要用来自动编辑一个或多个文件; 简化对文件的反复操作; 编写转换程序等.

命令参数

  • -e<script>, --expression=<script>: 以选项中指定的 script 来处理输入的文本文件.
  • -f<script 文件>, --file=<script 文件 >: 以选项中指定的 script 文件来处理输入的文本文件.
  • -h, --help: 显示帮助.
  • -n, --quiet, --silent: 仅显示 script 处理后的结果.
  • -V, --version: 显示版本信息.
  • -E: 使用 extended regular expression (默认是 basic regular expressions BRE’s)
  • -r: 与 -E 相同

动作参数

  • a: 新增, a 的后面可以接字串, 而这些字串会在新的一行出现 (目前的下一行)
  • c: 取代, c 的后面可以接字串, 这些字串可以取代 n1,n2 之间的行!
  • d: 删除, 因为是删除啊, 所以 d 后面通常不接任何咚咚;
  • i: 插入, i 的后面可以接字串, 而这些字串会在新的一行出现 (目前的上一行);
  • p: 打印, 亦即将某个选择的数据印出. p 会与参数 -n 一起运行, 否则会打印两遍
  • n: 读取下一个输入行, 用下一个命令处理新的行而不是用第一个命令.
  • s: 取代, 可以直接进行取代的工作哩! 通常这个 s 的动作可以搭配正规表示法! 例如 1,20s/old/new/g 就是啦!
  • q: 退出 sed
  • r file: 从 file 中读行
  • w file: 写并追加模板快到 file 末尾

范例

  • sed -n l: 在终端中显示按下的组合键所输出的序列 (可以方便的自定义组合键)
  • find. -name "*.txt" | xargs grep -P 'regex' -o: xargs 会将 find 结果作为 grep 的输入, 防止 find 结果过多无法处理, -P
    参数表明要应用正则表达式, -o 表示只输出匹配的字符串, 这样我们就可以把正则匹配到的结果拿到了.
  • sed -e 4a\newLine testfile: 在 testfile 文件的第四行后添加一行, 并将结果输出到标准输出
  • nl /etc/passwd | sed '2,5d': 将 /etc/passwd 的内容列出并且打印行号, 同时, 请将第 2~5 行删除!
  • nl /etc/passwd | sed '2d': 只要删除第 2 行
  • nl /etc/passwd | sed '3,$d': 要删除第 3 到最后一行
  • nl /etc/passwd | sed '/root/d': 删除 / etc/passwd 所有包含 root 的行, 其他行输出
  • nl /etc/passwd | sed -n '10p': 打印第 10 行内容
  • sed -n 'p' /etc/passwd
  • sed -n '/root/p' /etc/passwd: 正则匹配打印
  • nl /etc/passwd | sed -n '10,20p': 打印第 10 行到 20 行
  • nl /etc/passwd | sed -n '/news/,/nobody/p': 用正则来指定一个行的范围
  • nl /etc/passwd | sed -n '10,20!p': 不选择 10 到 20 行, ! 代表取反
  • nl /etc/passwd | sed -n '1~2p': 间隔行, 会输出 1,3,5…. 行
  • nl /etc/passwd | sed '1,2a **************' 后面插入
  • nl /etc/passwd | sed '1,2i **************': 前面插入
  • nl /etc/passwd | sed '1c abcd': 选中的行改为新的文本
  • sed 's/false/true/' /etc/passwd: 替换
  • sed 's/:/%/g' /etc/passwd: 全局替换
  • nl /etc/passwd|sed '{44,48d;s/false/true/}': 多个 sed 命令, 用 {} 包住, ; 隔开; 删除 44-48 行内容, 然后将 false 替换为 true
  • sed 's/^[a-z_]\+/& /' /etc/passwd: & 替换固定字符串, 代表前面匹配到的字符
  • sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/: \1, \2 表示前面 () 匹配到的字符
  • sed '1r 123.txt' abc.txt: 读取 123.txt 的内容, 复制到匹配的 abc.txt 文件的第一行, 文件内容均不改变
  • sed '2w 123.txt' abc.txt: 匹配 abc.txt 文件的第二行, 写入到 123.txt 文件中. 123.txt 文件会发生变化, abc
  • nl passwd | sed '2q': 找到结果后提前退出
  • /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
  • /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
  • nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/': e 表示多点编辑, 第一个编辑命令删除 /etc/passwd 第三行到末尾的数据, 第二条命令搜索 bash 替换为 blueshell.
  • sed -i 's/\.$/\!/g' regular_express.txt: 利用 sed 将 regular_express.txt 内每一行结尾若为. 则换成!
  • sed -i '$a # This is a test' regular_express.txt: 利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:

more

more <file>: 一页一页的显示文件内容, 不能向前翻页

less

less [option] file: less 是一个查看输出的工具, 一页一页的显示文件内容, 可以向后翻页, 操作的键位风格为 vim.

keymap

  • d: 向下翻动
  • u: 向上翻动
  • q: 退出 less 程序

options

  • -X / --no-init: 阻止 less 退出后清理屏幕
  • -+X: 重置 -X 选项, 使 less 退出后清理屏幕
  • -N: 显示行号
  • +F: 文件内容可能会改变 (打开日志文件时很有用)

tar

命令

  • tar [option] [archived file] [-C] [local path]: 解压或打包

    • -c: 建立压缩档案, creat

    • -x: 解压, extract

    • -t: 查看内容, list

    • -r: 向压缩归档文件末尾追加文件, add/replace

    • -u: 更新原压缩包中的文件, update

      这五个是独立的命令, 压缩解压都要用到其中一个, 可以和别的命令连用但只能用其中一个. 下面的参数是根据需要在压缩或解压档案时可选的.

    • -z: 调用 gzip 来压缩归档文件, 与 -x 联用时调用 gzip 完成解压缩

    • -Z: 调用 compress 来压缩归档文件, 与 -x 联用时调用 compress 完成解压缩

    • -j: 有 bz2 属性的, 调用 bz2 来压缩归档文件

    • -v: 显示所有过程

    • -w: 每一步要求确认

    • -O: 将文件解开到标准输出

    • -f: 指定档案名, 切记, 这个参数是最后一个参数, 后面只能接档案名.

    • -k: 保存已存在的文件不覆盖

    • -m: 还原文件时, 把所有文件的修改时间设置为现在

    • -O: 将条目标准输出, 不还原到磁盘

    • -p: 恢复权限 (包括 ACL, 作者, 文件标记)

范例

  • tar -xzvf /bbs.tar.zip -C /zzz/bbs: 把根目录下的 bbs.tar.zip 解压到 / zzz/bbs 下, 前提要保证存在 / zzz/bbs 这个目录, 与 cp 不同, cp 如果不存在这个目录就会自动创建这个目录
  • tar -czvf /zzz.tar.gz./zzz: 将当前目录下的 zzz 文件打包到根目录下并命名为 zzz.tar.gz
  • tar -cf all.tar *.jpg: 这条命令是将所有.jpg 的文件打成一个名为 all.tar 的包. -c 是表示产生新的包, -f 指定包的文件名.
  • tar -rf all.tar *.gif: 这条命令是将所有.gif 的文件增加到 all.tar 的包里面去
  • tar -uf all.tar logo.gif: 这条命令是更新原来 tar 包 all.tar 中 logo.gif 文件
  • tar -tf all.tar: 这条命令是列出 all.tar 包中所有文件
  • tar -xf all.tar: 这条命令是解出 all.tar 包中所有文件
  • tar -cvf jpg.tar *.jpg: 将目录里所有 jpg 文件打包成 tar.jpg
  • tar -czf jpg.tar.gz *.jpg: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 gzip 压缩, 生成一个 gzip 压缩过的包, 命名为 jpg.tar.gz
  • tar -cjf jpg.tar.bz2 *.jpg: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 bzip2 压缩, 生成一个 bzip2 压缩过的包, 命名为 jpg.tar.bz2
  • tar -cZf jpg.tar.Z *.jpg: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 compress 压缩, 生成一个 umcompress 压缩过的包, 命名为 jpg.tar.Z

解压说明

  • *.tar 用 tar -xvf 解压
  • *.gz 用 gzip -d 或者 gunzip 解压
  • .tar.gz: 用 tar -xzf 解压
  • .tgz: 用 tar -xzf 解压
  • *.bz2: 用 bzip2 -d 或者用 bunzip2 解压
  • *.tar.bz2: 用 tar -xjf 解压
  • *.Z: 用 uncompress 解压
  • *.tar.Z: 用 tar -xZf 解压
  • *.rar: 用 unrar e 解压
  • *.zip: 用 unzip 解压

curl

curl ifconfig.me: 获得本地在公网的 ip

curl 即 客户端 (client) 的 url 工具的意思, 主要用于调试 HTTP 请求, 运用娴熟后可替代 postman 等图形化调试工具

options

  • -A: 设置 Agent
  • -H:
  • -b: 向服务器发送 Cookie
  • -c: 将服务器设置的 cookie 写入一个文件
  • -o: 将服务器的回应保存成文件
  • -O: 将服务器回应保存成文件, 并将 URL 的最后部分当作文件名.

example

  • curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com: 将 User-Agent 改成 Chrome 浏览器
  • curl -A '' https://google.com: 移除 Agent 头
  • curl -H 'User-Agent: php/1.0' https://google.com: 直接指定标头, 更改 User-Agent
  • curl -b 'foo1=bar;foo2=bar2' https://google.com: 向服务器发送两个 cookie
  • curl -b cookies.txt https://www.google.com: 读取本地文件 cookies.txt, 里面是服务器设置的 Cookie(参见 - c 参数), 将其发送到服务器.
  • curl -b 'foo=bar' https://google.com: 生成一个标头 Cookie: foo=bar, 向服务器发送一个名为 foo, 值为 bar 的 Cookie.
  • curl -c cookies.txt https://www.google.com: 将服务器的 HTTP 回应所设置 Cookie 写入文本文件 cookies.txt.
  • curl -o example.html https://www.example.com: 将 www.example.com 保存成 example.html
  • curl -O https://www.example.com/foo/bar.html: 将服务器回应保存成文件, 文件名为 bar.html.

lsof

himg

  • lsof -i:8080: 查看 8080 端口占用
  • lsof abc.txt: 显示开启文件 abc.txt 的进程
  • lsof -c abc: 显示 abc 进程现在打开的文件
  • lsof -c -p 1234: 列出进程号为 1234 的进程所打开的文件
  • lsof -g gid: 显示归属 gid 的进程情况
  • lsof +d /usr/local/: 显示目录下被进程开启的文件
  • lsof +D /usr/local/: 同上, 但是会搜索目录下的目录, 时间较长
  • lsof -d 4: 显示使用 fd 为 4 的进程
  • lsof -i -U: 显示所有打开的端口和 UNIX domain 文件

wget

Linux 自带的必不可少的下载工具

命令

  • 启动参数:
    • -V: -version 显示 wget 的版本后退出
    • -h: -help 打印语法帮助
    • -b: -background 启动后转入后台执行
    • -e: -execute=COMMAND 执行.wgetrc 格式的命令, wgetrc 格式参见 /etc/wgetrc 或 ~/.wgetrc
  • 记录和输入文件参数:
    • -o, -output-file=FILE 把记录写到 FILE 文件中
    • -a, -append-output=FILE 把记录追加到 FILE 文件中
    • -d, -debug 打印调试输出
    • -q, -quiet 安静模式 (没有输出)
    • -v, -verbose 冗长模式 (这是缺省设置)
    • -nv, -non-verbose 关掉冗长模式, 但不是安静模式
    • -i, -input-file=FILE 下载在 FILE 文件中出现的 URLs
    • -F, -force-html 把输入文件当作 HTML 格式文件对待
    • -B, -base=URL 将 URL 作为在 - F -i 参数指定的文件中出现的相对链接的前缀
    • -sslcertfile=FILE 可选客户端证书
    • -sslcertkey=KEYFILE 可选客户端证书的 KEYFILE
    • -egd-file=FILE 指定 EGD socket 的文件名
  • 下载参数:
    • -bind-address=ADDRESS 指定本地使用地址 (主机名或 IP, 当本地有多个 IP 或名字时使用)
    • -t, -tries=NUMBER 设置最大尝试链接次数 (0 表示无限制).
    • -O -output-document=FILE 把文档写到 FILE 文件中
    • -nc, -no-clobber 不要覆盖存在的文件或使用.# 前缀
    • -c, -continue 接着下载没下载完的文件
    • -progress=TYPE 设置进程条标记
    • -N, -timestamping 不要重新下载文件除非比本地文件新
    • -S, -server-response 打印服务器的回应
    • -spider 不下载任何东西
    • -T, -timeout=SECONDS 设置响应超时的秒数
    • -w, -wait=SECONDS 两次尝试之间间隔 SECONDS 秒
    • -waitretry=SECONDS 在重新链接之间等待 1…SECONDS 秒
    • -random-wait 在下载之间等待 0…2*WAIT
    • -Y, -proxy=on/off 打开或关闭代理
    • -Q, -quota=NUMBER 设置下载的容量限制
    • -limit-rate=RATE 限定下载输率
  • 目录参数:
    • -nd -no-directories 不创建目录
    • -x, -force-directories 强制创建目录
    • -nH, -no-host-directories 不创建主机目录
    • -P, -directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
    • -cut-dirs=NUMBER 忽略 NUMBER 层远程目录
  • HTTP 选项参数:
    • -http-user=USER 设置 HTTP 用户名为 USER.
    • -http-passwd=PASS 设置 http 密码为 PASS
    • -C, -cache=on/off 允许 / 不允许服务器端的数据缓存 (一般情况下允许)
    • -E, -html-extension 将所有 text/html 文档以. html 扩展名保存
    • -ignore-length 忽略 Content-Length 头域
    • -header=STRING 在 headers 中插入字符串 STRING
    • -proxy-user=USER 设置代理的用户名为 USER
    • -proxy-passwd=PASS 设置代理的密码为 PASS
    • -referer=URL 在 HTTP 请求中包含 Referer: URL 头
    • -s, -save-headers 保存 HTTP 头到文件
    • -U, -user-agent=AGENT 设置代理的名称为 AGENT 而不是 Wget/VERSION
    • -no-http-keep-alive 关闭 HTTP 活动链接 (永远链接)
    • -cookies=off 不使用 cookies
    • -load-cookies=FILE 在开始会话前从文件 FILE 中加载 cookie
    • -save-cookies=FILE 在会话结束后将 cookies 保存到 FILE 文件中
  • FTP 选项参数:
    • -nr, -dont-remove-listing 不移走.listing 文件
    • -g, -glob=on/off 打开或关闭文件名的 globbing 机制
    • -passive-ftp 使用被动传输模式 (缺省值).
    • -active-ftp 使用主动传输模式
    • -retr-symlinks 在递归的时候, 将链接指向文件 (而不是目录)
  • 递归下载参数:
    • -r, -recursive 递归下载--慎用!
    • -l, -level=NUMBER 最大递归深度 (inf 或 0 代表无穷)
    • -delete-after 在现在完毕后局部删除文件
    • -k, -convert-links 转换非相对链接为相对链接
    • -K, -backup-converted 在转换文件 X 之前, 将之备份为 X.orig
    • -m, -mirror 等价于 -r -N -l inf -nr
    • -p, -page-requisites 下载显示 HTML 文件的所有图片
  • 递归下载中的包含和不包含 (accept/reject):
    • -A, -accept=LIST 分号分隔的被接受扩展名的列表
    • -R, -reject=LIST 分号分隔的不被接受的扩展名的列表
    • -D, -domains=LIST 分号分隔的被接受域的列表
    • -exclude-domains=LIST 分号分隔的不被接受的域的列表
    • -follow-ftp 跟踪 HTML 文档中的 FTP 链接
    • -follow-tags=LIST 分号分隔的被跟踪的 HTML 标签的列表
    • -G, -ignore-tags=LIST 分号分隔的被忽略的 HTML 标签的列表
    • -H, -span-hosts 当递归时转到外部主机
    • -L, -relative 仅仅跟踪相对链接
    • -I, -include-directories=LIST 允许目录的列表
    • -X, -exclude-directories=LIST 不被包含目录的列表
    • -np, -no-parent 不要追溯到父目录
    • wget -S -spider url 不下载只显示过程

范例

  • wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 使用 wget 下载单个文件
  • wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080: 下载并以不同文件名保存; wget 默认会以最后一个符合”/“ 的后面的字符来命令, 对于动态链接的下载通常文件名会不正确.
  • wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 限速下载
  • wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 断点续传下载
  • wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 对大文件进行后台下载 (使用 tail -f wget-log 可查看下载进度及速度)
  • wget --spider URL: 测试下载速度
  • wget -i filelist.txt: 下载 filelist.txt 文件中的多个链接文件
  • wget --mirror -p --convert-links -P./LOCAL URL: 使用 wget –mirror 镜像网站
    • –miror: 开户镜像下载
    • -p: 下载所有为了 html 页面显示正常的文件
    • –convert-links: 下载后, 转换成本地的链接
    • -P./LOCAL: 保存所有文件和目录到本地指定目录
  • wget --reject=gif url: 下载整个网站, 但是不下载 gif 图片
  • wget -o download.log URL: 将下载信息存入日志文件
  • wget -Q5m -i filelist.txt: 当下载文件大小大于 5m 时退出下载
  • wget -r -A.pdf url: 下载指定格式的文件

date

date 是 Linux 系统里自带的一个系统命令, 用来显示当前的系统时间, 通过控制格式输出可以得到我们需要的时间字符串

  • %%: 一个文字的 %
  • %a: 当前 locale 的星期名缩写 (例如: 日, 代表星期日)
  • %A: 当前 locale 的星期名全称 (如: 星期日)
  • %b: 当前 locale 的月名缩写 (如: 一, 代表一月)
  • %B: 当前 locale 的月名全称 (如: 一月)
  • %c: 当前 locale 的日期和时间 (如: 2005 年 3 月 3 日 星期四 23:05:25)
  • %C: 世纪; 比如 %Y, 通常为省略当前年份的后两位数字 (例如: 20)
  • %d: 按月计的日期 (例如: 01)
  • %D: 按月计的日期; 等于 %m/%d/%y
  • %e: 按月计的日期, 添加空格, 等于 %_d
  • %F: 完整日期格式, 等价于 %Y-%m-%d
  • %g: ISO-8601 格式年份的最后两位 (参见 %G)
  • %G: ISO-8601 格式年份 (参见 %V), 一般只和 %V 结合使用
  • %h: 等于 %b
  • %H: 小时 (00-23)
  • %I: 小时 (00-12)
  • %c: 按年计的日期 (001-366)
  • %k: 时 (0-23)
  • %l: 时 (1-12)
  • %m: 月份 (01-12)
  • %M: 分 (00-59)
  • %n: 换行
  • %N: 纳秒 (000000000-999999999)
  • %p: 当前 locale 下的 “上午” 或者 “下午”, 未知时输出为空
  • %P: 与 %p 类似, 但是输出小写字母
  • %r: 当前 locale 下的 12 小时时钟时间 (如: 11:11:04 下午)
  • %R: 24 小时时间的时和分, 等价于 %H:%M
  • %s: 自 UTC 时间 1970-01-01 00:00:00 以来所经过的秒数
  • %S: 秒 (00-60)
  • %t: 输出制表符 Tab
  • %T: 时间, 等于 %H:%M:%S
  • %u: 星期, 1 代表星期一
  • %U: 一年中的第几周, 以周日为每星期第一天 (00-53)
  • %V: ISO-8601 格式规范下的一年中第几周, 以周一为每星期第一天 (01-53)
  • %w: 一星期中的第几日 (0-6), 0 代表周一
  • %W: 一年中的第几周, 以周一为每星期第一天 (00-53)
  • %x: 当前 locale 下的日期描述 (如: 12/31/99)
  • %X: 当前 locale 下的时间描述 (如: 23:13:48)
  • %y: 年份最后两位数码 (00-99)
  • %Y: 年份
  • %z +hhmm: 数字时区 (例如, -0400)
  • %:z +hh:mm: 数字时区 (例如, -04:00)
  • %::z +hh:mm:ss: 数字时区 (例如, -04:00:00)
  • %:::z: 数字时区带有必要的精度 (例如, -04, +05:30)
  • %Z: 按字母表排序的时区缩写 (例如, EDT)

默认情况下, 日期的数字区域以 0 填充.
以下可选标记可以跟在 % 后:

  • -: (连字符) 不填充该域
  • _: (下划线) 以空格填充
  • 0: (数字 0) 以 0 填充
  • ^: 如果可能, 使用大写字母
  • #: 如果可能, 使用相反的大小写

在任何标记之后还允许一个可选的域宽度指定, 它是一个十进制数字. 作为一个可选的修饰声明, 它可以是 E, 在可能的情况下使用本地环境关联的 表示方式; 或者是 O, 在可能的情况下使用本地环境关联的数字符号.

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ date "+%Y-%m-%d"
2013-02-19
$ date "+%H:%M:%S"
13:13:59
$ date "+%Y-%m-%d %H:%M:%S"
2013-02-19 13:14:19
$ date "+%Y_%m_%d %H:%M:%S"
2013_02_19 13:14:58
$ date -d today
Tue Feb 19 13:10:38 CST 2013
$ date -d now
Tue Feb 19 13:10:43 CST 2013
$ date -d tomorrow
Wed Feb 20 13:11:06 CST 2013
$ date -d yesterday
Mon Feb 18 13:11:58 CST 2013

top

top 命令是 linux 的性能分析工具, 能实时显示系统的资源占用情况, Mac 下的 top 与 Linux 下的 top 使用方式有所不同, 这里仅记录下 Linux 下 top 命令的使用

界面解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ top

top - 19:02:28 up 2:22, 1 user, load average: 0.00, 0.01, 0.02
Tasks: 277 total, 1 running, 276 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.9 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.1 hi, 0.1 si, 0.0 st
MiB Mem: 7807.3 total, 5265.6 free, 1285.3 used, 1256.4 buff/cache
MiB Swap: 2016.0 total, 2016.0 free, 0.0 used. 6259.5 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11166 hanley 20 0 306196 54624 16036 S 1.0 0.7 0:49.53 Xorg
1505 dbus 20 0 90748 7584 4368 S 0.3 0.1 0:24.50 dbus-daemon
1510 root 20 0 381404 8276 5376 S 0.3 0.1 0:06.27 rngd
2086 root 20 0 1129944 46620 21360 S 0.3 0.6 0:11.45 containerd
11294 hanley 20 0 2689256 170932 62564 S 0.3 2.1 0:39.83 gnome-shell
11797 hanley 20 0 651800 39868 28444 S 0.3 0.5 0:10.27 gnome-terminal-
11835 hanley 20 0 727700 27720 20496 S 0.3 0.3 0:26.27 prlcc
12124 root 20 0 388144 13776 11700 S 0.3 0.2 0:03.05 abrt-dbus
25861 hanley 20 0 64036 5048 4132 R 0.3 0.1 0:17.73 top
1 root 20 0 246080 15172 8968 S 0.0 0.2 0:03.70 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/0
10 root 20 0 0 0 0 I 0.0 0.0 0:03.41 rcu_sched
  • up: 自开机至现在的运行时间
  • user: 多少个用户在占用系统资源
  • load average: 1 分钟, 5 分钟, 15 分钟的负载情况
  • Tasks: 说明现在一共有 277 个进程, 其中处于运行的有一个, 276 个处于休眠状态 (sleeping), 0 个处于 stopped 状态, 零个处于僵尸状态 (zombie)
  • %Cpu(s): cpu 状态信息
    • 0.8% us — 用户空间占用 CPU 的百分比.
    • 0.9% sy — 内核空间占用 CPU 的百分比.
    • 0.0% ni — 改变过优先级的进程占用 CPU 的百分比
    • 98.2 % id — 空闲 CPU 百分比
    • 0.0% wa — IO 等待占用 CPU 的百分比
    • 0.1% hi — 硬中断 (Hardware IRQ) 占用 CPU 的百分比
    • 0.0% si — 软中断 (Software Interrupts) 占用 CPU 的百分比
  • MiB Mem: 内存状态
    • 7807.3 MB total — 物理内存总量
    • 5265.6 free — 空闲内存总量
    • 1285.3 used — 使用中的内存总量
    • 1256.4 buff/cache — 缓存的内存量
  • Mid Swap: 交换分区信息
    2016.0 total — 交换区总量
    2016.0 free — 空闲交换区总量
    0.0 used — 使用的交换区总量
    6259.5 cached — 缓冲的交换区总量
  • 任务属性
    • PID: 进程 id
    • USER: 进程所有者
    • PR: 进程优先级
    • NI: nice 值. 负值表示高优先级, 正值表示低优先级
    • VIRT: 进程使用的虚拟内存总量, 单位 kb. VIRT=SWAP+RES
    • RES: 进程使用的, 未被换出的物理内存大小, 单位 kb. RES=CODE+DATA
    • SHR: 共享内存大小, 单位 kb
    • S: 进程状态. D = 不可中断的睡眠状态 R = 运行 S = 睡眠 T = 跟踪 / 停止 Z = 僵尸进程
    • %CPU: 上次更新到现在的 CPU 时间占用百分比
    • %MEM: 进程使用的物理内存百分比
    • TIME+: 进程使用的 CPU 时间总计, 单位 1/100 秒
    • COMMAND: 进程名称 (命令名 / 命令行)

命令

  • top: 进入资源监控默认页面, 页面显示如上

  • top -c: 显示完整命令

  • top -b: 以批处理模式显示程序信息

  • top -S: 已累计模式显示信息

  • top -d 3: 设置信息更新时间, 表示更新周期为三秒

  • top -n 2: 设置信息更新次数, 表示更新两次后终止更新显示

  • top -p 574: 显示指定的进程信息

  • top 基本视图操作

    • 1: 监控多个核心的各自状态
    • b: 以行背景高亮显示 running 的进程
    • y: 以行前景高亮显示 running 的进程
    • x: 以行背景高亮模式显示当前排序列及当前 running 的进程
    • < / >: 切换当前排序列
    • h: 显示帮助画面, 给出一些简短的命令总结说明
    • k: 终止一个进程.
    • i: 忽略闲置和僵死进程. 这是一个开关式命令.
    • q: 退出程序
    • r: 重新安排一个进程的优先级别
    • S: 切换到累计模式
    • s: 改变两次刷新之间的延迟时间 (单位为 s), 如果有小数, 就换算成 m s. 输入 0 值则系统将不断刷新, 默认值是 5 s
    • f / F: 从当前显示中添加或者删除项目
    • o / O: 改变显示项目的顺序
    • l: 切换显示平均负载和启动时间信息
    • m: 切换显示内存信息
    • t: 切换显示进程和 CPU 状态信息
    • c: 切换显示命令名称和完整命令行
    • M: 根据驻留内存大小进行排序
    • P: 根据 CPU 使用百分比大小进行排序
    • T: 根据时间 / 累计时间进行排序
    • W: 将当前设置写入 ~/.toprc 文件中

常见问题解决

mac 设置允许安装任何来源的软件

1
2
sudo spctl --master-disable
defaults write com.apple.LaunchServices LSQuarantine -bool false

切换 shell

  1. cat /etc/shells: 常看当前系统支持的 shell 类型
  2. chsh -s /bin/zsh: 将 zsh 设置成默认的 shell
  3. source ~/.zshrc: 重载 zsh 的配置文件
    • . ~/.zshrc: 同 source ~/.zshrc, .source 的缩写形式
    • exec $SHELL -l: 重新启动 SHELL, 与 source 不同的是不会对 PATH 进行重新写入

延伸