{"id":16547949,"url":"https://github.com/xjh22222228/linux-manual","last_synced_at":"2025-04-07T13:06:36.753Z","repository":{"id":53521835,"uuid":"261078273","full_name":"xjh22222228/linux-manual","owner":"xjh22222228","description":"🐧 Linux command reference manual; Linux 常用命令参考手册, 日常运维的最佳拍档。","archived":false,"fork":false,"pushed_at":"2022-01-13T02:36:33.000Z","size":1017,"stargazers_count":319,"open_issues_count":0,"forks_count":46,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-03-31T11:04:21.937Z","etag":null,"topics":["linux","linux-manual"],"latest_commit_sha":null,"homepage":"https://github.com/xjh22222228/linux-manual","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xjh22222228.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-04T04:13:34.000Z","updated_at":"2025-03-20T10:22:26.000Z","dependencies_parsed_at":"2022-09-02T02:02:23.588Z","dependency_job_id":null,"html_url":"https://github.com/xjh22222228/linux-manual","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xjh22222228%2Flinux-manual","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xjh22222228%2Flinux-manual/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xjh22222228%2Flinux-manual/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xjh22222228%2Flinux-manual/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xjh22222228","download_url":"https://codeload.github.com/xjh22222228/linux-manual/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247657277,"owners_count":20974344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["linux","linux-manual"],"created_at":"2024-10-11T19:24:02.806Z","updated_at":"2025-04-07T13:06:36.731Z","avatar_url":"https://github.com/xjh22222228.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"media/poster.jpg\" width=\"210\" /\u003e\n  \u003cbr /\u003e\n  \u003cb\u003eLinux 常用命令参考手册\u003c/b\u003e\n  \u003cp align=\"center\"\u003e日常运维的最佳拍档 x 112\u003c/p\u003e\n  \u003cp align=\"center\"\u003e一张网页概括，没有晦涩难度的例子！\u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/xjh22222228/linux-manual/stargazers\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/stars/xjh22222228/linux-manual\" alt=\"Stars\"/\u003e\n    \u003c/a\u003e\n    \u003cimg alt=\"Linux\" src=\"https://img.shields.io/static/v1.svg?label=\u0026message=Linux\u0026style=flat-square\u0026color=efdf07\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/xjh22222228/linux-manual\" /\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n---\n\n\n\n\n\n\n\n\n# 目录\n- [文件](#文件)\n  - [查看文件内容](#查看文件内容)\n    - [head](#head)\n    - [tail](#tail)\n    - [cat](#cat)\n    - [nl](#nl)\n    - [more](#more)\n  - [创建](#创建)\n    - [touch](#touch)\n    - [mkdir](#mkdir)\n    - [mktemp](#mktemp)\n  - [删除](#删除)\n    - [rm](#rm)\n    - [rmdir](#rmdir)\n  - [查找文件](#查找文件)\n    - [find](#find)\n    - [locate](#locate)\n  - [ls](#ls)\n  - [pwd](#pwd)\n  - [wc](#wc)\n  - [chattr](#chattr)\n  - [paste](#paste)\n  - [stat](#stat)\n  - [grep](#grep)\n  - [sed](#sed)\n  - [cd](#cd)\n  - [cp](#cp)\n  - [mv](#mv)\n  - [open](#open)\n  - [source](#source)\n  - [tree](#tree)\n  - [ln](#ln)\n  - [file](#file)\n  - [sort](#sort)\n  - [uniq](#uniq)\n  - [split](#split)\n  - [vim](#vim)\n- [系统管理](#系统管理)\n  - [nohup](#nohup)\n  - [watch](#watch)\n  - [ping](#ping)\n  - [which](#which)\n  - [shutdown](#shutdown)\n  - [reboot](#reboot)\n  - [uptime](#uptime)\n  - [crontab](#crontab)\n  - [at](#at)\n  - [uname](#uname)\n  - [ifconfig](#ifconfig)\n  - [whereis](#whereis)\n  - [chmod](#chmod)\n  - [lsof](#lsof)\n  - [chown](#chown)\n  - [systemctl](#systemctl)\n  - [service](#service)\n  - [free](#free)\n  - [type](#type)\n  - [alias](#alias)\n  - [time](#time)\n  - [jobs](#jobs)\n  - [\u0026](#\u0026)\n  - [screen](#screen)\n- [系统进程](#系统进程)\n  - [ps](#ps)\n  - [pstree](#pstree)\n  - [top](#top)\n  - [netstat](#netstat)\n  - [kill](#kill)\n  - [killall](#killall)\n- [用户管理](#用户管理)\n  - [useradd](#useradd)\n  - [userdel](#userdel)\n  - [passwd](#passwd)\n  - [chpasswd](#chpasswd)\n  - [chsh](#chsh)\n  - [chfn](#chfn)\n  - [usermod](#usermod)\n  - [users](#users)\n  - [who](#who)\n  - [w](#w)\n  - [last](#last)\n  - [su](#su)\n  - [whoami](#whoami)\n- [环境变量](#环境变量)\n  - [printenv](#printenv)\n  - [set](#set)\n  - [export](#export)\n  - [unset](#unset)\n- [压缩、解压](#压缩、解压)\n  - [zip](#zip)\n  - [unzip](#unzip)\n  - [gzip](#gzip)\n  - [bzip2](#bzip2)\n  - [tar](#tar)\n- [加解密](#加解密)\n  - [md5sum](#md5sum)\n  - [base64](#base64)\n- [网络](#网络)\n  - [ssh](#ssh)\n  - [wget](#wget)\n  - [curl](#curl)\n  - [scp](#scp)\n  - [rsync](#rsync)\n- [磁盘](#磁盘)\n  - [df](#df)\n  - [du](#du)\n- [包管理](#包管理)\n  - [yum](#yum)\n  - [apt-get](#apt-get)\n- [其他](#其他)\n  - [目录名称含义](#目录名称含义)\n  - [重定向输入和输出](#重定向输入和输出)\n  - [管道](#管道)\n  - [echo](#echo)\n  - [date](#date)\n  - [man](#man)\n  - [sleep](#sleep)\n  - [history](#history)\n  - [xargs](#xargs)\n  - [cal](#cal)\n  - [expr](#expr)\n  - [bc](#bc)\n  - [timeout](#timeout)\n  - [exit](#exit)\n  - [basename](#basename)\n  - [read](#read)\n  - [tee](#tee)\n  - [clear](#clear)\n  \n\n\n\n\n\n\n# 文件\n\n## 查看文件内容\n\n## head\n显示文件的头部内容，默认前10行\n\n```bash\n# 显示前10行内容\n$ head README.md\n\n# 或者显示多个文件\n$ head README.md package.json\n\n# -n 指定显示行数\n$ head -n 100 README.md\n```\n\n\n\n\n## tail\n显示文件的末尾部分，默认后10行\n\n| 参数    | 描述              |\n| ------ |------------------ |\n| -n     | 指定显示末尾行数     |\n| -f     | 实时监听并打印文件变化, 文件删除后不在监听     |\n| -F     | 实时监听并打印文件变化, 文件删除后继续监听     |\n| -c     | 指定显示文件最后N个字符     |\n\n```bash\n# 默认显示末尾10行\n$ tail README.md\n\n# -n 指定显示末尾20行\n$ tail -n 20 README.md\n\n# 实时监听README.md文件变化\n$ tail -f README.md\n\n# 根据文件名进行追踪, 如果删除后创建相同的文件名会继续追踪\n$ tail -F README.md\n\n# 显示文件的最后10个字符\n$ tail -c 10 README.md\n```\n\n\n\n\n\n\n## cat\n查看文件全部内容，如果文件太大，头部部分内容会被截掉。\n\n```bash\n# 查看 README.md 文件全部内容\n$ cat README.md\n$ cat README.md README2.md  # 多个文件\n\n# -n 每一行显示行号包括空行\n$ cat -n README.md\n\n# -b 只在有内容的行显示行号\n$ cat -b README.md\n```\n\n\n\n\n\n## nl\n同样用来打印内容，与 `cat` 命令不同的是打印内容会自动加上行号, 但 `nl` 命令可以对行号做特别的定制，主要针对行号有特别高要求的用户。\n\n- -b: 指定行号指定的方式\n  - -b a 无论是否为空行一样列出行号 (等价 `cat -n`)\n  - -b t 空行不列出行号, 默认 (等价 `cat -b`)\n- -n: 列出行号表示的方法\n  - -n ln 行号在萤幕的最左方显示\n  - -n rn 行号在自己栏位的最右方显示，且不加 0\n  - -n rz 行号在自己栏位的最右方显示，且加 0\n\n```bash\n# 打印内容并输出行号, 除了空号\n# 等价于 cat -b README.md\n$ nl README.md\n\n# 空行同样打印行号\n$ nl -b a README.md\n```\n\n\n\n\n\n\n\n\n\n\n## more\n分页查看文件内容, 每次查看一屏, 每屏能显示多少内容取决于终端大小。\n\n与 `cat` 命令不同，`cat` 只能一次显示全部内容，如果内容太多部分会被截取掉。\n\n快捷键：\n- `空格` 或 `PageUp` - 查看下一屏内容\n- `B` 或 `PageDown` - 查看上一屏内容\n- `回车` - 查看下一行内容\n- `Q` - 退出\n\n```bash\n$ more README.md\n\n# 从第10行开始显示\n$ more +10 README.md\n\n# 显示查看进度\n$ more -d README.md # --More--(17%)[Press space to continue, 'q' to quit.]\n```\n\n\n\n\n## 创建\n\n\n## touch\n创建一个空文件, 如果文件存在只会修改文件的创建时间\n\n```bash\n$ touch README.md\n```\n\n\n## mkdir\nmake directory, 创建目录。\n\n```bash\n# 在当前目录下创建 temp 目录\n$ mkdir temp\n\n# 创建多层目录\n$ mkdir -p temp/temp2/temp3\n\n# 基于权限创建\n$ mkdir -m 777 temp\n```\n\n\n\n## mktemp\n创建临时目录或文件，Linux使用 `/tmp` 目录来存放不需要永久保留的文件，大多数Linux发行版配置了系统在启动时自动删除 `/tmp` 目录的所有文件。\n\n默认情况下， `mktemp` 会在本地目录中创建一个文件，只要指定一个文件名模板就行，模板可以包含任意文本文件名，在文件名末尾加上 **6** 个X就行了。\n\n```bash\n# 创建本地临时文件, 会在当前目录下创建一个叫 log.XXXXXX, XXXXXX是一个随机字符码，保证文件名在目录中是唯一的。\n$ mktemp log.XXXXXX  # log.J3awfb\n\n# -t, 在 /tmp 目录创建临时文件, 返回绝对路径地址\n$ mktemp -t log.XXXXXX # /tmp/log.G5g9dX\n\n# -d 创建临时目录, 这样就能用该目录进行任何需要的操作了，比如创建其他的临时文件\n$ mktemp -d dir.XXXXXX\n```\n\n\n\n\n\n\n## 删除\n\n\n# rm\n删除指定目录或文件\n\n注: 使用此命令需要非常小心, 一但删除无法恢复\n```bash\n# 删除当前目录下的 1.txt 文件\n$ rm 1.txt\n\n# -i 删除前询问是否真的要删除，因为一旦删除无法恢复\n$ rm -i README.md\n\n# 这条命令比较常用, 强制删除目录或文件\n# -r 如果是目录递归删除, -f 强制删除 不发出任何警告\n$ rm -rf ./src\n```\n\n\n\n\n## rmdir\n删除指定空目录\n\n注：`rmdir` 实际上用得并不多，因为不是很灵活，基本上使用 `rm` 代替\n```bash\n# 删除当前 temp 空目录, 如果不是空目录会发出警告\n$ rmdir temp\n\n# -p 参数可以删除多层空目录, 发现temp3是空目录删除掉，然后接着往父级找如果还是空目录继续删除...\n$ rmdir -p temp1/temp2/temp3\n\n# -i 删除前询问确认删除\n$ rmdir -i temp\n```\n\n\n\n\n\n\n## 查找文件\n\n\n## find\n指定某个目录下查找文件\n\n```bash\n# 在当前目录递归搜索文件名为 README.md 文件\n$ find . -name README.md\n# 也可以指定多个目录，比如 src1 src2目录\n$ find src1 src2 -name README.md\n\n# 通过通配符进行查找, 必须用引号括着, 这里查找所有后缀为 .md 文件\n$ find . -name \"*.md\"\n$ find . -iname \"*.md\"  # 忽略文件大小写\n\n# 排除文件，只要加 ! , 排除掉所有 .md 后缀的文件\n$ find . ! -name \"*.md\"\n\n# 根据类型进行过滤搜索\n# f 普通文件, l 符号连接\n# d 目录, c 字符设备\n# b 块设备, s 套接字, p Fifo\n$ find . -type f\n\n# 限定目录递归深度\n$ find . -maxdepth 3  # 最大为3个目录\n$ find . -mindepth 3  # 最小为3个目录\n\n# 查找文件大小大于 25k 文件 \n$ find /root -size +25k\n\n# 查找10天前文件 -mtime 修改时间、 -ctime 创建时间、 -atime 访问时间\n$ find /root -mtime +10\n```\n\n\n\n\n\n## locate\n搜索文件，与 `find` 命令很像，但更快，因为是从数据库里查找, 通常每天会进行数据更新。\n\n```bash\n# 搜索 README.md 相关文件\n$ locate README.md\n\n# 忽略大小写\n$ locate -i README.md\n```\n\n\n\n\n\n\n\n\n\n\n## ls\n显示当前目录下的文件和目录，输出的列表是按字母排序 (某些发行版可能不一样)。\n\n\n| 参数    | 描述              |\n| ------ |------------------ |\n| -l     | 显示目录列表的详细信息     |\n| -h     | 显示文件大小，需要和 -l 参数一起使用     |\n| -a     | 列出所有文件，包括隐藏文件     |\n| -F     | 显示文件类型     |\n| -i     | 查看inode编号, 每个文件都有唯一的编号     |\n| -S     | 以文件大小进行排序     |\n| -t     | 以文件修改时间排序     |\n| -r     | 输出结果倒序排列     |\n\n```bash\n# 显示当前目录列表\n$ ls\n\n# 列出指定目录下的列表\n$ ls ./src\n\n# 显示目录列表的详细信息\n$ ls -l\n\n# 显示目录列表详细信息和大小\n$ ls -lh\n\n# 列出所有文件包括隐藏文件\n$ ls -a\n\n# -F 可以显示类型，用以区分是文件还是目录\n# 后缀为 ”/“ 代表是目录，”*“ 为可执行文件，没有则为文件\n$ ls -F\n\n# 过滤文件列表, * 代表0个或多个字符， ? 代表一个字符\n$ ls javasc*\n\n# -i 查看inode编号, 每一个文件或目录都有一个唯一的编号，这个数字由内核分配给文件系统中的每一个对象\n$ ls -i\n```\n\n文件权限说明，当敲入 `ls -la` 最左侧会出现10个字符：\n```bash\n$ ls -la\n-rw-r--r--   1 root root     0 Jan  3 11:01 master-stderr.log\n```\n\n`[-][rwx][r-x][r--]` 转换为 `1 234 567 890`\n\n- 1 代表这个文件名是目录还是文件\n  - `-` 文件\n  - d 目录\n  - l 链接文件\n  - b 则表示为设备文件里面的可供储存的周边设备（可随机存取设备）\n  - c 则表示为设备文件里面的序列埠设备，例如键盘、鼠标（一次性读取设 备）\n- 234 拥有者权限, 分别为 可读、可写、可执行\n- 567 群组使用者权限, 分别为 可读、可写、可执行\n- 890 其他使用者权限, 分别为 可读、可写、可执行\n\n权限的位置是不会改变的，有权限则显示，无权限则 `-` 显示。\n\n\n\n\n\n\n\n\n## pwd\n是Print Working Directory的缩写, 显示当前工作目录\n\n```bash\n$ pwd\n```\n\n\n## wc\n统计文件的行数、字数、字节数, 常见用于统计代码行数\n\n```bash\n# 统计字节数\n$ wc -c README.md\n\n# 统计行数\n$ wc -l README.md\n\n# 统计字数\n$ wc -w README.md\n\n# 统计字符数\n$ wc -m README.md\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n## chattr\n用于修改文件属性, 这项指令可改变存放在ext2文件系统上的文件或目录属性。\n\n| 参数        | 描述              |\n| ----------- |------------------ |\n| a           | 让文件或目录仅供附加用途     |\n| b           | 不更新文件或目录的最后存取时间     |\n| c           | 将文件或目录压缩后存放     |\n| d           | 将文件或目录排除在倾倒操作之外     |\n| i           | 不得任意更动文件或目录     |\n| s           | 保密性删除文件或目录     |\n| S           | 即时更新文件或目录     |\n| u           | 预防意外删除     |\n| -R          | 递归处理，将指令目录下的所有文件及子目录一并处理     |\n| -v\u003c版本编号\u003e | 设置文件或目录版本     |\n| -V          | 显示指令执行过程     |\n| +\u003c属性\u003e     | 开启文件或目录的该项属性     |\n| -\u003c属性\u003e     | 关闭文件或目录的该项属性     |\n| =\u003c属性\u003e     | 指定文件或目录的该项属性     |\n\n\n```bash\n# 锁定该文件, 防止文件被修改或删除\n$ chattr +i README.md\n\n# -i 解锁文件\n$ chattr -i README.md\n\n# 可以使用 lsattr 查看赋予的属性\n$ lsattr README.md\n----i--------e-- README.md\n```\n\n\n\n\n\n\n\n\n## paste\n合并N个文件的列，相当于追加文件内容。\n\n```bash\n# 1.txt 和 2.txt 合并输出\n$ paste 1.txt 2.txt\n\n# 1.txt 2.txt 合并后保存为 3.txt\n$ paste 1.txt 2.txt \u003e 3.txt\n```\n\n\n\n\n\n## stat\n用于显示文件或目录的状态信息\n\n```bash\nstat logs\n# File: ‘logs/’\n# Size: 16384           Blocks: 32         IO Block: 4096   directory\n# Device: fd01h/64769d    Inode: 669067      Links: 5\n# Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)\n# Access: 2020-07-07 17:24:23.941816812 +0800\n# Modify: 2020-07-12 11:46:55.567707577 +0800\n# Change: 2020-07-12 11:46:55.567707577 +0800\n# Birth: -\n```\n\n\n\n\n\n## grep\n强大的文本搜索工具，被称为Linux命令三剑客之老三。\n\n命令用法：grep [option] pattern file...\n\n| 参数    | 描述              |\n| ------ |------------------ |\n| -i     | 忽略大小写     |\n| -n     | 打印匹配行号     |\n| -c     | 打印匹配成功的次数     |\n| --color| 高亮打印匹配文本     |\n| -o     | 只打印匹配到的内容     |\n| -v     | 反向查找     |\n| -E     | 正则查找     |\n| -w     | 匹配单词     |\n| -r     | 从目录下递归搜索     |\n\n```bash\n# 从 README.md 文件中搜索 linux 关键字\n$ grep \"linux\" README.md\n$ grep \"linux\" README.md README2.md # 多个文件搜索\n\n# 高亮打印匹配文本\n$ grep \"linux\" README.md --color\n\n# -o 只打印匹配到的内容\n$ grep -o \"linux\" README.md --color\n\n# -n 打印匹配的行号\n$ grep -n \"linux\" README.md\n\n# -c 只打印成功匹配的次数\n$ grep -c \"linux\" README.md\n\n# -r 递归搜索目录文件\n$ grep -r \"linux\" ./src\n\n# 使用 glob 风格表达式搜索\n# 等价于 grep -E \"[0-9]\" README.md\n$ egrep \"[0-9]\"\n```\n\n\n\n\n\n## sed\nsed(stream editor) 是一种流编辑器，它一次处理一行内容。处理时，把当前处理的行存储在临时缓冲区中，称为“模式空间”，接着用 sed 命令处理缓冲区中的内容，处理完成后，把缓冲区的内容送往屏幕。\n\n`sed` 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。\n\n命令格式：`sed options script file...`\n\n\n**选项**\n| 参数         | 描述              |\n| ----------- |------------------ |\n| -e script   | 在处理输入时，将script中指定的命令添加到已有的命令中     |\n| -f file     | 在处理输入时，将file中指定的命令添加到已有的命令中     |\n| -n          | 不产生命令输入，使用print命令来完成输出     |\n| -i          | 直接编辑文件并保存     |\n| -i.bak      | 备份文件并编辑保存     |\n\n\n来个简单的例子：\n```bash\n$ cat test.txt\ni like apple\ni like apple\ni like apple\ni like apple\n\n$ sed 's/apple/banana/' test.txt\ni like banana\ni like banana\ni like banana\ni like banana\n```\n\n运行上面例子结果就会马上显示出来。\n\n命令解释: `sed 's/要替换的内容/替换后的内容/' 文件名`, s(substitute)替代\n\n\n#### 执行多个命令\n如果需要执行多个命令时只要指定 `-e` 选项就可以了:\n```bash\n# 多个命令使用分号分隔\n$ sed 's/apple/banana/; s/i/I/' test.txt\nI like banana\nI like banana\nI like banana\nI like banana\n```\n\n\n#### 从文件中读取编辑器命令\n当需要执行大量命令时使用 `-e` 选项就有点鸡助了, 这时候可以将命令存储在一个单独文件中，然后在执行时指定 `-f` 选项读取。\n\n```bash\n$ cat cmd.sed\ns/apple/banana/\ns/i/I/\n\n# 执行\n$ sed -f cmd.sed test.txt\n```\n\n\n\n#### 直接编辑\n在执行 `sed` 时指定 `-i` 选项可以直接编辑文件并保存。\n\n```bash\n$ sed -i 's/apple/banana/' test.txt\n```\n\n如果是在 `mac` 上运行会报错：\n\n那是因为 mac 强制要求备份\n```bash\nsed: 1: \"test.txt\": undefined label '.txt'\n```\n\n```bash\n# 指定备份后缀 .bak 执行后将生成一个 test.txt.bak 文件\n$ sed -i '.bak' 's/apple/banana/' test.txt\n# 或者指定 -i.bak 选项, 会默认保存备份文件, 不需要指定备份后缀\n$ sed -i.bak 's/apple/banana/' test.txt\n```\n\n\n\n#### 替换标记\ns命令最后有一个可选的 flags `s/pattern/replacement/flags`, 有4种可用的标记：\n- 数字(大于0)，表明新文本将替换第几处模式匹配的地方\n- g, 全局匹配, 表示会替换所有匹配的文本\n- p, 表明原先的内容要先打印出来\n- w file, 将替换的结果写入到文件中\n\n**1、数字**:\n\n表明只替换每行中第二次出现的匹配模式。\n```bash\n$ cat test.txt\ni like apple apple\ni like apple apple\n\n$ sed 's/apple/banana/2' test.txt\ni like banana apple\ni like banana apple\n```\n\n**2、g**:\n\n在替换时如果不带 `g` 标记只会替换每行中第一次出现匹配模式。\n```bash\n$ cat test.txt\ni like apple apple\ni like apple apple\n\n# 没有带 g 标记\n$ sed 's/apple/banana/' test.txt\ni like banana apple\ni like banana apple\n\n# 带 g 标记\n$ sed 's/apple/banana/g' test.txt\ni like banana banana\ni like banana banana\n```\n\n**3、p**:\np 替换标记会打印与替换命令中指定的模式匹配的行，通常会与 `-n` 选项一起使用才能发挥更好的作用。\n\n-n 选项会禁止 `sed` 编辑器输出，但p替换标记会输出修改过的行，将两者配合使用的效果就是只输出被替换命令修改过的行。\n\n```bash\n$ cat test.txt\ni like apple apple\ni like apple apple\n\n$ sed -n 's/apple/banana/p' test.txt\ni like banana apple\ni like banana apple\n```\n\n\n**4、w**:\n\n将命令替换的结果写入到文件中\n```bash\n$ sed 's/apple/banana/w 1.txt' test.txt\n```\n\n\n#### 替换反斜杠\n当遇到需要匹配反斜杠 `/` 时就很麻烦了，需要做转义：\n\n```bash\n# 将 /bin/sh 替换为 /bin/bash\n$ sed 's/\\/bin\\/sh/\\/bin\\/bash/' test.txt\n```\n\n如果有大量这种反斜杠可读性就变差了， 还好 sed 提供了感叹号作为字符串分隔符：\n\n```bash\n# 感叹号是一个占位符, 代表的是 / 反斜杠\n$ sed 's!/bin/sh!/bin/bash!' test.txt\n```\n\n\n\n#### 使用地址\n默认情况下 `sed` 命令会作用于所有行，如果只想作用于某些行，比如第10行到100行，则必须用行寻址（Line Addressing）。\n\n有两种形式的行寻址：\n- 以数字形式表示行区间\n- 以文本模式来过滤出行\n\n**1、数字方式的行寻址：**\n\n以数字 2 表示只处理第2行\n```bash\n$ sed '2s/apple/banana/' test.txt\ni like apple\ni like banana\ni like apple\ni like apple\ni like apple\n```\n\n以区间来表示，第2行到3行\n```bash\n$ sed '2,3s/apple/banana/' test.txt\ni like apple\ni like banana\ni like banana\ni like apple\ni like apple\n```\n\n\n从某行开始的所有行, 用美元符号 `$` 表示末尾行\n```bash\n$ sed '2,$s/apple/banana/' test.txt\ni like apple\ni like banana\ni like banana\ni like banana\ni like banana\n```\n\n\n**2、以文本模式过滤出行**\n\n如果只想作用于 `B` 开头的行, 则可以使用文本模式过滤, 支持正则表达式。\n\n格式: `/pattern/command`\n```bash\n$ cat README.md\nA: Good\nB: Bad\nA: Good\nB: Bad\n```\n\n将所有 B 开头的 Bad 改成 Good!\n```bash\n$ sed '/B/s/Bad/Good!/' test.txt\nA: Good\nB: Good!\nA: Good\nB: Good!\n```\n\n**3、多个命令使用相同行寻址**\n\n要将多个命令使用相同行寻址可以使用分隔符：\n```bash\n$ sed '1,$s/Bad/Luck/;1,$s/Good/Nice!/' test.txt\nA: Nice!\nB: Luck\nA: Nice!\nB: Luck\n```\n\n这只是其中一种办法，更好的办法是使用花括号将多条命令组合在一起：\n\n```bash\n$ sed '1,${\ns/Bad/Luck/\ns/Good/Nice!/\n}' test.txt\n\n# 打印:\nA: Nice!\nB: Luck\nA: Nice!\nB: Luck\n```\n只在多个命令使用相同寻址才使用花括号。\n\n\n\n#### 删除行\n删除行使用 `d` 命令来执行, 使用该命令需要小心，如果不指定行寻址会删除所有行。\n\n\n只指定 `d` 命令将删除所有行\n```bash\n$ sed 'd' test.txt\n\n# 上面并不会删除所有行，你需要指定 -i 直接编辑\n$ sed -i 'd' test.txt\n```\n\n上面已经介绍过通过数字方式寻址行，同样适用删除：\n```bash\n# 只删除第一行\n$ sed '1d' test.txt\n```\n\n或者通过数字区间\n```bash\n# 删除1-3行\n$ sed '1,3d' test.txt\n\n# 删除第一行以及后面所有行\n$ sed '1,$d' test.txt\n```\n\n\n## 打印内容\n可以通过 `-n` 参数来打印指定的行内容\n\n打印 10-20 行内容：\n```bash\n$ sed -n '10,20p' README.md\n```\n\n打印第一行内容：\n```bash\n$ sed -n '1p' README.md\n```\n\n\n\n\n\n\n\n\n\n\n\n\n## cd\n进入指定目录\n\n```bash\n# 进入当前 src 目录\n$ cd src\n\n# 回到上一次目录\n$ cd -\n\n# 返回上一级目录\n$ cd ..\n$ cd ../../..   # 返回多级\n\n# 进入家目录\n$ cd ~\n$ cd  # 或者不带任何参数\n\n# 将上一个命令的参数作为cd参数使用\n$ cd !$\n\n# 模糊匹配目录，有时目录名很长一个一个敲效率就很低\n# * 代表0个或多个字符， ? 代表一个字符\n$ cd javasc*\n```\n\n\n\n\n\n\n\n## cp\n拷贝文件或目录\n\n```bash\n# 将当前 README.md 文件拷贝到上一层\n$ cp ./README.md ../README.md\n\n# -a 将原文件属性一同拷贝, 修改时间、创建时间等\n$ cp -a ./README.md ../README.md\n\n# -r 用于递归拷贝目录\n$ cp -r home ../home\n\n# -i 如果目标文件存在会询问用户是否需要覆盖\n$ cp -i README.md README.md\n```\n\n\n\n\n\n\n\n\n\n\n## mv\n`mv` 有2个用途：\n- 将文件或目录移动到另一个位置\n- 将文件或目录重命名\n\n注：实际上 `mv` 是用来移动文件或目录，只不过有类似重命名的功能而已。\n\n```bash\n# 将 README.md 重命名为 README-2.md, 如果 README-2.md 存在会直接覆盖。\n$ mv README.md README-2.md\n\n# 将 README.md 移动到上一层目录\n$ mv README.md ../README.md\n\n# -i 交互式操作，如果目标文件存在则进行询问是否覆盖\n$ mv -i README.md ../README.md\n\n# -f 如果出现同名直接覆盖\n$ mv -f 1.txt 2.txt\n```\n\n\n\n\n\n\n\n\n## open\n`open` 命令可在 `linux` / `mac` 具有可视化界面下进行文本编辑、打开应用程序等功能。\n\n| 参数    | 描述              |\n| ------ |------------------ |\n| -n     | 即使该应用程序已经在运行，也要打开它的新实例。(适用于Mac)     |\n| -e     | 使用默认编辑器打开文件     |\n| -a     | 用指定的应用程序来打开指定的文件     |\n\n```bash\n# 在mac下用Finder打开当前目录\n$ open .\n\n# 用默认应用程序打开文件\n$ open README.md\n\n# 用默认编辑器打开文件\n$ open -e README.md\n\n# 如果是一个URL用默认浏览器打开页面\n$ open https://github.com/xjh22222228/linux-manual.git\n\n# 指定某个应用程序打开某个文件, 如果不指定文件默认直接打开程序\n$ open -a /Applications/Google\\ Chrome.app README.md\n```\n\n\n\n\n## source\n在当前Shell环境中从指定文件读取和执行命令， 通常用于重新执行环境。\n\n它有个别名 `.` 点操作符号。\n\n```bash\n# 等价 . ~/.bash_profile\n$ source ~/.bash_profile\n```\n\n实际上大部分开发者都没搞懂 `source` 命令。 可以把它理解为编程语言中的 `import`, `java/python/js` 都有这个，就是用来导入文件。\n\n\n下面演示 source 用于 shell 脚本中\n\nutil.sh\n```bash\n#!/bin/bash\ngetName() {\n  echo \"Linux\"\n}\n```\n\nmain.sh\n```bash\n#!/bin/bash\n# 加载文件\nsource ./util.sh\n\n# 这样就可以调用 util 文件中的函数了\necho $(getName)\n```\n\n\n\n\n\n\n\n\n## tree\n生成目录树结构, 通常用于描述项目结构。\n\n```bash\n# 递归当前目录下所有文件并生成目录树\n$ tree\n# .\n# ├── LICENSE\n# ├── README.md\n# └── media\n#     └── poster.jpg\n\n\n# -I 忽略某些目录\n$ tree -I \"node_modules|.git|.svn\"\n\n# 只显示目录\n$ tree -d\n\n# 指定要递归的目录层级\n$ tree -L 3\n```\n\n\n\n\n\n## ln\n将某一个文件在另外一个位置建立并产生同步的链接。 当不同的2个目录需要同时引用某一个文件时此命令就派上用场了。\n\n软链接也可以叫符号链接：\n- 软链接，以路径的形式存在。类似于Windows操作系统中的快捷方式\n- 软链接可以 跨文件系统 ，硬链接不可以\n- 软链接可以对一个不存在的文件名进行链接\n- 软链接可以对目录进行链接\n\n硬链接：\n- 硬链接，以文件副本的形式存在。但不占用实际空间, 从根本上而言就是同一个文件。\n- 不允许给目录创建硬链接\n- 硬链接只有在同一个文件系统中才能创建\n\n\n\n共同点：\n- 修改原文件内容创建的链接文件也会同步修改\n\n\n\n```bash\n# 默认创建硬链接\n$ ln 1.md 2.md\n\n# -s 创建软链接, 2.md 就相当于副本\n$ ln -s 1.md 2.md\n\n# -f 强制执行创建\n$ ln -f README.md ./src/a.md\n```\n\n\n\n\n\n## file\n查看文件类型, 比如文件、目录、二进制、符号链接等\n\n```bash\n# 输出 README.md: ASCII text\n$ file README.md\n\n# index.html: HTML document, UTF-8 Unicode text, with very long lines, with no line terminators\n$ file index.html\n```\n\n\n\n\n\n## sort\n将文本内容以行为单位进行排序。\n\n\n| 参数    | 描述              |\n| ------ |------------------ |\n| -c     | 检查文件是否已排序，若已经排序则什么都不输出     |\n| -r     | 以倒序来排序     |\n| -b     | 忽略每行开头的空格     |\n| -o     | 将排序结果输出到文件     |\n| -u     | 排序并去重，每行都是唯一的     |\n| -n     | 按照数值大小排序     |\n\n\n\n```bash\n# 排序并打印到终端\n$ sort README.md\n\n# 排序并去重将结果输出到 u.md 文件，可以用来替代 uniq 命令\n$ sort -u README.md -o u.md\n```\n\n\n\n\n\n\n\n\n## uniq\n`uniq` 命令用于检查或删除文件中重复出现的行内容。\n\n```bash\n# 将 1.txt 文件重复内容过滤后输出到 2.txt 文件\n$ uniq 1.txt 2.txt\n\n# -c 在左边显示每行重复次数\n$ uniq -c 1.txt\n\n# -d 只显示重复行内容\n$ uniq -d 1.txt\n```\n\n`uniq` 命令有个问题，只能过滤相邻的内容，比如:\n```txt\n111\n111\n222\n333\n222\n```\n\n结果: 222 也重复但是不是相邻\n```txt\n111\n222\n333\n222\n```\n\n解决办法是配合使用 `sort` 命令, 原理是先排序为相邻再去重(实际上只用 sort 命令就能解决)：\n\n```bash\n$ sort 1.txt | uniq \u003e 2.txt\n```\n\n\n\n\n\n## split\n将一个文件切割成数个文件, 对于大文件来说非常实用。\n\n\n```bash\n# 将 README.md 文件每10行分割成一个文件\n$ split -10 README.md\n\n# -b 按字节分割\n$ split -b 100000 README.md\n\n# 指定分割后的文件名前缀为 READ ，分割后会自动在文件名后随机加上编号\n$ split -b 100000 README.md READ\n```\n\n\n\n\n## vim\nvi 编辑器是Unix系统最初的编辑器，在GNU项目将vi编辑器移植到开源世界时，他们决定对其做一些改进，开发人员也就将它重命名为 `vi improved`。\n\n`vim`(vi improved) 是 `vi` 的升级版，所以只需要知道 `vim` 即可， 是一个非强大的文本编辑器，学习成本不低，需要长期使用才能记牢每一个指令操作。\n\n这是一份速查表，使用的时候注意区分大小写。\n\nvim 的快捷键指令非常多，只列出一些实用性便于记忆。\n\n\n\n**打开文件**\n\n```bash\n# 最简单的打开文件方式, 如果文件不存在会开辟一段新的缓冲区域来编辑。\n$ vim README.md\n\n# 打开文件并定位到最后一行\n$ vim + README.md\n\n# 打开文件并定位到某一行, +号后面指定行数\n$ vim +100 README.md\n\n# 打开多个文件\n# :bn 切换下一个文件\n# :bp 切换上一个文件\n# :ls 列出所有已经打开的文件\n# :b2 切换到第2个文件, 2是个任意数字\n$ vim 1.txt 2.txt\n```\n\n\n\n\n\n**光标定位插入**\n\n| 快捷键      | 描述              |\n| ---------- |----------------- |\n| i   | 在当前光标位置插入 |\n| I   | 在当前光标行第一个字符插入 |\n| a   | 在当前光标后一个字符插入 |\n| A   | 光标到当前行最后一个字符插入 |\n| H   | 光标到第一行第一个字符 (是以终端大小来计算，不是原文本的第一行) |\n| M   | 光标到中间第一行 (是以终端大小来计算) |\n| L   | 光标到最后行第一个字符 (是以终端大小来计算) |\n| E   | 将光标定位到右边的空格 |\n| o   | 在当前光标下一行插入 |\n| O   | 在当前光标上一行插入 |\n| :n  | 将光标定位到 n 行 |\n\n\n**撤销**\n| 快捷键      | 描述              |\n| ---------- |----------------- |\n| u   | 撤销上一次编辑内容 |\n| U   | 撤销当前光标整行内容 |\n| Ctrl + r   | 还原初始文件状态 |\n| e!  | 撤销所有修改，恢复打开文件时的状态 |\n\n\n\n**删除**\n| 快捷键      | 描述              |\n| ---------- |----------------- |\n| dd   | 删除当前行 |\n| dj   | 删除上一行 |\n| dk   | 删除下一行 |\n| :1,$d   | 删除所有行 |\n\n\n\n\n**拷贝/粘贴**\n| 快捷键      | 描述              |\n| ---------- |----------------- |\n| yy  | 拷贝当前行 |\n| p   | 在当前光标粘贴上一次拷贝的内容 |\n\n\n\n\n\n\n**搜索**\n\n| 快捷键    | 描述              |\n| -------- |----------------- |\n| :/text   | 从上往下查找 text，按 `n` 向下搜索, 按 `N` 想前搜索 |\n| :?text   | 从下往上查找 text，按 `n` 向下搜索, 按 `N` 想前搜索 |\n\n\n\n**替换**\n\n要想匹配 `/` 需要反斜杠进行转义: `\\/`\n\n| 快捷键            | 描述              |\n| ---------------- |----------------- |\n| :s/old/new       | 找到old第一次出现的地方并用new来替换 |\n| :s/old/new/g     | 找到所有old出现的地方并用new来替换(当前屏幕) |\n| :%s/old/new/g    | 替换整个文件中的所有old |\n| :%s/old/new/gc   | 替换整个文件中的所有old，但在每次出现时询问是否替换 |\n| :n,ms/old/new/g  | 替换行号n和m之间的所有old |\n\n\n\n\n\n**退出**\n\n先按 `ESC` 键然后再操作后面的快捷键。\n\n| 快捷键     | 描述              |\n| --------- |----------------- |\n| :w        | 写入但不退出 |\n| :w!       | 强制保存，但不退出 |\n| :q!       | 退出但不保存 |\n| :wq       | 保存写入内容并退出 |\n| :w file   | 将当前文件内容保存到 file 文件中 |\n| :qa!      | 退出所有文件并不做保存，比如打开了多个文件 |\n\n\n\n\n\n**设置**\n\n| 快捷键 | 描述              |\n| ----- |----------------- |\n| :set ignorecase    | 忽略大小写查找 |\n| :set noignorecase  | 不忽略大小写查找 |\n| :set hlsearch      | 高亮搜索结果 |\n| :set nohlsearch    | 关闭高亮搜索显示 |\n| :set hlsearch      | 高亮搜索结果 |\n| :set number        | 显示行号 |\n| :set nonumber      | 不显示行号 |\n\n\n\n\n\n\n\n\n\n\n---\n# 系统管理\n\n\n\n\n\n## nohup\n程序以挂起方式运行。\n\n`nohup` 命令会自动将 STDOUT(标准输出)和STDERR(标准错误)的消息重定向到一个名为 `nohup.out` 文件。\n\n```bash\n# 例如运行一个 node.js 程序\n$ nohup node main.js\n\n# 在当前目录会出现 nohup.out 文件，里面包含了 Hello World\n$ nohup echo \"Hello World\"\n```\n\n\n\n\n## watch\n通常用于监听1个命令的运行结果、定时执行命令\n\n```bash\n# 每5秒执行一次 tail 命令, 如果不指定-n 默认为2秒\n$ watch -n 5 \"tail README.md\"\n\n# -d 高亮显示变化内容\n$ watch -n 5 -d \"tail README.md\"\n```\n\n\n\n\n\n## ping\n测试目标地址是否可连接、延迟度\n\n```bash\n# 测试 github.com 连通性, 按 ctrl + C 停止 \n$ ping github.com\n\n# ping 5次后断开\n$ ping -c 5 xiejiahe.com\n\n# 每5秒ping 一次\n$ ping -i 5 xiejiahe.com\n```\n\n\n\n\n## which\n查找某个命令存储在哪个位置, 输出绝对路径, `which` 会在环境变量 `$PATH` 设置的目录里去查找。\n\n注: 可以通过 `echo $PATH` 查看设置的目录。\n\n只有内建命令才会正常打印，判断是否内建命令可以通过 [type](#type) 检查。\n\n```bash\n$ which top  # /usr/bin/top\n\n# 查找pwd发现会找不到，因为 pwd 是shell内置命令\n$ which pwd\n\n# 打印多个命令\n $which ls vi\n```\n\n\n\n\n\n## shutdown\n将系统关机或重启操作。\n\n```bash\n# 什么参数都不加，默认会在1分钟后关机\n$ shutdown\n\n# 在将系统的服务停掉之后就重新开机\n$ shutdown -r now\n\n# 关闭系统并切断电源\n$ shutdown -h now # 立即关机, 实际上调用 init 0\n\n# 把前一个关机或重启取消掉\n$ shutdown -c\n\n# 设定一个时间关机,  \"\u0026\" 符号表示后台模式，让出CLI\n$ shutdown -h 05:33 \u0026\n$ shutdown +5 \"5分钟后关机\" # 5分钟后关机，同时送出警告信息给登入用户：\n```\n\n\n\n\n\n## reboot\n有点类似 `shutdown` 命令， 用于重新启动系统。\n\n```bash\n# 重启系统\n$ reboot\n\n# -f 强制重启\n$ reboot -f\n\n# 用于模拟重新启动系统，不会真实重启，数据会写入 /var/log/wtmp \n$ reboot -w\n\n# 在重新启动之前关闭所有网络界面\n$ reboot -i\n```\n\n\n\n\n\n\n\n\n\n## uptime\n查看系统负载信息， 此命令非常简单，没有太多的参数。\n\n```bash\n# 21:51:53 当前时间\n# up 750 days, 13:24  当前系统运行的天数，小时，分钟 （从上次开机起计算）\n# 1 user 当前系统登录用户数\n# load average: 0.08, 0.07, 0.06    一分钟、5分钟、15分钟平均负载, 这3个值不能大于CPU个数，如果大于了说明系统负载高，性能低。\n$ uptime # 21:51:53 up 750 days, 13:24,  1 user,  load average: 0.08, 0.07, 0.06\n```\n\n\n\n\n\n## crontab\n周期性执行任务, 通常用于定时执行作业。\n\n```bash\n# 列出该用户设置\n$ crontab -l\n\n# 编辑该用户设置\n$ crontab -e\n\n# 删除该用户设置\n$ crontab -r\n```\n\n\n`* * * * *` 分别含义：\n```bash\n*    *    *    *    *\n┬    ┬    ┬    ┬    ┬\n│    │    │    │    │\n│    │    │    │    │\n│    │    │    │    └───── 一周中的某一天 (0 - 7)  0或7代表是星期日\n│    │    │    └────────── 月份 (1 - 12)\n│    │    └─────────────── 一个月的某一天 (1 - 31)\n│    └──────────────────── 小时 (0 - 23)\n└───────────────────────── 分钟 (0 - 59)\n```\n\n#### 每天18点18分执行\n```bash\n18 18 * * * 指令\n```\n\n#### 每一分钟执行\n```bash\n* * * * */1 指令\n```\n\n#### 每个月的第一天中午12点\n```bash\n00 12 1 * * 指令\n```\n\n\n#### 每个月的最后一天\n每个月的最后一天就比较麻烦了, 需要配合 date 命令和 if 流程语句来实现,\n\n这里 if 语句检查明天的日期是不是01，如果是今天就是最后一天,\n\n每天中午12点检查今天是不是最后一天\n\n```bash\n00 12 * * * if [ `date +%d -d tomorrow` = 01 ] ; then ; 要执行的指令\n```\n\n\n#### 每周一到周六执行\n```bash\n0 0 * * 1,2,3,4,5,6 指令\n```\n\n#### 每天晚上11点到早上8点，每个一小时执行\n```bash\n0 23-8/1 * * * 指令\n```\n\n\n\n\n## at\n在指定时间执行指令，`at` 命令时间参数相当复杂，只需要了解常用即可。\n\n\n| 参数   | 描述              |\n| ----- |----------------- |\n| -d    | 删除已经设定的任务, atrm 别名 |\n| -v    | 显示任务将被执行的时间 |\n| -c    | 打印任务的内容到标准输出 |\n| -f    | 指定文件读取任务 |\n\n\n设定任务, 执行后进入交互输入要执行的指令, 按 `Ctrl+D` 完成并退出。\n```bash\n# 三天后的下午 5点\n$ at 5pm+3 days\n\n# 明天上午 11点11分\n$ at 11:11 tomorrow\n\n# 今天上午 11点11分\n$ at 11:11\n\n# 当前时间之后1分钟\n# year 年\n# month 月\n# day 日\n# hours 小时\n# minutes 分钟\n$ at now +1 minutes\n\n# 也可以通过管道执行，免去交互\necho \"ls\" | at 11:11\n```\n\n\n指定文件运行脚本\n```bash\n$ at 11:11 -f /opt/script.sh\n```\n\n\n\n\n查看当前任务队列\n```bash\n$ atq\n2       Sat Jan 30 11:46:00 2021 a root\n```\n\n查看指定任务内容\n```bash\n# 2为编号\n$ at -c 2\n```\n\n\n\n删除已经设定的任务\n```bash\n# 1 是编号, 通过 atq 查看\n$ at -d 1\n\n# 等价\n$ atrm 1\n```\n\n\n\n\n\n\n\n\n\n## uname\n打印系统信息\n\n| 参数  | 描述              |\n| ---- |------------------ |\n| -a   | 打印系统所有信息     |\n| -r   | 打印系统版本     |\n| -n   | 打印网络节点主机名称     |\n| -p   | 打印处理器名称     |\n| -m   | 打印主机的硬件架构名称     |\n\n```bash\n# 不带任何参数打印当前操作系统内核名称\n$ uname # Linux , 等价于 uname -s\n\n# 打印系统所有信息\n$ uname -a\n\n# -r 打印系统版本 , 如果次版本号都是偶数，说明是一个稳定版\n$ uname -r # 3.10.0-514.26.2.el7.x86_64\n\n# 打印网络节点主机名称\n$ uname -n # Yin.local\n\n# 打印处理器名称\n$ uname -p # i386\n\n# 打印主机的硬件架构名称\n$ uname -m # x86_64\n```\n\n\n\n\n\n## ifconfig\n配置或显示系统网卡的网络参数\n\n```bash\n# 显示所有网络参数信息\n$ ifconfig\n\n# 配置网卡IP地址\n$ ifconfig eth0 192.168.1.111\n```\n\n\n\n\n## whereis\n用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。\n\n注意：`whereis` 是从数据库里查找的，因此特别快，默认情况下一星期更新一次数据，所以有时会查找删除的数据或者刚建立的数据无法找到问题。\n```bash\n# 查找 nginx\n$ whereis nginx # nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz\n\n# -b 指定只查找二进制\n$ where -b nginx # nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx\n\n# -m 指定查找说明文件 man\n$ whereis -m nginx # nginx: /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz\n```\n\n\n\n\n\n\n\n\n\n\n\n## chmod\n修改文件或目录权限\n\nchmod [参数选项] [mode, 八进制或符号表示] files...\n\n- `u` 符号代表当前用户。\n- `g` 符号代表和当前用户在同一个组的用户，以下简称组用户。\n- `o` 符号代表其他用户。\n- `a` 符号代表所有用户。\n- `r` 符号代表读权限以及八进制数4。\n- `w` 符号代表写权限以及八进制数2。\n- `x` 符号代表执行权限以及八进制数1。\n- `X` 符号代表如果目标文件是可执行文件或目录，可给其设置可执行权限。\n- `s` 符号代表设置权限suid和sgid，使用权限组合u+s设定文件的用户的ID位，g+s设置组用户ID位。\n- `t` 符号代表只有目录或文件的所有者才可以删除目录下的文件。\n- `+` 符号代表添加目标用户相应的权限。\n- `-` 符号代表删除目标用户相应的权限。\n- `=` 符号代表添加目标用户相应的权限，删除未提到的权限。\n\n\n#### 文件权限码\n| 权限      | 二进制值 |八进制值 | 描述      |\n| -------- |-------- |------- |------------------ |\n| ---      | 000     |   0   | 没有任何权限     |\n| --x      | 001     |   1   | 只有执行权限     |\n| -w-      | 010     |   2   | 只有写入权限    |\n| -wx      | 011     |   3   | 有写入和执行权限     |\n| r--      | 100     |   4   | 只有读取权限     |\n| r-x      | 101     |   5   | 有读取和执行权限     |\n| rw-      | 110     |   6   | 有读取和写入权限     |\n| rwx      | 111     |   7   | 有全部权限     |\n\n\n\n\n\n```bash\n# README.md 文件设为所有用户可读取\n$ chmod a+r README.md\n\n# -R 递归目录下所有文件\n$ chmod a+r src/\n\n# 也可以用八进制符号表示\n# 3个数字分别为 x,y,z 表示User、Group、及Other的权限。\n# r=4, w=2, x=1\n$ chmod 777 README.md # 等价于 chmod a=rwx README.md\n```\n\n\n\n\n\n\n## lsof\n全名list open files, 列出当前系统已经被打开的文件。\n\n```bash\n## 打印所有打开文件的的列表\n$ lsof\n\n# 查看指定端口被占用情况\n$ lsof -i:8080\n\n# -p 列出指定进程号所打开的文件\n$ lsof -p 6112\n```\n\n\n\n\n\n\n\n\n\n## chown\n用来变更文件或目录的拥有者或所属群组\n\n\n```bash\n# 将 README.md 文件拥有者设为 byroot\n$ chown byroot README.md\n\n# 使用-R递归处理文件\n$ chown -R byroot src/\n\n# 改变所属群组, 拥有者设为 byroot 群组设为 byrootgroup\n$ chown byroot:byrootgroup README.md\n```\n\n\n\n\n\n\n## systemctl\n系统服务管理器指令, 通常用来设置某个服务器默认开机启动或关闭。\n\n命令：`systemctl [command] [unit]`\n\n```bash\n# 立即启动服务\n$ systemctl start nginx.service\n\n# 立即停止服务\n$ systemctl stop nginx.service\n\n# 重启服务，stop 后 start\n$ systemctl restart nginx.service\n\n# 重新载入服务, 一般情况下重新载入新的配置\n$ systemctl reload nginx.service\n\n# 下次开机时默认启动服务\n$ systemctl enable nginx.service\n\n# 下次开机时不会启动服务\n$ systemctl disable nginx.service\n\n# 查看某个服务状态信息\n$ systemctl status nginx.service\n\n# 当前服务是否正在运行中\n$ systemctl is-active nginx.service\n\n# 查看服务开机有没有默认启动\n$ systemctl is-enable nginx.service\n```\n\n\n\n\n\n\n## service\n管理操作系统服务的命令, 是Redhat Linux兼容的发行版中用来控制系统服务的实用工具，它以启动、停止、重新启动和关闭系统服务，还可以显示所有系统服务的当前状态。\n\n```bash\n# 启动 docker 服务\n$ service docker start\n\n# 查看 docker 状态\n$ service docker status\n\n# 停止 docker 服务\n$ service docker stop\n\n# 重新启动 docker 服务\n$ service docker restart\n\n# 查看所有服务状态\n$ service --status-all\n```\n\n\n\n\n\n\n\n## free\n显示内存使用情况\n\n| 参数  | 描述              |\n| ---- |------------------ |\n| -h   | 自动按大小转换对应单位进行格式化显示     |\n| -b   | 字节单位显示     |\n| -k   | KB单位显示     |\n| -m   | MB单位显示     |\n| -g   | GB单位显示     |\n| -s \u003c秒\u003e   | 每S秒监控内存使用情况     |\n\n\n\n解释：\n- total 内存总数\n- used 已使用内存\n- free 空闲内存\n- shared 当前已废弃内存\n- buff/cache 缓存内存数\n- available 可用内存数\n\n\n```bash\n$ free\n# 输出以下, 默认以字节为单位\n              total        used        free      shared  buff/cache   available\nMem:        1882192      485312      448424         704      948456     1204660\nSwap:             0           0           0\n\n# MB单位显示\n$ free -m\n\n# 10秒执行一次查询\n$ free -s 10\n```\n\n\n\n\n\n\n\n\n\n\n\n## type\n`type` 命令有2个作用：\n\n- 用来查找命令的位置，类似 which 命令\n- 检测某个命令是内建命令还是外部命令\n\n\n普及：内建命令和外部命令的区别：内建命令不会衍生出子进程，而外部命令会衍生出一个子进程然后执行命令, 所以内建命令执行效率要高。\n\n```bash\n# cd is a shell builtin  表示这是shell内建命令\n$ type cd\n\n# ps is hashed (/usr/bin/ps)  表示这是一个外部命令\n$ type ps\n```\n\n\n\n\n\n\n\n\n## alias\n设置命令别名，用于简化较长的命令。\n\n```bash\n# 列出所有已设置的别名\n$ alias\n\n# 设置别名\n$ alias ll='ls -l'\n```\n\n删除别名\n```bash\n# 删除所有别名\n$ unalias -a\n\n# 删除指定别名\n$ unalias ll\n```\n\n\n\n\n\n## time\n测试某条命令执行所需花费时间\n\n```bash\n# time 后面跟着要测试的命令\n# 输出:  0.02s user 0.01s system 0% cpu 6.233 total\n$ time curl https://github.com/xjh22222228/linux-manual\n```\n\n\n\n## jobs\n显示当前运行在后台模式中的所有用户的进程（作业）\n\n\n| 参数         | 描述              |\n| ----------- |------------------ |\n| -l          | 打印进程的PID和作业号以及作业命令     |\n| -n          | 只列出上次shell发出的通知后改变了状态的作业     |\n| -p          | 只列出作业的PID（进程ID）     |\n| -r          | 只列出运行中的作业     |\n| -s          | 只列出已停止的作业     |\n\n\n```bash\n# 先来启一个后台作业进程, \u0026 符号表示后台运行\n$ sleep 100 \u0026\n# 查看后台作业\n$ jobs # 输出：[1]+  Running       sleep 3 \u0026\n```\n\n相关命令 [\u0026](#\u0026)\n\n\n\n\n## \u0026\n`\u0026` 符号表示后台运行, 只要在命令后面加上 `\u0026` 符号即可。\n\n如果一个命令运行的时间非常长，比如处理文件、HTTP请求时就可以在后台运行，这样就可以让出shell继续执行其他命令。\n\n```bash\n# 模拟了休眠100秒并在后台运行\n$ sleep 100 \u0026\n```\n\n你可以通过 [jobs](#jobs) 命令来查看后台作业。\n\n\n\n\n\n## screen\nscreen 命令可以在当前窗口创建多个窗口。\n\n场景：比如我们在当前Shell窗口中运行 `python main.py` 后就不能操作其他了，除非使用 `nohup` 等命令挂载到后台。 screen 命令则可以解决此问题。\n\n\n`screen` 命令有些发行版Linux会自带，有些则没有，安装：\n```bash\n$ yum install screen -y\n```\n\n\n\n| 参数         | 描述              |\n| ----------- |------------------ |\n| -ls         | 列表当前所有session窗口     |\n| -S          | 新建窗口时指定名字     |\n| -r          | 回到指定名字Session窗口     |\n\n\n最简单的创建一个新窗口就是直接敲 `screen`\n```bash\n$ screen\n```\n\n最好的方式是指定 -S 给一个Session名字，以便知道这个窗口是干什么的:\n```bash\n$ screen -S python\n```\n\n列表所有Session窗口\n```bash\n$ screen -ls\n\nThere is a screen on:\n        18772.python    (Attached)\n1 Socket in /var/run/screen/S-root.\n```\n\n杀死Session窗口, `18722` 是Session Id, 通过 `screen -ls` 可以找到\n\n```bash\n$ screen -S 18722 -X quit\n```\n\n回到指定名字的Session窗口\n```bash\n$ screen -r python\n\n# 只有一个session情况下允许不指定名字\n$ screen -r\n```\n\n\n退出并杀死当前窗口，也可以按 `Ctrl+D`\n```bash\n$ exit\n```\n\n\n#### 快捷键\n只有在 screen session 窗口中使用\n\n| 参数         | 描述              |\n| ----------- |------------------ |\n| Ctrl+a x    | 锁定当前窗口，需要密码才能解开     |\n| Ctrl+a d   | 暂时离开当前窗口     |\n\n\n操作：按住 Ctrl+a 然后放, 再按 x。\n\n\n\n\n\n\n\n\n---\n# 系统进程\n\n\n## ps\n查看当前系统进程状态。\n\n`ps` 命令非常复杂，且参数极多，由于 `ps` 历史问题，参数风格支持了三种 `UNIX`/`BSD`/``GNU` 这里不详细的介绍，感兴趣可以自行了解。\n\n\n- Unix 风格参数 - 前面加单破折线\n- BSD 风格的参数 - 前面不加破折线\n- GNU 风格长参数 - 前面加双破折线\n\n\n#### Unix 风格参数\n| 参数         | 描述              |\n| ----------- |------------------ |\n| -A          | 显示所有进程     |\n| -N          | 显示与指定参数不符的所有进程       |\n| -a          | 显示除控制进程和无终端进程外的所有进程     |\n| -d          | 显示除控制进程外的所有进程     |\n| -e          | 显示所有进程       |\n| -C cmdlist  | 显示包含在cmdlist列表中的进程       |\n| -G grplist  | 显示组ID在grplist列表中的进程       |\n| -U userlist | 显示属主的用户ID在userlist列表中的进程       |\n| -g grplist  | 显示会话或组ID在grplist列表中的进程       |\n| -p pidlist  | 显示PID在pidlist列表中的进程       |\n| -s sesslist | 显示会话ID在sesslist列表中的进程       |\n| -t ttylist  | 显示终端ID在ttylist列表中的进程       |\n| -u userlist | 显示有效用户ID在userlist列表中的进程       |\n| -F          | 显示更多额外输出（相对-f参数而言）       |\n| -O format   | 显示默认的输出列以及format列表指定的特定列       |\n| -M          | 显示进程的安全信息       |\n| -c          | 显示进程的额外条调度器信息       |\n| -l          | 显示长列表       |\n| -o format   | 仅显示由format指定的列表       |\n| -y          | 不要显示进程标记（process tag, 表明进程状态的标记）       |\n| -Z          | 显示安全标签（security context）信息       |\n| -H          | 用层级格式来显示进程（树状，用来显示父进程）       |\n| -n namelist | 定义了WCHAN列显示的值       |\n| -w          | 采用宽输出模式，不限宽显示       |\n| -L          | 显示进程中的线程       |\n| -V          | 显示PS命令的版本号       |\n\n\n```bash\n# 显示所有进程信息\n$ ps -A\n\n# 显示指定用户进程信息\n$ ps -u root\n\n# 显示所有进程信息包括命令行\n$ ps -ef  # -e 等价于 -A  , 即等价于 ps -Af\n\n# 这是 BSD 风格参数，列出所有正在内存中的进程\n$ ps aux\n\n# 配合 grep 查询指定进程\n$ ps -ef | grep nginx\n```\n\n\n\n\n\n\n## pstree\npstree命令以树状图的方式展现进程之间的派生关系。\n\n\n#### 显示所有进程的所有详细信息\n```bash\n$ pstree -a\n# 输出信息：\n├─AliSecGuard\n  ├─assist_daemon\n  │   └─7*[{assist_daemon}]\n  ├─atd -f\n  ├─auditd -n\n  │   └─{auditd}\n  ├─crond -n\n  ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation\n  ├─dhclient -H debug010000002015 -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid eth0\n  ├─frps -c ./frps.ini\n  │   └─2*[{frps}]\n  ├─nginx\n  │   └─nginx                   \n  ├─ntpd -u ntp:ntp -g\n  ├─polkitd --no-debug\n  │   └─5*[{polkitd}]\n  ├─rsyslogd -n\n  │   └─2*[{rsyslogd}]\n  ├─sshd -D\n  │   └─sshd    \n  │       └─bash\n  │           └─pstree -a\n  ├─systemd-journal\n  ├─systemd-logind\n  ├─systemd-udevd\n  └─tuned -Es /usr/sbin/tuned -l -P\n      └─4*[{tuned}]\n```\n\n\n#### 显示当前所有进程的进程号和进程id\n```bash\n$ pstree -p\n# 输出信息：\nsystemd(1)─┬─AliSecGuard(9347)─┬─{AliSecGuard}(9348)\n           ├─agetty(474)\n           ├─agetty(475)\n           ├─assist_daemon(1356)─┬─{assist_daemon}(1370)\n           │                     ├─{assist_daemon}(1371)\n           │                     ├─{assist_daemon}(1372)\n           │                     ├─{assist_daemon}(1870)\n           │                     ├─{assist_daemon}(1871)\n           │                     ├─{assist_daemon}(1872)\n           │                     └─{assist_daemon}(1873)\n           ├─atd(459)\n           ├─auditd(368)───{auditd}(375)\n           ├─crond(455)\n           ├─dbus-daemon(440)\n           ├─dhclient(680)\n           ├─nginx(9605)───nginx(9608)\n           ├─ntpd(766)\n           ├─polkitd(448)─┬─{polkitd}(489)\n           │              ├─{polkitd}(490)\n           │              ├─{polkitd}(491)\n           │              ├─{polkitd}(492)\n           │              └─{polkitd}(493)\n           ├─rsyslogd(740)─┬─{rsyslogd}(769)\n           │               └─{rsyslogd}(770)\n           ├─sshd(4007)───sshd(21896)───bash(21898)───pstree(21921)\n           ├─systemd-journal(326)\n           ├─systemd-logind(445)\n           ├─systemd-udevd(350)\n           └─tuned(743)─┬─{tuned}(1004)\n                        ├─{tuned}(1006)\n                        ├─{tuned}(1009)\n                        └─{tuned}(1011)\n```\n\n\n\n\n\n\n\n\n\n## top\n实时查看系统执行中的程序, top 命令跟 `ps` 命令相似，但它是实时的。\n\n默认情况下 `top` 命令启动时会按照 `%CPU` 值对进程排序。\n\n| 名称       | 描述              |\n| --------- |------------------ |\n|  PID      |  进程的ID    |\n|  USER     | 进程的优先级     |\n|  PR       |  进程的优先级    |\n|  NI       |  进程的谦让度值    |\n|  VIRT     | 进程占用的虚拟内存总量     |\n|  RES      |  进程占用的物理内存总量    |\n|  SHR      |  进程和其他进程共享的内存总量    |\n|  S        |  进程的状态（D=可中断的休眠状态，R在运行状态，S休眠状态，T跟踪状态或停止状态，Z=僵化状态）    |\n|  %CPU     |  进程使用的CPU时间比例    |\n|  %MEM     | 进程使用的内存占可用内存的比例     |\n|  TIME+    |  自进程启动到目前为止的CPU时间总量    |\n|  COMMAND  |  进程所对应的命令行名称，也就是启动的程序名    |\n\n\n```bash\n# 实时监听进程变化\n#  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                               \n#    1 root      20   0  125124   3612   2428 S  0.0  0.2   0:04.88 systemd\n$ top\n\n# 显示2条\n$ top -n 2\n\n# 显示指定的进程信息\n$ top -pid \u003cpid\u003e\n\n# 查看进程所有的线程\n$ top -H -p \u003cpid\u003e\n```\n\n\n\n\n\n\n## netstat\n查看网络系统状态信息\n\n**参数说明：**\n\n\n| 参数        | 描述              |\n| ---------- |------------------- |\n| a或--all                 | 显示所有连线中的Socket                |\n| A\u003c网络类型\u003e或--\u003c网络类型\u003e   | 列出该网络类型连线中的相关地址          |\n| c或--continuous          | 持续列出网络状态                      |\n| C或--cache               | 显示路由器配置的快取信息                |\n| e或--extend              | 显示网络其他相关信息                   |\n| F或--fib                 | 显示FIB                              |\n| g或--groups              | 显示多重广播功能群组组员名单             |\n| h或--help                | 在线帮助                              |\n| i或--interfaces          | 显示网络界面信息表单                    |\n| l或--listening           | 显示监控中的服务器的Socket              |\n| M或--masquerade          | 显示伪装的网络连线                      |\n| n或--numeric             | 直接使用IP地址，而不通过域名服务器        |\n| N或--netlink或--symbolic | 显示网络硬件外围设备的符号连接名称       |\n| o或--timers              | 显示计时器                            |\n| p或--programs            | 显示正在使用Socket的程序识别码和程序名称  |\n| r或--route               |  显示Routing Table                   |\n| s或--statistics          | 显示网络工作信息统计表                  |\n| t或--tcp                 | 显示TCP传输协议的连线状况               |\n| u或--udp                 | 显示UDP传输协议的连线状况               |\n| v或--verbose             | 显示指令执行过程                       |\n| V或--version             | 显示版本信息                          |\n| w或--raw                 | 显示RAW传输协议的连线状况               |\n| x或--unix                | 此参数的效果和指定\"-A unix\"参数相同     |\n| -ip或--inet              | 此参数的效果和指定\"-A inet\"参数相同     |\n\n\n```bash\n# 列出所有占用端口\n$ netstat -ntlp\n\n# 显示所有网络状况\n$ netstat -a\n\n# 显示所有tcp网络状况\n$ netstat -at\n\n# 显示所有udp网络状况\n$ netstat -au\n\n# 配合grep命令查看某个端口被占用情况\n$ netstat -ap | grep 8080\n```\n\n\n\n\n\n\n## kill\n结束程序，kill 命令只支持进程id杀死，不支持进程名称。\n\n\n#### 进程信号\n| 信号    | 名称              | 描述              |\n| ------ |------------------ | ----------- |\n| 1      | HUP     | 挂起     |\n| 2      | INT     | 中断     |\n| 3      | QUIT    | 结束运行     |\n| 9      | KILL    | 无条件终止     |\n| 11     | SEGV    | 段错误     |\n| 15     | TERM    | 尽可能终止     |\n| 17     | STOP    | 无条件停止运行，但不终止     |\n| 18     | TSTP    | 停止或暂停，但继续在后台运行     |\n| 19     | CONT    | 在STOP或TSTP之后恢复执行     |\n\n\n注：程序进程 id 可通过 `top` 等命令查看。\n\n```bash\n# 杀死 pid 为88 进程，不带参数默认等价 kill -15\n$ kill 88\n\n# 无条件终止进程，以下是等价，可以用进程名称信号\n$ kill -KILL 88\n$ kill -9 88\n\n# 显示信号\n$ kill -l\n\n# 杀死指定用户的所有进程\n$ kill -u nginx\n```\n\n\n\n\n\n## killall\n杀死进程，可以杀死多个进程，比 `kill` 要强大, 支持通过进程名称杀死, 还支持通配符。\n\n```bash\n# 杀死以tcp进程名称开头的所有进程\n$ killall tcp*\n```\n\n\n\n\n\n\n\n\n\n\n\n---\n# 用户管理\n\n\n\n\n## useradd\n给系统添加新用户\n\n注：\n- 在创建新用户时如果不指定具体的值，就会使用系统那些默认值。\n- 在创建新用户时如果未指定密码，需要使用 `passwd` 命令进行更改。\n\n\n\n#### useradd 命令行参数\n| 参数               | 描述              |\n| ----------------- |------------------ |\n| -c comment        | 给新用户添加备注     |\n| -d home_dir       | 为主目录指定一个名字（如果不想用登录名作为主目录名的话）     |\n| -e expire_date    | 用YYYY-MM-DD格式指定一个账户过期的日期     |\n| -f inactive_days  | 指定这个账户密码过期后多少天这个账户被禁用；0表示密码已过期就立即禁用，1表示禁用这个功能     |\n| -g initial_group  | 指定用户登录组的GID或组名     |\n| -G group          | 指定用户除登录组之外所属的一个或多个附加组     |\n| -k                | 必须和-m一起使用，将/etc/skel目录的内容复制到用户的HOME目录     |\n| -m                | 创建用户的HOME目录     |\n| -M                | 不创建用户的HOME目录（当默认设置里要求创建时才使用这个选项）     |\n| -n                | 创建一个与用户登录名同名的新租     |\n| -r                | 创建系统账户     |\n| -p passwd         | 为用户账户指定默认密码 (需要使用openssl把明文进行加密后设置，否则无效)     |\n| -s shell          | 指定默认的登录shell     |\n| -u uid            | 为账户指定唯一的UID     |\n\n\n\n\n#### 更改默认值参数\n| 参数                | 描述              |\n| ------------------ |------------------ |\n| -b default_home    | 更改默认的创建用户HOME目录的位置     |\n| -e expiration_date | 更改默认的心账户的过期日期     |\n| -f inactive        | 更改默认的心用户从密码过期到账户被禁用的天数     |\n| -g group           | 更改默认的组名称或GID     |\n| -s shell           | 更改默认的登录shell     |\n\n\n\n\n\n```bash\n# -D, 查看默认值\n$ useradd -D\n# 输出：\nGROUP=100                # 新用户会被添加到GID为100的公共组\nHOME=/home               # 新用户的HOME目录将位于 /home/loginname\nINACTIVE=-1              # 新用户账户密码在过期后不会被禁用\nEXPIRE=                  # 新用户账户未被设置过期日期\nSHELL=/bin/bash          # 新用户账户将bash shell作为默认shell\nSKEL=/etc/skel           # 系统会将/etc/skel目录下的内容复制到用户的HOME目录下\nCREATE_MAIL_SPOOL=yes    # 系统为该用户账户在mail目录下创建一个用于接收邮件的文件\n\n\n# 创建一个 test 用户, -m 创建 /home/test 目录\n$ useradd -m test\n\n# 创建一个用户并设置密码\n$ useradd -m test # 不指定-p，因为需要加密那样很麻烦\n$ passwd test # 通过passwd修改指定用户密码\n```\n\n添加新用户后可以执行 `cat /etc/passwd` 查看用户列表。\n\n\n\n\n\n\n## userdel\n删除用户\n\n\n```bash\n# 删除用户，默认会从 /etc/passwd 文件中删除用户信息，而不会删除系统中属于该账户的任何文件\n$ userdel 用户名\n\n# -r 用来删除用户目录， 之前创建的 /home/用户名 就不存在了, 使用-r参数需要小心，要检查是否有重要文件。\n$ userdel -r 用户名\n```\n\n\n\n\n\n\n## passwd\n修改用户密码, 只有 `root` 用户才有权限修改别人的密码。\n\n使用 `passwd` 一般用于修改单个用户密码，如果想批量修改那么需要 `chpasswd` 命令。\n\n```bash\n# 如果不指定用户名，修改的是自己当前用户密码， 回车后输入新密码\n$ passwd\n\n# 修改指定用户密码，比如test用户\n$ passwd test\n```\n\n\n\n\n## chpasswd\n类似 `passwd` 命令也是用于修改用户密码，但它支持批量修改用户。\n\n`chpasswd` 命令从标准输入自动读取登录名和密码对（由冒号分割）列表，给密码加密。\n\n\n\n```bash\n# 利用输入重定向从文本中读取\n$ chpasswd \u003c users.txt\n\n# 从标准输入读取\n$ echo 'test:fff33300..a' | chpasswd\n```\n\nuser.txt 内容：\n```txt\ntest:helloworld0123..\ntest1:fff33300..\nadmin:youyouyou00..11\n```\n\n\n\n\n\n\n\n## chsh\n`chsh` 命令用于修改默认用户登录 shell。\n\n修改后重新启动Shell即可生效（exit/logout），或重新启动系统。\n\n```bash\n# 必须使用完整路径，不能使用shell名\n$ chsh -s /bin/zsh\n```\n\n查看当前 `Shell`\n```bash\n$ echo $SHELL # /bin/zsh\n```\n\n列出当前所有已安装的Shell\n```bash\n$ cat /etc/shells\n\n# /bin/bash\n# /bin/csh\n# /bin/dash\n# /bin/ksh\n# /bin/sh\n# /bin/tcsh\n# /bin/zsh\n```\n\n\n\n\n## chfn\n主要用于更改账号的个人信息。这些信息保存在 `/etc/passwd` 下。\n\n默认情况下如果不提供参数将进入问答式逐一设置。\n\n| 参数   | 描述              |\n| ----- |------------------ |\n| -f    | 真实姓名     |\n| -h    | 家中电话     |\n| -o    | 办公地址     |\n| -p    | 办公室电话   |\n\n\n```bash\n# 修改 root 账号信息\n$ chfn root\n# Changing finger information for root.\n# Name [xiejiahe]: \n# Office [ZhuHai]: \n# Office Phone [13xxxxxxxxx]: \n# Home Phone [13xxxxxxxxx]: \n```\n\n#### 修改真实姓名\n```bash\n$ chfn -f root\n```\n\n\n\n\n\n\n## usermod\n`usermod` 命令是用于账号修改工具中最强大的一个，它能用来修改 `/etc/passwd` 文件中的大部分字段。\n\n注意：确保需要修改的用户已下线。\n\n| 参数   | 描述              |\n| ----- |------------------ |\n| -l    | 修改用户账号的登录名     |\n| -p    | 修改账号的密码     |\n| -L    | 锁定账号，使用户无法登录     |\n| -U    | 解除锁定，使用户能登录     |\n| -l    | 修改用户账号的登录名     |\n| -d    | 修改用户登录时的目录     |\n| -c    | 修改用户备注信息     |\n| -s    | 修改用户登录时默认shell     |\n| -u    | 修改用户的UID     |\n\n\n```bash\n# 将 root 登录名修改为 root123\n$ usermod -l root root123\n\n# 锁定 test 账号\n$ usermod -L test\n\n# 当用户登录时目录为 /etc 下\n$ usermod -d /etc root\n\n# 修改UID\n$ usermod -u 888 root\n```\n\n\n\n\n\n\n\n\n\n\n## users\n显示当前登录系统的所有用户的用户列表\n\n```bash\n$ users\n# xiejiahe\n# root\n# admin\n```\n\n\n\n\n\n\n## who\n显示当前所有用户登录信息\n\n```bash\n# 显示当前登录系统的用户\n$ who\nxiejiahe console  Jun 15 21:38\nxiejiahe ttys001  Jun 15 21:44\nxiejiahe ttys002  Jun 15 21:44\nxiejiahe ttys003  Jun 15 21:44\nxiejiahe ttys004  Jun 15 21:44\nxiejiahe ttys005  Jun 15 21:44\n\n# 显示登录账号名和总人数\n$ who -q\n\n# 显示上次系统启动时间\n$ who -b  # reboot   ~        Jun 15 21:38\n```\n\n\n\n\n\n## w\n查看当前登入系统的用户信息, 有哪些用户正在登陆, 以及他们正在执行的程序。\n\n此命令与 `who` 相似，默认情况下比 `who` 命令输出内容更详细。\n\n```bash\n$ w\n# 输出\n 22:44:33 up 748 days, 14:16,  1 user,  load average: 0.04, 0.03, 0.05\nUSER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT\nroot     pts/0    183.11.111.11    22:40    1.00s  0.03s  0.00s w\n```\n\n\n\n\n## last\n显示用户最近登录信息\n\n```bash\n$ last # root     pts/0        183.58.247.64    Sun Jan  5 13:57 - 14:28  (00:30)\n\n# 指定显示条目数\n$ last -n 1\n```\n\n\n\n\n## su\n切换到其他用户。\n\n```bash\n# 切换到 root 身份\n$ su -\n\n# 切换到 admin 身份\n$ su admin\n\n# -c 执行完指令后切换回原身份\n$ su -c ls admin\n```\n\n可以通过以下指令查找当前系统用户列表\n```bash\n$ cat /etc/passwd\n```\n\n\n\n\n\n## whoami\n显示自身的用户名称, 此命令等价于 `id -un`\n\n```bash\n$ whoami\n# root\n```\n\n\n\n\n\n\n\n\n\n---\n# 环境变量\n\n## printenv\n列出全局环境变量, 有个 `env` 命令很像，但 `printenv` 可以打印变量的值。\n\n普及：所有系统环境变量都是大写字母，用于区分普通用户的环境变量。\n\n```bash\n# 列出所有全局环境变量\n$ printenv\n\n# 也可以显示指定全局环境变量的值, 等价于 echo $HOME\n$ printenv HOME # /root\n```\n\n\n\n\n\n\n## set\n列出所有全局变量、局部变量和普通用户定义的变量，按照字母顺序对结果进行排序。\n\n注意：所有系统全局变量都是大写，用户定义的环境变量全部采用小写，这是标准规范。\n\n```bash\n$ set\n# OPTIND=1\n# OSTYPE=linux-gnu\n# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin\n# PIPESTATUS=([0]=\"0\")\n# ...\n```\n\n\n\n\n\n## export\n导出环境变量, 可以把一个局部变量导出成全局环境变量\n\n注意：export 只有在当前Shell有效，退出后将失效\n```bash\n# 先声明一个局部环境变量\n$ my_var='Hello'\n# 然后将其导出全局环境变量\n$ export my_var\n```\n\n\n\n\n## unset\n删除环境变量\n\n注意：unset 只在当前shell删除环境变量，假如环境变量设置在 `~/.bash_profile` 等文件中用户重新启动依然生效。如果是在子进程删除全局环境变量只在子进程有效，不会影响父进程。\n\n```bash\n# 删除 HOME 环境变量，前面不需要带 $ 符号\n$ unset HOME\n```\n\n\n\n\n\n\n\n\n\n\n\n---\n# 压缩、解压\n\n## zip\n归档数据，将目录或文件归档为 `.zip` 格式， zip 不是Linux中的标准归档工具, 是为了支持 windows 而存在。\n\n```bash\n# 归档文件\n$ zip README.zip README.md\n\n# 归档目录需要 -r 递归处理\n$ zip -r temp.zip temp\n\n# -S 包含系统隐藏文件\n$ zip -r -S temp.zip temp\n\n# 指定归档效率 1-9\n$ zip -r -9 temp.zip temp \n\n# -j 消除文件夹, 这样解压后只有 README.md 文件而不是带有 src 文件夹\n$ zip -j temp.zip src/README.md\n```\n\n\n\n\n\n## unzip\n提取 `zip` 归档的文件或目录\n\n```bash\n# 将 demo.zip 提取到当前目录下\n$ unzip demo.zip\n\n# 列表 demo.zip 文件内容，但不提取\n$ unzip -v demo.zip\n\n# -d 指定将文件提取到 src 目录下\n$ unzip demo.zip -d src\n```\n\n\n\n\n\n## gzip\nGNU 压缩/解压工具，用 Lempel-Ziv编码，格式为 `.gz`, 压缩后原文件将被删除\n\n注意：gzip 不能用于压缩整个目录, 只能用于压缩一个文件, 如果需要压缩整个目录可以考虑使用 [zip](#zip) 命令。\n\n```bash\n# 压缩 README.md 文件, 压缩完成后 README.md 文件会被删除\n$ gzip README.md # README.md.gz\n\n# 递归压缩目录下的所有文件, 每个文件都会被压缩为 .gz 然后删除\n$ gzip -r ./logs\n\n# 加 -v 显示压缩执行过程\n$ gzip -rv ./logs\n\n# 压缩 .tar 后缀文件\n$ gzip -r src.tar  # 压缩后为 src.tar.gz\n\n# -d 解压gzip压缩后的文件，解压后 .gz 文件会被删除\n$ gzip -d README.md.gz\n$ gzip -dr ./logs # 或者递归解压目录下所有 .gz\n```\n\n\n## bzip2\n采用 Burrows-Wheeler 块排序文本压缩算法和霍夫曼编码，将文件压缩成 `.bz2` 格式，也可用于解压 `.bz2`\n\n```bash\n# 压缩 README.md 文件\n$ bzip2 README.md     # 不保留源文件 README.md.bz2\n$ bzip2 -k README.md  # -k 保留源文件\n\n\n# 解压\n$ bzip2 -d README.md.bz2  # 源文件将被删除\n$ bzip2 -dk README.md.bz2  # -k 保留源文件\n$ bzip -dt README.md.bz2 # -t --test 测试解压, 实际不解压，模拟整个解压过程\n```\n\n\n\n\n## tar\n归档数据，是Linux中标准归档工具。\n\n\n| 参数  | 描述              |\n| ---- |------------------ |\n| -A   | 将一个已有tar归档文件追加到另一个已有tar归档文件     |\n| -c   | 创建一个新的tar归档文件     |\n| -d   | 检查归档文件和文件系统的不同之处     |\n| -r   | 追加文件到已有tar归档文件结尾     |\n| -t   | 列出已有tar归档文件的内容     |\n| -u   | 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中     |\n| -x   | 从已有的tar归档文件中提取文件     |\n| -f   | 输出结果到文件或设备file     |\n\n```bash\n# -c 创建一个归档文件\n$ tar -cvf demo.tar src/\n\n# -x 提取归档文件内容\n$ tar -xvf demo.tar\n$ tar -xvf demo.tar.gz # tar命令是可以提取 gzip 压缩后的文件\n```\n\n\n\n\n\n\n\n\n\n---\n# 加解密\n\n\n## md5sum\n计算和校验文件报文摘要\n\n```bash\n# 计算文件md5\n$ mmd5sum README.md # d41d8cd98f00b204e9800998ecf8427e  README.md\n\n# 校验文件, 查看文件是否被篡改过\n$ md5sum README.md \u003e README.md5 # 计算文件md5并保存在 README.md5 , 保存的文件名和后缀可以随意命名\n$ md5sum -c README.md5 # -c 从指定的文件读取md5并校验, 会从当前目录寻找 README.md\n```\n\n\n\n\n\n## base64\nbase64 编码/解码文件或标准输入输出\n\n```bash\n# 编码字符串\n$ printf \"hello world\"|base64 # aGVsbG8gd29ybGQ=\n\n# 解码字符串\n$ printf aGVsbG8gd29ybGQ=|base64 -d # hello world\n\n# 编码文件, 将结果保存在 decode.txt\n$ base64 README.md \u003e decode.txt\n\n# 从标准输入中读取已经进行base64编码的内容进行解码\n$ base64 -d decode.txt\n```\n\n\n\n\n\n\n\n\n\n---\n# 网络\n\n\n## ssh\n远程连接服务器工具\n\n命令：`ssh [-p port]  [user@]hostname [command]`\n\n| 参数  | 描述              |\n| ---- |------------------ |\n| -p   | 指定端口号     |\n| -t   | 强制分配为终端     |\n\n```bash\n# 最简单的连接方式\n$ ssh root@192.168.0.0\n\n# 指定端口号连接\n$ ssh -p 23 root@192.168.0.0\n\n# 执行远程服务器命令, 比如创建目录\n$ ssh root@192.168.0.0 \"mkdir -p /home/test\"\n\n# 在远程服务器执行本地脚本\n$ ssh root@192.168.0.0 \u003c shell.sh\n```\n\n\n\n\n\n\n\n\n\n## wget\n用于从网络下载文件到本地\n\n```bash\n# 下载某个文件\n$ wget https://www.xiejiahe.com/robots.txt\n\n# 指定下载后文件名\n$ wget -O ro.txt https://www.xiejiahe.com/robots.txt\n\n# 断开续传，一般用于大文件，防止重新下载\n$ wget -c https://www.xiejiahe.com/robots.txt\n\n# 使用后台下载, 对于大文件非常有用\n$ wget -b https://www.xiejiahe.com/robots.txt\n$ tail -f wget-log   # 查看后台下载进度\n```\n\n\n\n\n\n## curl\n`curl` 是一个非常强大的网络传输工具, 利用URL规则在命令行下工作的文件传输工具。\n\n\n| 参数                 | 描述              |\n| ------------------- |------------------- |\n| -s, --silent        | 不输出错误和进度信息, 只显示正常结果 |\n| -o, --output        | 将结果输出到文件中 |\n| -O, --remote-name   | 下载文件到本地，并将URL最后部分当做文件名 |\n| -L                  | HTTP请求跟随服务器重定向 |\n| -I, --head          | 显示HTTP响应报文 |\n| -H                  | 设置请求头 |\n| -X                  | 指定HTTP请求方法，大写字母 |\n| -d                  | HTTP请求实体内容 |\n| --cookie            | 指定发送cookie |\n| -v                  | 打印整个传输过程 |\n| -F, --form          | 上传文件 |\n| -u                  | 指定用户名密码授权 |\n| --progress          | 显示进度条 |\n| -f, --fail          | 连接失败时不显示http错误 |\n| --retry             | 请求重试 |\n\n\n注意：参数不分前后\n\n#### 不传递任何参数只打印HTTP响应内容\n```bash\n$ curl https://github.com/xjh22222228/linux-manual\n```\n\n#### -s 不输出错误和进度信息, 只显示正常结果\n```bash\n$ curl -s https://github.com/xjh22222228/linux-manual\n```\n\n\n#### -o 指定文件名下载到本地，等价于 wget\n```bash\n# 将响应内容保存到 1.txt 文件\n$ curl https://github.com/xjh22222228/linux-manual -o 1.txt\n```\n\n\n#### -O 下载文件到本地, 并将URL最后部分当做文件名\n```bash\n# 文件名为 linux-manual\n$ curl https://github.com/xjh22222228/linux-manual -O\n```\n\n#### --progress 显示进度条\n```bash\n$ curl https://github.com/xjh22222228/linux-manual --progress\n```\n\n\n#### -L HTTP请求跟随服务器重定向\n```bash\n$ curl -L https://github.com/xjh22222228/linux-manual\n```\n\n\n#### -I 或 --head 显示HTTP响应报文, 不打印响应内容\n```bash\n$ curl -I https://github.com/xjh22222228/linux-manual\n```\n\n\n#### -H 设置请求头\n```bash\n$ curl -H 'Content-Type: application/json' -H 'Content-Type: application/json' https://github.com/xjh22222228/linux-manual\n```\n\n#### -X 指明HTTP请求方法\n```bash\n$ curl -X POST https://github.com/xjh22222228/linux-manual\n```\n\n#### -d 要发送的实体内容\n```bash\n$ curl -X POST -d '{\"key\":\"value\"}' https://github.com/xjh22222228/linux-manual\n```\n\n#### --cookie HTTP请求时携带的cookie信息\n```bash\n$ curl --cookie \"age=18;name=xjh\" https://github.com/xjh22222228/linux-manual\n```\n\n\n#### -v 打印整个传输过程\n```bash\n$ curl -v https://github.com/xjh22222228/linux-manual\n```\n\n\n#### -F 上传文件，默认以POST方法请求\n```bash\n# file 是字段名, =@ 必须存在\n$ curl https://example.com/upload -F \"file=@/home/demo.png\"\n```\n\n#### -u 请求授权\n```bash\n$ curl -u root:password ftp://demo/README.md\n```\n\n\n#### --retry 请求重试\n请求失败时设置重试次数\n\n```bash\n$ curl http://example.com --retry 3\n```\n\n\n\n\n\n\n\n\n\n## scp\n加密的方式在本地主机和远程主机之间复制文件\n\n注：需要有读写权限，否则会无法操作。\n\n```bash\n# 从远程主机下载文件到本地\n$ scp root@192.168.0.100:/root/file.zip /home/file.zip\n\n# 从远程主机下载目录到本地，需要 -r 递归\n$ scp -r root@192.168.0.100:/root/dir  /home/dir\n\n# 从本地主机上传文件到远程主机\n$ scp /home/file.zip root@192.168.0.100:/root/file.zip\n\n# # 从本地主机上传目录到远程主机，需要 -r 递归\n$ scp -r /home/dir root@192.168.0.100:/root/dir\n```\n\n\n\n\n\n\n## rsync\n`rsync` 命令是一个远程数据同步工具，可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步，这个算法只传送两个文件的不同部分，而不是每次都整份传送，因此速度相当快。\n\n`rsync` 非常强大，可以用来替代 `cp` / `mv` / `scp` 等命令。\n\n\n\n| 参数         | 描述              |\n| ----------- |------------------- |\n| -r          | 递归拷贝子目录 |\n| -a          | 递归拷贝子目录，但同步元数据信息，比如修改时间，创建时间，权限等 |\n| -n          | 模拟执行结果 |\n| -v          | 显示执行过程 |\n| -z          | 压缩传输 |\n| --exclude   | 排除文件 |\n| --include   | 包含文件 |\n| --progress  | 显示传输进度信息 |\n| --link-dest | 指定增量备份的基准目录 |\n\n\nsource 有没有斜杠影响同步结果：\n- 有斜杠 - dst目录下只有 source 文件\n- 无斜杠 - dst目录包含source目录\n\n```bash\n# 无斜杠, dst 目录下只有 source目录\n$ rsync -r source dst\n\n# 有斜杠, dst 目录下包含 source 所有文件，没有source目录\n$ rsync -r source/ dst\n```\n\n\n#### 本地同步文件\n```bash\n# -r 表示递归拷贝子目录，将 source 拷贝到 dst 目录下\n$ rsync -r source dst # dst 目录下就有 source\n\n# 可以将多个source 拷贝到指定目录下\n$ rsync -r source1 source2 dst\n\n# -a替代-r, 同步元数据信息，比如修改时间，创建时间，权限等\n$ rsync -a source dst\n```\n\n\n#### 远程同步文件\n```bash\n# 本地同步到远程, 本地 docs 目录同步到远程 home/docs 下\n$ rsync -rv ~/docs root@192.168.0.0:/home/docs\n\n# 远程同步到本地, 将远程 /home/docs 目录同步到本地 ~/docs 下\n$ rsync -rv root@192.168.0.0:/home/docs ~/docs\n```\n\n\n#### 增量备份\n`rsync` 最大的特点就是支持增量备份，所谓增量备份指的是只同步有变动的文件。\n\n`rsync` 默认就是增量备份的，但可以添加 `--link-dest` 参数指定基准目录进行比较，找出有变动的文件。\n\n```bash\n# --link-dest 后面跟着基准目录，然后会跟 source 进行一一比较，找出变动的文件进行同步\n$ rsync -a --link-dest compare source dest\n```\n\n\n\n\n#### 其他用法\n```bash\n# 排除文件\n$ rsync -r --exclude=\".git\" source dst\n# 大括号指定多个排除模式\n$ rsync -r --exclude={\".git\", \".svn\"} source dst\n\n\n# 包含文件\n$ rsync -r --include=\"src/\" source dst\n# 大括号指定多个包含模式\n$ rsync -r --include={\"src/\", \"tests/\"} source dst\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n---\n# 磁盘\n\n\n\n\n## df\n查看已挂载的磁盘使用情况。\n\n\n#### 描述\n| 名称        | 描述              |\n| ---------- |------------------ |\n| Filesystem | 设备的设备位置文件     |\n| Size       | 能容纳多少个1024字节大小的块       |\n| Used       | 已用了多少个1024字节大小的块       |\n| Avail      | 还有多少个1024字节大小的块可用       |\n| Use%       | 已用空间所占的比例       |\n| Mounted on | 设备挂载到了哪个挂载点上       |\n\n\n\n```bash\n# 显示每个有数据的已挂载文件系统\n# Filesystem     1K-blocks    Used Available Use% Mounted on\n# /dev/vda1       41151808 1853208  37185168   5% /\n$ df\n\n# 格式化大小，以kb以上进行显示\n$ df -h\n\n# 查看全部文件系统信息\n$ df -a\n```\n\n\n\n\n## du\n显示文件或目录所占用的磁盘空间\n\n\n| 参数     | 描述              |\n| ------- |------------------ |\n| -m      | 以mb单位显示大小     |\n| -h      | 自动格式化单位，以 K, M, G为单位       |\n| -s      | 只显示总大小，列出最后累计的值       |\n| -c      | 显示当前所有已列出文件总大小       |\n| -b      | 以 bytes 为单位显示大小       |\n\n```bash\n# 默认显示当前目录的所有文件、目录、和子目录的磁盘使用情况\n$ du\n\n# 查看指定文件所占用磁盘空间\n$ du README.md\n\n# 查看指定目录所占用磁盘空间, 输出的最后一行是累计总大小\n$ du src\n\n# -h 以K，M，G为单位，提高信息的可读性。\n$ du -h src\n20K    src\n\n# -s 只显示总大小，列出最后累计的值\n$ du -s src\n\n# 显示当前所有已列出文件总大小\n$ du -c\n```\n\n\n\n\n\n\n\n\n\n\n\n---\n# 包管理\n\n\n\n\n## yum\n基于RPM的软件包管理器, 特点安装快捷，命令简洁好记。\n\n```bash\n# 安装\n$ yum install 包名\n\n# 指定 -y 安装时自动全部 yes\n$ yum -y install 包名\n\n# 查找包\n$ yum search 包名\n\n# 显示所有已安装的包\n$ yum list\n\n# 升级包\n$ yum update 包名\n\n# 只删除软件包而保留配置文件和数据文件\n$ yum remove 包名\n\n# 删除软件和它的所有配置文件\n$ yum erase 包名\n\n# 清除缓存\n$ yum clean all\n\n# 显示安装包信息\n$ yum info 包名\n\n# 检查可更新的包程序\n$ yum check-update\n```\n\n\n\n## apt-get\n`apt-get命令` 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。\n\n```bash\n# 安装一个docker软件\n$ apt-get install docker\n\n# 卸载软件，保留配置文件\n$ apt-get remove docker\n\n# 卸载软件并删除配置文件\n$ apt-get –purge remove docker\n\n# 更新所有已安装的软件包\n$ apt-get upgrade\n\n# 删除软件备份，主要用来释放空间\n$ apt-get clean\n```\n\n\n\n\n\n\n---\n# 其他\n\n\n\n## 目录名称含义\n\n| 目录名  | 描述              |\n| ------ |------------------- |\n| /      | 虚拟目录的根目录，通常不会在这里存储文件 |\n| /bin   | 二进制目录，存放许多用户级的GNU工具 |\n| /boot  | 启动目录，存放启动文件 |\n| /dev   | 设备目录，Linux在这里创建设备节点 |\n| /etc   | 系统配置文件目录 |\n| /home  | 主目录，Linux在这里创建用户目录 |\n| /lib   | 库目录，存放系统和应用程序的库文件 |\n| /media | 媒体目录，可移动媒体设备的常用挂载点 |\n| /mnt   | 挂载目录，另一个可移动媒体设备的常用挂载点 |\n| /opt   | 可选目录，常用于存放第三方软件包和数据文件 |\n| /proc  | 进程目录，存放现有硬件及当期进程的相关信息 |\n| /root  | ROOT用户的主目录 |\n| /sbin  | 系统二进制目录，存放许多GNU管理员级工具 |\n| /run   | 运行目录，存放系统运作时的运行时数据 |\n| /srv   | 服务目录，存放本地服务的相关文件 |\n| /sys   | 系统目录，存放系统硬件信息的相关文件 |\n| /tmp   | 临时目录，可以在该目录中创建和删除临时工作文件 |\n| /usr   | 用户二进制目录，大量用户级的GNU工具和数据文件都存储在这里(Unix Software Resource) |\n| /var   | 可变目录，用以存放经常变化的文件，比如日志文件 |\n\n\n\n\n\n\n\n## 重定向输入和输出\n\n#### 输出重定向\n\n将命令输出的内容发送到一个文件中叫做 `输出重定向` 。 使用 `\u003e` 大于号。\n\n\n下面展示了几个例子\n```bash\n# 例子一：\n$ echo \"Hello World\" \u003e log.txt\n\n# 例子二：\n$ ps -ef \u003e ps.txt\n\n# 例子三：\n$ history \u003e a.txt\n```\n\n有时不想覆盖文件而是追加内容，比如日志，可以使用 `\u003e\u003e` 2个大于号。\n\n```bash\n$ echo \"H\" \u003e\u003e log.txt\n```\n\n\n\n#### 输入重定向\n和输出重定向正好相反，将文件的内容定向到命令。\n\n```bash\n# 统计input.txt文本行数\n$ wc -l \u003c input.txt # 等价于 wc -l input.txt\n```\n\n还有一种叫内联重定向，比较少见，但也挺有用。 使用2个 `\u003c\u003c` 小于号。然后跟着一个开头标记和结尾标记。\n\n```bash\n# 统计行数，输出2\n$ wc -l \u003c\u003c EOF\n第一行\n第二行\nEOF\n```\n\n开头标记必须和结尾标记一致，标记名称可以是任何字符串。\n\n下面这个也是可以的。\n```bash\n# 输出2\n$ wc -l \u003c\u003c Hello\n第一行\n第二行\nHello\n```\n\n\n\n\n\n## 管道\n将一个命令的输出作为另一个命令的输入称为管道。 管道用 `|` 符号表示。\n\n\n```bash\n# 将 ls 输出内容作为 wc 输入\n$ ls | wc\n\n# 执行一个脚本，这没有什么意义，只是一个例子\n$ echo \"./bash.sh\" | bash\n```\n\n\n\n\n\n\n## echo\n输出字符串或者变量\n\n| 参数    | 描述              |\n| ------ |------------------ |\n| -n     | 打印时不加换行符     |\n| -e     | 解析字符     |\n\n注: 一般情况下字符串不必加双引号, 如果包含转义字符就必须要加\n\n```bash\n# 在终端输出 Hello World\n$ echo \"Hello World\"\n$ echo Hello World    # 也可以不加双引号\n$ echo \"Hello\\nWorld\" # 必须加双引号, 否则无法转义\n\n# 打印系统环境变量，如果变量不存在输出为空\n$ echo $PATH\n\n# \u003e 输出重定向，将内容输出到文件中\n$ echo Hello World \u003e 1.txt\n\n# -n 不换行, 默认情况下会换行\n$ echo -n Hello; echo World\n\n# -e 解析字符, 比如让字体输出颜色\n$ echo -e \"\\033[1;32m绿色\\033[0m\"\n$ echo -e \"\\n换行\\n\" # 解析 \\n 作为换行\n```\n\n\n\n\n\n\n## date\n显示或设置系统时间日期\n\n\n| 格式化符号   | 描述              |\n| ---------- |------------------- |\n| %%     | 百分号 |\n| %a     | 当地缩写的工作日名称（例如，Sun） |\n| %A     | 当地完整的工作日名称（例如，Sunday） |\n| %b     | 当地缩写的月份名称（例如，Jan） |\n| %B     | 当地完整的月份名称（例如，January） |\n| %c     | 当地的日期和时间（例如，Thu Mar  3 23:05:25 2005） |\n| %C     | 世纪，和 `%Y` 类似，但是省略后两位（例如，20） |\n| %d     | 一月中的一天（例如，01） |\n| %D     | 日期，等价于 `%m/%d/%y` |\n| %e     | 一月中的一天，格式使用空格填充，等价于 `%_d` |\n| %F     | 完整的日期；等价于 `%+4Y-%m-%d` |\n| %g     | ISO标准计数周的年份的最后两位数字 |\n| %G     | ISO标准计数周的年份，通常只对 `%V` 有用 |\n| %h     | 等价于 `%b` |\n| %H     | 小时，范围（00..23）24小时制 |\n| %I     | 小时，范围（00..12）12小时制 |\n| %j     | 一年中的一天，范围（001..366） |\n| %k     | 小时，使用空格填充，范围（0..23），等价于 `%_H` |\n| %l     | 小时，使用空格填充，范围（1..12），等价于 `%_I` |\n| %m     | 月，范围（01..12） |\n| %M     | 分钟，范围（00..59） |\n| %n     | 换行符 |\n| %N     | 纳秒，范围（000000000..000000000） |\n| %p     | 用于表示当地的AM或PM，如果未知则为空白 |\n| %P     | 类似于 `%p` ，但用小写表示 |\n| %q     | 季度，范围（1..4） |\n| %r     | 当地以12小时表示的时钟时间（例如，11:11:04 PM） |\n| %R     | 24小时每分钟；等价于 `%H:%M` |\n| %s     | 自协调世界时1970年01月01日00时00分以来的秒数 |\n| %S     | 秒数，范围（00..60） |\n| %t     | 水平制表符 |\n| %T     | 时间；等价于 `%H:%M:%S` |\n| %u     | 一周中的一天（1..7），1代表星期一 |\n| %U     | 一年中的第几周，周日作为一周的起始（00..53） |\n| %V     | ISO标准计数周，该方法将周一作为一周的起始（01..53） |\n| %w     | 一周中的一天（0..6），0代表星期天 |\n| %W     | 一年中的第几周，周一作为一周的起始（00..53） |\n| %x     | 当地的日期表示（例如，12/31/99） |\n| %X     | 当地的时间表示（例如，23:13:48） |\n| %y     | 年份后两位数字，范围（00..99） |\n| %Y     | 年份 |\n| %z     | +hhmm格式的数值化时区格式（例如，-0400） |\n| %:z    | +hh:mm格式的数值化时区格式（例如，-04:00） |\n| %::z   | +hh:mm:ss格式的数值化时区格式（例如，-04:00:00）  |\n| %:::z  | 数值化时区格式，相比上一个格式增加':'以显示必要的精度（例如，-04，+05:30） |  |\n| %Z     | 时区缩写（如EDT） |\n| -      | (连字符) 不要填充相应的字段。 |\n| _      | (下划线) 使用空格填充相应的字段。 |\n| 0      | (数字0) 使用数字0填充相应的字段。 |\n| +      | 用数字0填充，未来年份大于4位数字则在前面加上'+'号。 |\n| ^      | 允许的情况下使用大写。 |\n| #      | 允许的情况下将默认的大写转换为小写，默认的小写转换为大写。 |\n\n\n```bash\n# 显示当前时间\n$ date\n\n# 格式化当前时间\n$ date +\"%Y-%m-%d %H:%M.%S\" # 2020-07-01 00:00.00\n\n# 设置系统时间\n$ date -s  # 设置当前时间, 须root\n$ date -s \"2020-07-01 00:00:00\" # 设置指定时间\n```\n\n\n\n\n\n\n\n## man\n查看指令帮助手册\n\n**man 信息说明**\n\n| 名称            | 描述              |\n| -------------- |------------------ |\n| NAME           | 显示命令名和一段简短的描述     |\n| SYNOPSIS       | 命令的语法     |\n| CONFI GURATION | 命令配置信息     |\n| DESCRIPTION    | 命令的一般性描述    |\n| OPTIONS        | 命令选项描述    |\n| EXIT STATUS    | 命令的退出状态指示     |\n| RETURN VALUE   | 命令的返回值    |\n| ERRORS         | 命令的错误消息    |\n| ENVIRONMENT    | 描述所使用的环境变量    |\n| FILES          | 命令用到的文件    |\n| VERSIONS       | 命令的版本信息     |\n| CONFORMING TO  | 命令所遵从的标准    |\n| NOTES          | 其他有帮助的资料    |\n| BUGS           | 提供提交BUG的途径    |\n| EXAMPLE        | 展示命令的用法    |\n| AUTHORS        | 命令开发人员的信息     |\n| COPYRIGHT      | 命令源代码的版权状况     |\n| SEE ALSO       | 与该命令类型的其他命令     |\n\n\n\n```bash\n# 查看 ls 指令帮助手册\n$ man ls\n\n# 可以通过数字来阅读某一部分内容, 比如阅读第一部分\n$ man 1 ls\n\n# -a 在所有手册中查找\n$ man -a ls\n\n# -k, 搜索关键字, 如果忘记了完整的命令可以通过关键字搜索出来，比如 nginx\n$ man -k ngi\n```\n\n\n\n\n\n\n## sleep\n将目前动作延迟一段时间, 通常用于脚本当中\n\n时间参数, 这是可选的，默认s：\n- s 秒\n- m 分钟\n- h 小时\n- d 天\n\n\n```bash\n# 5秒后输出 Hello\n$ sleep 5s; echo Hello\n```\n\n下面是一段 Shell 脚本， 延迟10秒后再去请求\n```bash\n#!/bin/bash\n\nsleep 10s\n\ncurl https://www.xiejiahe.com/\n```\n\n\n\n\n\n\n## history\n列出当前系统使用过的命令，通常保存在 `~/.bash_history` 文件中，注意的是只有在Shell退出时才写入到文件。\n\n如果是在 `mac` 下运行会有差异。\n\n```bash\n# 列出当前使用过的命令\n$ history\n\n# 指定要显示的条数, mac 下不支持\n$ history 50\n\n# 清除历史命令\n$ history -c # 清空历史命令\n$ history -d 编号 # 清除指定编号\n\n# -a 强制写入到 ~/.bash_history 文件中而不用等shell退出才写入\n$ history -a\n```\n\n执行历史命令, 在 `mac` 下运行需要回车确认。\n```bash\n# 指定编号, 例如运行 1001 编号的命令\n$ !1001\n\n# 执行历史最后一条命令\n$ !!\n```\n\n永久清除历史记录, 默认情况下只执行 `hisotry -c` 只会清除当前Shell：\n```bash\n# 先把 .bash_history 文件所有内容删除，然后再次强制写入\n$ sed -i \"d\" ~/.bash_history \u0026\u0026 history -a\n```\n\n\n\n\n\n\n\n## xargs\n给命令传递参数的一个过滤器，也是组合多个命令的一个工具, `将左侧的标准输出放进右侧标准输入`。\n\n此命令可以将多次操作简便为一次操作。\n\n```bash\n# 统计代码\n$ find -name \"*.js\" | xargs wc -l # 等价于 wc -l a.js b.js c.js ...\n\n# 批量下载文件\n$ cat download.txt | xargs wget\n```\n\n\n\n\n\n\n\n## cal\n显示当前日历, 别名 `ncal` 以纵向显示。\n\n```bash\n$ cal\n# 输出\n     June 2020        \nSu Mo Tu We Th Fr Sa  \n    1  2  3  4  5  6  \n 7  8  9 10 11 12 13  \n14 15 16 17 18 19 20  \n21 22 23 24 25 26 27  \n28 29 30\n\n# 显示临近3个月, -3 是固定不能更改数字\n$ cal -3\n\n# 打印今天是今年的第几天\n$ cal -j\n# 输出：今天日期会高亮显示\n       October 2020          \n Su  Mo  Tu  We  Th  Fr  Sa  \n                275 276 277  \n278 279 280 281 282 283 284  \n285 286 287 288 289 `290` 291  \n292 293 294 295 296 297 298  \n299 300 301 302 303 304 305\n\n# 打印今年1月-12月份日历\n$ cal -y\n```\n\n\n\n\n\n\n\n\n## expr\n执行数学运算，expr 命令比较鸡助，通常在 shell 脚本当中看到。但在shell脚本也不建议用。\n\nexpr 后面每个表达式都要有一个空格，否则是不合法。\n\n注：expr 只支持整数运算，这是一个限制。\n\n```bash\n# 3\n$ expr 1 + 2\n$ expr 1+2 # 这样是不行的\n\n# 在浮点数计算时会丢失小数， 这里等于 2\n$ expr 5 / 2\n```\n\n\n\n\n## bc\nbash计算器，用来执行数学运算， 与 `expr` 不同，因为 `expr` 命令不支持浮点数运算，所以可以用 `bc` 命令替代。\n\nbash计算器实际上是一种编程语言，它允许在命令行中输入浮点表达式，然后解释并计算该表达式。最后返回结果。\n\n`bc` 大多数情况下是在 shell 脚本中使用。\n\n\n```bash\n# 敲 bc 然后回车进入交互式， 输入 quit 退出\n$ bc\n\nscale=2  # 保留几位小数，默认是0\n5 / 2\n# 输出 2.50\n```\n\n\n\n\n\n\n## timeout\n在指定时长范围内执行命令，并在规定时间结束后停止进程。\n\n意思是在规定时间内必须完成，否则停止进程。\n\n\n\n```bash\n# 模拟超过3秒, 因为sleep阻塞5秒所以在3秒内无法完成，则停止进程\n$ timeout 3 sleep 5\n\n# 比如打包, 1分钟内要打包完成，否则停止进程\n$ timeout 60 npm run build\n```\n\n\n\n\n\n## exit\n退出当前登录Shell, 或使用快捷键 `Ctrl + D`。\n\n等价命令 `logout`\n\n```bash\n$ exit\n```\n\n\n\n\n\n\n\n\n\n## basename\n打印目录或者文件的基本名称。\n\n```bash\n# 输出：index.html\n$ basename /www/index.html\n\n# 输出：www\n$ basename /www/\n```\n\n\n\n\n\n\n\n\n## read\n`read` 命令从标准输入（键盘）或另一个文件描述符中接收输入。 通常用在Shell脚本, 在收到输入后，read命令会将数据存放进一个变量。\n\n\n| 参数  | 描述                   |\n| ---- |----------------------- |\n| -t   | 指定输入字符的最大等待时间  |\n| -p   | 提示信息                 |\n| -s   | 隐藏输入，比如密码信息     |\n| -n   | 限制输入字符的最大长度     |\n| -r   | 不对 `\\` 进行转义, `\\` 会正常打印    |\n\n```bash\n# 最简单用法, data 是自定义变量名，用户输入内容并回车后结束\n$ read data # echo $data  会打印用户输入的内容\n\n# -p 指定提示符\n$ read -p 确认要删除吗？ data\n\n# -t 指定超时（秒）\n$ read -t 5 -p 确认要删除吗？ data\n\n# —s 隐藏用户输入，比如密码，实际上是将文本颜色设置成背景颜色一样\n$ read -s -p \"请输入您的密码：\" data\n```\n\n\n\n\n\n\n\n## tee\ntee命令相当于管道的一个T型接头，它将从 `STDIN标准输入` 过来的数据同时发往两处，一处是 `STDOUT` ，另一处是tee命令指定的文件名。\n\ntee 命令通常用于 shell 脚本当中。\n\n```bash\n# date内容打印到屏幕上并且重定向输出到 date.txt 文件中\n$ date | tee date.txt\n\n# -a 以追加方式，默认情况下会覆盖输出文件内容\n$ date | tee -a date.txt\n```\n\n`tee` 命令只是一个语法糖，如果不用 `tee` 可以这样做：\n\n```bash\n# 1、将date结果保存到 var 变量中\n$ var=$(date)\n# 2、将结果打印到屏幕上 STDOUT\n$ echo $var\n# 3、将结果重定向到文件\n$ echo $var \u003e date.txt\n```\n\n\n\n\n## clear\n用于清除当前终端所有信息，本质上只是向后翻了一页，往上滚动还能看到之前的操作信息\n\n注：笔者用得比较多的是 `command + K` 可以完全清除终端所有操作信息。\n```bash\n$ clear\n```\n\n\n\n\n\n\n\n\n---\n\n## 致谢\n部分内容从《Linux命令行与Shell脚本编程大全》和 互联网 进行整理出来， 如有错误，欢迎指正，谢谢！\n\n\n\n\n\n\n[⬆  回顶部](#)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxjh22222228%2Flinux-manual","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxjh22222228%2Flinux-manual","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxjh22222228%2Flinux-manual/lists"}