最好用的中文速查表(Cheatsheet)
来源:https://github.com/skywind3000/awesome-cheatsheets
感谢网友们的贡献!
1 ############################################################################## 2 # 常用快捷键(默认使用 Emacs 键位) 3 ############################################################################## 4 5 CTRL+A # 移动到行首,同6 CTRL+B # 向后移动,同 7 CTRL+C # 结束当前命令 8 CTRL+D # 删除光标前的字符,同 ,或者没有内容时,退出会话 9 CTRL+E # 移动到行末,同 10 CTRL+F # 向前移动,同 11 CTRL+G # 退出当前编辑(比如正在 CTRL+R 搜索历史时) 12 CTRL+H # 删除光标左边的字符,同 13 CTRL+K # 删除光标位置到行末的内容 14 CTRL+L # 清屏并重新显示 15 CTRL+N # 移动到命令历史的下一行,同 16 CTRL+O # 类似回车,但是会显示下一行历史 17 CTRL+P # 移动到命令历史的上一行,同 18 CTRL+R # 历史命令反向搜索,使用 CTRL+G 退出搜索 19 CTRL+S # 历史命令正向搜索,使用 CTRL+G 退出搜索 20 CTRL+T # 交换前后两个字符 21 CTRL+U # 删除字符到行首 22 CTRL+V # 输入字符字面量,先按 CTRL+V 再按任意键 23 CTRL+W # 删除光标左边的一个单词 24 CTRL+X # 列出可能的补全 25 CTRL+Y # 粘贴前面 CTRL+u/k/w 删除过的内容 26 CTRL+Z # 暂停前台进程返回 bash,需要时可用 fg 将其切换回前台 27 CTRL+_ # 撤销(undo),有的终端将 CTRL+_ 映射为 CTRL+/ 或 CTRL+7 28 29 ALT+b # 向后(左边)移动一个单词 30 ALT+d # 删除光标后(右边)一个单词 31 ALT+f # 向前(右边)移动一个单词 32 ALT+t # 交换字符 33 ALT+BACKSPACE # 删除光标前面一个单词,类似 CTRL+W,但不影响剪贴板 34 35 CTRL+X CTRL+X # 连续按两次 CTRL+X,光标在当前位置和行首来回跳转 36 CTRL+X CTRL+E # 用你指定的编辑器,编辑当前命令 37 38 39 ############################################################################## 40 # BASH 基本操作 41 ############################################################################## 42 43 exit # 退出当前登陆 44 env # 显示环境变量 45 echo $SHELL # 显示你在使用什么 SHELL 46 47 bash # 使用 bash,用 exit 返回 48 which bash # 搜索 $PATH,查找哪个程序对应命令 bash 49 whereis bash # 搜索可执行,头文件和帮助信息的位置,使用系统内建数据库 50 whatis bash # 查看某个命令的解释,一句话告诉你这是干什么的 51 52 clear # 清初屏幕内容 53 reset # 重置终端(当你不小心 cat 了一个二进制,终端状态乱掉时使用) 54 55 56 ############################################################################## 57 # 目录操作 58 ############################################################################## 59 60 cd # 返回自己 $HOME 目录 61 cd {dirname} # 进入目录 62 pwd # 显示当前所在目录 63 mkdir {dirname} # 创建目录 64 mkdir -p {dirname} # 递归创建目录 65 pushd {dirname} # 目录压栈并进入新目录 66 popd # 弹出并进入栈顶的目录 67 dirs -v # 列出当前目录栈 68 cd - # 回到之前的目录 69 cd -{N} # 切换到目录栈中的第 N个目录,比如 cd -2 将切换到第二个 70 71 72 ############################################################################## 73 # 文件操作 74 ############################################################################## 75 76 ls # 显示当前目录内容,后面可接目录名:ls {dir} 显示指定目录 77 ls -l # 列表方式显示目录内容,包括文件日期,大小,权限等信息 78 ls -1 # 列表方式显示目录内容,只显示文件名称,减号后面是数字 1 79 ls -a # 显示所有文件和目录,包括隐藏文件(.开头的文件/目录名) 80 ln -s {fn} {link} # 给指定文件创建一个软链接 81 cp {src} {dest} # 拷贝文件,cp -r dir1 dir2 可以递归拷贝(目录) 82 rm {fn} # 删除文件,rm -r 递归删除目录,rm -f 强制删除 83 mv {src} {dest} # 移动文件,如果 dest 是目录,则移动,是文件名则覆盖 84 touch {fn} # 创建或者更新一下制定文件 85 cat {fn} # 输出文件原始内容 86 any_cmd > {fn} # 执行任意命令并将标准输出重定向到指定文件 87 more {fn} # 逐屏显示某文件内容,空格翻页,q 退出 88 less {fn} # 更高级点的 more,更多操作,q 退出 89 head {fn} # 显示文件头部数行,可用 head -3 abc.txt 显示头三行 90 tail {fn} # 显示文件尾部数行,可用 tail -3 abc.txt 显示尾部三行 91 tail -f {fn} # 持续显示文件尾部数据,可用于监控日志 92 nano {fn} # 使用 nano 编辑器编辑文件 93 vim {fn} # 使用 vim 编辑文件 94 diff {f1} {f2} # 比较两个文件的内容 95 wc {fn} # 统计文件有多少行,多少个单词 96 chmod 644 {fn} # 修改文件权限为 644,可以接 -R 对目录循环改权限 97 chgrp group {fn} # 修改文件所属的用户组 98 chown user1 {fn} # 修改文件所有人为 user1, chown user1:group1 fn 可以修改组 99 file {fn} # 检测文件的类型和编码 100 basename {fn} # 查看文件的名字(不包括路径) 101 dirname {fn} # 查看文件的路径(不包括名字) 102 grep {pat} {fn} # 在文件中查找出现过 pat 的内容 103 grep -r {pat} . # 在当前目录下递归查找所有出现过 pat 的文件内容 104 stat {fn} # 显示文件的详细信息 105 106 107 ############################################################################## 108 # 用户管理 109 ############################################################################## 110 111 whoami # 显示我的用户名 112 who # 显示已登陆用户信息,w / who / users 内容略有不同 113 w # 显示已登陆用户信息,w / who / users 内容略有不同 114 users # 显示已登陆用户信息,w / who / users 内容略有不同 115 passwd # 修改密码,passwd {user} 可以用于 root 修改别人密码 116 finger {user} # 显示某用户信息,包括 id, 名字, 登陆状态等 117 adduser {user} # 添加用户 118 deluser {user} # 删除用户 119 w # 查看谁在线 120 su # 切换到 root 用户 121 su - # 切换到 root 用户并登陆(执行登陆脚本) 122 su {user} # 切换到某用户 123 su -{user} # 切换到某用户并登陆(执行登陆脚本) 124 id {user} # 查看用户的 uid,gid 以及所属其他用户组 125 id -u {user} # 打印用户 uid 126 id -g {user} # 打印用户 gid 127 write {user} # 向某用户发送一句消息 128 last # 显示最近用户登陆列表 129 last {user} # 显示登陆记录 130 lastb # 显示失败登陆记录 131 lastlog # 显示所有用户的最近登陆记录 132 sudo {command} # 以 root 权限执行某命令 133 134 135 ############################################################################## 136 # 进程管理 137 ############################################################################## 138 139 ps # 查看当前会话进程 140 ps ax # 查看所有进程,类似 ps -e 141 ps aux # 查看所有进程详细信息,类似 ps -ef 142 ps auxww # 查看所有进程,并且显示进程的完整启动命令 143 ps -u {user} # 查看某用户进程 144 ps axjf # 列出进程树 145 ps xjf -u {user} # 列出某用户的进程树 146 ps -eo pid,user,command # 按用户指定的格式查看进程 147 ps aux | grep httpd # 查看名为 httpd 的所有进程 148 ps --ppid {pid} # 查看父进程为 pid 的所有进程 149 pstree # 树形列出所有进程,pstree 默认一般不带,需安装 150 pstree {user} # 进程树列出某用户的进程 151 pstree -u # 树形列出所有进程以及所属用户 152 pgrep {procname} # 搜索名字匹配的进程的 pid,比如 pgrep apache2 153 154 kill {pid} # 结束进程 155 kill -9 {pid} # 强制结束进程,9/SIGKILL 是强制不可捕获结束信号 156 kill -KILL {pid} # 强制执行进程,kill -9 的另外一种写法 157 kill -l # 查看所有信号 158 kill -l TERM # 查看 TERM 信号的编号 159 killall {procname} # 按名称结束所有进程 160 pkill {procname} # 按名称结束进程,除名称外还可以有其他参数 161 162 top # 查看最活跃的进程 163 top -u {user} # 查看某用户最活跃的进程 164 165 any_command & # 在后台运行某命令,也可用 CTRL+Z 将当前进程挂到后台 166 jobs # 查看所有后台进程(jobs) 167 bg # 查看后台进程,并切换过去 168 fg # 切换后台进程到前台 169 fg {job} # 切换特定后台进程到前台 170 171 trap cmd sig1 sig2 # 在脚本中设置信号处理命令 172 trap "" sig1 sig2 # 在脚本中屏蔽某信号 173 trap - sig1 sig2 # 恢复默认信号处理行为 174 175 nohup {command} # 长期运行某程序,在你退出登陆都保持它运行 176 nohup {command} & # 在后台长期运行某程序 177 disown {PID|JID} # 将进程从后台任务列表(jobs)移除 178 179 wait # 等待所有后台进程任务结束 180 181 182 ############################################################################## 183 # 常用命令:SSH / 系统信息 / 网络 184 ############################################################################## 185 186 ssh user@host # 以用户 user 登陆到远程主机 host 187 ssh -p {port} user@host # 指定端口登陆主机 188 ssh-copy-id user@host # 拷贝你的 ssh key 到远程主机,避免重复输入密码 189 scp {fn} user@host:path # 拷贝文件到远程主机 190 scp user@host:path dest # 从远程主机拷贝文件回来 191 scp -P {port} ... # 指定端口远程拷贝文件 192 193 uname -a # 查看内核版本等信息 194 man {help} # 查看帮助 195 man -k {keyword} # 查看哪些帮助文档里包含了该关键字 196 info {help} # 查看 info pages,比 man 更强的帮助系统 197 uptime # 查看系统启动时间 198 date # 显示日期 199 cal # 显示日历 200 vmstat # 显示内存和 CPU 使用情况 201 vmstat 10 # 每 10 秒打印一行内存和 CPU情况,CTRL+C 退出 202 free # 显示内存和交换区使用情况 203 df # 显示磁盘使用情况 204 du # 显示当前目录占用,du . --max-depth=2 可以指定深度 205 uname # 显示系统版本号 206 hostname # 显示主机名称 207 showkey -a # 查看终端发送的按键编码 208 209 ping {host} # ping 远程主机并显示结果,CTRL+C 退出 210 ping -c N {host} # ping 远程主机 N 次 211 traceroute {host} # 侦测路由连通情况 212 mtr {host} # 高级版本 traceroute 213 host {domain} # DNS 查询,{domain} 前面可加 -a 查看详细信息 214 whois {domain} # 取得域名 whois 信息 215 dig {domain} # 取得域名 dns 信息 216 route -n # 查看路由表 217 netstat -a # 列出所有端口 218 netstat -an # 查看所有连接信息,不解析域名 219 netstat -anp # 查看所有连接信息,包含进程信息(需要 sudo) 220 netstat -l # 查看所有监听的端口 221 netstat -t # 查看所有 TCP 链接 222 netstat -lntu # 显示所有正在监听的 TCP 和 UDP 信息 223 netstat -lntup # 显示所有正在监听的 socket 及进程信息 224 netstat -i # 显示网卡信息 225 netstat -rn # 显示当前系统路由表,同 route -n 226 ss -an # 比 netstat -an 更快速更详细 227 ss -s # 统计 TCP 的 established, wait 等 228 229 wget {url} # 下载文件,可加 --no-check-certificate 忽略 ssl 验证 230 wget -qO- {url} # 下载文件并输出到标准输出(不保存) 231 curl -sL {url} # 同 wget -qO- {url} 没有 wget 的时候使用 232 233 sz {file} # 发送文件到终端,zmodem 协议 234 rz # 接收终端发送过来的文件 235 236 237 ############################################################################## 238 # 变量操作 239 ############################################################################## 240 241 varname=value # 定义变量 242 varname=value command # 定义子进程变量并执行子进程 243 echo $varname # 查看变量内容 244 echo $$ # 查看当前 shell 的进程号 245 echo $! # 查看最近调用的后台任务进程号 246 echo $? # 查看最近一条命令的返回码 247 export VARNAME=value # 设置环境变量(将会影响到子进程) 248 249 array[0]=valA # 定义数组 250 array[1]=valB 251 array[2]=valC 252 array=([0]=valA [1]=valB [2]=valC) # 另一种方式 253 array=(valA valB valC) # 另一种方式 254 255 ${array[i]} # 取得数组中的元素 256 ${#array[@]} # 取得数组的长度 257 ${#array[i]} # 取得数组中某个变量的长度 258 259 declare -a # 查看所有数组 260 declare -f # 查看所有函数 261 declare -F # 查看所有函数,仅显示函数名 262 declare -i # 查看所有整数 263 declare -r # 查看所有只读变量 264 declare -x # 查看所有被导出成环境变量的东西 265 declare -p varname # 输出变量是怎么定义的(类型+值) 266 267 ${varname:-word} # 如果变量不为空则返回变量,否则返回 word 268 ${varname:=word} # 如果变量不为空则返回变量,否则赋值成 word 并返回 269 ${varname:?message} # 如果变量不为空则返回变量,否则打印错误信息并退出 270 ${varname:+word} # 如果变量不为空则返回 word,否则返回 null 271 ${varname:offset:len} # 取得字符串的子字符串 272 273 ${variable#pattern} # 如果变量头部匹配 pattern,则删除最小匹配部分返回剩下的 274 ${variable##pattern} # 如果变量头部匹配 pattern,则删除最大匹配部分返回剩下的 275 ${variable%pattern} # 如果变量尾部匹配 pattern,则删除最小匹配部分返回剩下的 276 ${variable%%pattern} # 如果变量尾部匹配 pattern,则删除最大匹配部分返回剩下的 277 ${variable/pattern/str} # 将变量中第一个匹配 pattern 的替换成 str,并返回 278 ${variable//pattern/str} # 将变量中所有匹配 pattern 的地方替换成 str 并返回 279 280 ${#varname} # 返回字符串长度 281 282 *(patternlist) # 零次或者多次匹配 283 +(patternlist) # 一次或者多次匹配 284 ?(patternlist) # 零次或者一次匹配 285 @(patternlist) # 单词匹配 286 !(patternlist) # 不匹配 287 288 array=($text) # 按空格分隔 text 成数组,并赋值给变量 289 IFS="/" array=($text) # 按斜杆分隔字符串 text 成数组,并赋值给变量 290 text="${array[*]}" # 用空格链接数组并赋值给变量 291 text=$(IFS=/; echo "${array[*]}") # 用斜杠链接数组并赋值给变量 292 293 A=( foo bar "a b c" 42 ) # 数组定义 294 B=("${A[@]:1:2}") # 数组切片:B=( bar "a b c" ) 295 C=("${A[@]:1}") # 数组切片:C=( bar "a b c" 42 ) 296 echo "${B[@]}" # bar a b c 297 echo "${B[1]}" # a b c 298 echo "${C[@]}" # bar a b c 42 299 echo "${C[@]: -2:2}" # a b c 42 减号前的空格是必须的 300 301 $(UNIX command) # 运行命令,并将标准输出内容捕获并返回 302 varname=$(id -u user) # 将用户名为 user 的 uid 赋值给 varname 变量 303 304 num=$(expr 1 + 2) # 兼容 posix sh 的计算,使用 expr 命令计算结果 305 num=$(expr $num + 1) # 数字自增 306 expr 2 \* \( 2 + 3 \) # 兼容 posix sh 的复杂计算,输出 10 307 308 num=$((1 + 2)) # 计算 1+2 赋值给 num,使用 bash 独有的 $((..)) 计算 309 num=$(($num + 1)) # 变量递增 310 num=$((num + 1)) # 变量递增,双括号内的 $ 可以省略 311 num=$((1 + (2 + 3) * 2)) # 复杂计算 312 313 314 ############################################################################## 315 # 事件指示符 316 ############################################################################## 317 318 !! # 上一条命令 319 !^ # 上一条命令的第一个单词 320 !$ # 上一条命令的最后一个单词 321 !string # 最近一条包含string的命令 322 !^string1^string2 # 最近一条包含string1的命令, 快速替换为string2, 相当于!!:s/string1/string2/ 323 !# # 本条命令之前所有的输入内容 324 325 326 ############################################################################## 327 # 函数 328 ############################################################################## 329 330 # 定义一个新函数 331 function myfunc() { 332 # $1 代表第一个参数,$N 代表第 N 个参数 333 # $# 代表参数个数 334 # $0 代表被调用者自身的名字 335 # $@ 代表所有参数,类型是个数组,想传递所有参数给其他命令用 cmd "$@" 336 # $* 空格链接起来的所有参数,类型是字符串 337 {shell commands ...} 338 } 339 340 myfunc # 调用函数 myfunc 341 myfunc arg1 arg2 arg3 # 带参数的函数调用 342 myfunc "$@" # 将所有参数传递给函数 343 myfunc "${array[@]}" # 将一个数组当作多个参数传递给函数 344 shift # 参数左移 345 346 unset -f myfunc # 删除函数 347 declare -f # 列出函数定义 348 349 350 ############################################################################## 351 # 条件判断(兼容 posix sh 的条件判断):man test 352 ############################################################################## 353 354 statement1 && statement2 # and 操作符 355 statement1 || statement2 # or 操作符 356 357 exp1 -a exp2 # exp1 和 exp2 同时为真时返回真(POSIX XSI扩展) 358 exp1 -o exp2 # exp1 和 exp2 有一个为真就返回真(POSIX XSI扩展) 359 ( expression ) # 如果 expression 为真时返回真,输入注意括号前反斜杆 360 ! expression # 如果 expression 为假那返回真 361 362 str1 = str2 # 判断字符串相等,如 [ "$x" = "$y" ] && echo yes 363 str1 != str2 # 判断字符串不等,如 [ "$x" != "$y" ] && echo yes 364 str1 < str2 # 字符串小于,如 [ "$x" \< "$y" ] && echo yes 365 str2 > str2 # 字符串大于,注意 < 或 > 是字面量,输入时要加反斜杆 366 -n str1 # 判断字符串不为空(长度大于零) 367 -z str1 # 判断字符串为空(长度等于零) 368 369 -a file # 判断文件存在,如 [ -a /tmp/abc ] && echo "exists" 370 -d file # 判断文件存在,且该文件是一个目录 371 -e file # 判断文件存在,和 -a 等价 372 -f file # 判断文件存在,且该文件是一个普通文件(非目录等) 373 -r file # 判断文件存在,且可读 374 -s file # 判断文件存在,且尺寸大于0 375 -w file # 判断文件存在,且可写 376 -x file # 判断文件存在,且执行 377 -N file # 文件上次修改过后还没有读取过 378 -O file # 文件存在且属于当前用户 379 -G file # 文件存在且匹配你的用户组 380 file1 -nt file2 # 文件1 比 文件2 新 381 file1 -ot file2 # 文件1 比 文件2 旧 382 383 num1 -eq num2 # 数字判断:num1 == num2 384 num1 -ne num2 # 数字判断:num1 != num2 385 num1 -lt num2 # 数字判断:num1 < num2 386 num1 -le num2 # 数字判断:num1 <= num2 387 num1 -gt num2 # 数字判断:num1 > num2 388 num1 -ge num2 # 数字判断:num1 >= num2 389 390 391 ############################################################################## 392 # 分支控制:if 和经典 test,兼容 posix sh 的条件判断语句 393 ############################################################################## 394 395 test {expression} # 判断条件为真的话 test 程序返回0 否则非零 396 [ expression ] # 判断条件为真的话返回0 否则非零 397 398 test "abc" = "def" # 查看返回值 echo $? 显示 1,因为条件为假 399 test "abc" != "def" # 查看返回值 echo $? 显示 0,因为条件为真 400 401 test -a /tmp; echo $? # 调用 test 判断 /tmp 是否存在,并打印 test 的返回值 402 [ -a /tmp ]; echo $? # 和上面完全等价,/tmp 肯定是存在的,所以输出是 0 403 404 test cond && cmd1 # 判断条件为真时执行 cmd1 405 [ cond ] && cmd1 # 和上面完全等价 406 [ cond ] && cmd1 || cmd2 # 条件为真执行 cmd1 否则执行 cmd2 407 408 # 判断 /etc/passwd 文件是否存在 409 # 经典的 if 语句就是判断后面的命令返回值为0的话,认为条件为真,否则为假 410 if test -e /etc/passwd; then 411 echo "alright it exists ... " 412 else 413 echo "it doesn't exist ... " 414 fi 415 416 # 和上面完全等价,[ 是个和 test 一样的可执行程序,但最后一个参数必须为 ] 417 # 这个名字为 "[" 的可执行程序一般就在 /bin 或 /usr/bin 下面,比 test 优雅些 418 if [ -e /etc/passwd ]; then 419 echo "alright it exists ... " 420 else 421 echo "it doesn't exist ... " 422 fi 423 424 # 和上面两个完全等价,其实到 bash 时代 [ 已经是内部命令了,用 enable 可以看到 425 [ -e /etc/passwd ] && echo "alright it exists" || echo "it doesn't exist" 426 427 # 判断变量的值 428 if [ "$varname" = "foo" ]; then 429 echo "this is foo" 430 elif [ "$varname" = "bar" ]; then 431 echo "this is bar" 432 else 433 echo "neither" 434 fi 435 436 # 复杂条件判断,注意 || 和 && 是完全兼容 POSIX 的推荐写法 437 if [ $x -gt 10 ] && [ $x -lt 20 ]; then 438 echo "yes, between 10 and 20" 439 fi 440 441 # 可以用 && 命令连接符来做和上面完全等价的事情 442 [ $x -gt 10 ] && [ $x -lt 20 ] && echo "yes, between 10 and 20" 443 444 # 小括号和 -a -o 是 POSIX XSI 扩展写法,小括号是字面量,输入时前面要加反斜杆 445 if [ \( $x -gt 10 \) -a \( $x -lt 20 \) ]; then 446 echo "yes, between 10 and 20" 447 fi 448 449 # 同样可以用 && 命令连接符来做和上面完全等价的事情 450 [ \( $x -gt 10 \) -a \( $x -lt 20 \) ] && echo "yes, between 10 and 20" 451 452 453 # 判断程序存在的话就执行 454 [ -x /bin/ls ] && /bin/ls -l 455 456 # 如果不考虑兼容 posix sh 和 dash 这些的话,可用 bash 独有的 ((..)) 和 [[..]]: 457 https://www.ibm.com/developerworks/library/l-bash-test/index.html 458 459 460 ############################################################################## 461 # 流程控制:while / for / case / until 462 ############################################################################## 463 464 # while 循环 465 while condition; do 466 statements 467 done 468 469 i=1 470 while [ $i -le 10 ]; do 471 echo $i; 472 i=$(expr $i + 1) 473 done 474 475 # for 循环:上面的 while 语句等价 476 for i in {1..10}; do 477 echo $i 478 done 479 480 for name [in list]; do 481 statements 482 done 483 484 # for 列举某目录下面的所有文件 485 for f in /home/*; do 486 echo $f 487 done 488 489 # bash 独有的 (( .. )) 语句,更接近 C 语言,但是不兼容 posix sh 490 for (( initialisation ; ending condition ; update )); do 491 statements 492 done 493 494 # 和上面的写法等价 495 for ((i = 0; i < 10; i++)); do echo $i; done 496 497 # case 判断 498 case expression in 499 pattern1 ) 500 statements ;; 501 pattern2 ) 502 statements ;; 503 * ) 504 otherwise ;; 505 esac 506 507 # until 语句 508 until condition; do 509 statements 510 done 511 512 # select 语句 513 select name [in list]; do 514 statements that can use $name 515 done 516 517 518 ############################################################################## 519 # 命令处理 520 ############################################################################## 521 522 command ls # 忽略 alias 直接执行程序或者内建命令 ls 523 builtin cd # 忽略 alias 直接运行内建的 cd 命令 524 enable # 列出所有 bash 内置命令,或禁止某命令 525 help {builtin_command} # 查看内置命令的帮助(仅限 bash 内置命令) 526 527 eval $script # 对 script 变量中的字符串求值(执行) 528 529 530 ############################################################################## 531 # 输出/输入 重定向 532 ############################################################################## 533 534 cmd1 | cmd2 # 管道,cmd1 的标准输出接到 cmd2 的标准输入 535 < file # 将文件内容重定向为命令的标准输入 536 > file # 将命令的标准输出重定向到文件,会覆盖文件 537 >> file # 将命令的标准输出重定向到文件,追加不覆盖 538 >| file # 强制输出到文件,即便设置过:set -o noclobber 539 n>| file # 强制将文件描述符 n的输出重定向到文件 540 <> file # 同时使用该文件作为标准输入和标准输出 541 n<> file # 同时使用文件作为文件描述符 n 的输出和输入 542 n> file # 重定向文件描述符 n 的输出到文件 543 n< file # 重定向文件描述符 n 的输入为文件内容 544 n>& # 将标准输出 dup/合并 到文件描述符 n 545 n<& # 将标准输入 dump/合并 定向为描述符 n 546 n>&m # 文件描述符 n 被作为描述符 m 的副本,输出用 547 n<&m # 文件描述符 n 被作为描述符 m 的副本,输入用 548 &>file # 将标准输出和标准错误重定向到文件 549 <&- # 关闭标准输入 550 >&- # 关闭标准输出 551 n>&- # 关闭作为输出的文件描述符 n 552 n<&- # 关闭作为输入的文件描述符 n 553 diff <(cmd1) <(cmd2) # 比较两个命令的输出 554 555 556 ############################################################################## 557 # 文本处理 - cut 558 ############################################################################## 559 560 cut -c 1-16 # 截取每行头16个字符 561 cut -c 1-16 file # 截取指定文件中每行头 16个字符 562 cut -c3- # 截取每行从第三个字符开始到行末的内容 563 cut -d':' -f5 # 截取用冒号分隔的第五列内容 564 cut -d';' -f2,10 # 截取用分号分隔的第二和第十列内容 565 cut -d' ' -f3-7 # 截取空格分隔的三到七列 566 echo "hello" | cut -c1-3 # 显示 hel 567 echo "hello sir" | cut -d' ' -f2 # 显示 sir 568 ps | tr -s " " | cut -d " " -f 2,3,4 # cut 搭配 tr 压缩字符 569 570 571 ############################################################################## 572 # 文本处理 - awk / sed 573 ############################################################################## 574 575 awk '{print $5}' file # 打印文件中以空格分隔的第五列 576 awk -F ',' '{print $5}' file # 打印文件中以逗号分隔的第五列 577 awk '/str/ {print $2}' file # 打印文件中包含 str 的所有行的第二列 578 awk -F ',' '{print $NF}' file # 打印逗号分隔的文件中的每行最后一列 579 awk '{s+=$1} END {print s}' file # 计算所有第一列的合 580 awk 'NR%3==1' file # 从第一行开始,每隔三行打印一行 581 582 sed 's/find/replace/' file # 替换文件中首次出现的字符串并输出结果 583 sed '10s/find/replace/' file # 替换文件第 10 行内容 584 sed '10,20s/find/replace/' file # 替换文件中 10-20 行内容 585 sed -r 's/regex/replace/g' file # 替换文件中所有出现的字符串 586 sed -i 's/find/replace/g' file # 替换文件中所有出现的字符并且覆盖文件 587 sed -i '/find/i\newline' file # 在文件的匹配文本前插入行 588 sed -i '/find/a\newline' file # 在文件的匹配文本后插入行 589 sed '/line/s/find/replace/' file # 先搜索行特征再执行替换 590 sed -e 's/f/r/' -e 's/f/r' file # 执行多次替换 591 sed 's#find#replace#' file # 使用 # 替换 / 来避免 pattern 中有斜杆 592 sed -i -r 's/^\s+//g' file # 删除文件每行头部空格 593 sed '/^$/d' file # 删除文件空行并打印 594 sed -i 's/\s\+$//' file # 删除文件每行末尾多余空格 595 sed -n '2p' file # 打印文件第二行 596 sed -n '2,5p' file # 打印文件第二到第五行 597 598 599 ############################################################################## 600 # 排序 - sort 601 ############################################################################## 602 603 sort file # 排序文件 604 sort -r file # 反向排序(降序) 605 sort -n file # 使用数字而不是字符串进行比较 606 sort -t: -k 3n /etc/passwd # 按 passwd 文件的第三列进行排序 607 sort -u file # 去重排序 608 609 610 ############################################################################## 611 # 快速跳转 - https://github.com/rupa/z 612 ############################################################################## 613 614 source /path/to/z.sh # .bashrc 中初始化 z.sh 615 z # 列出所有历史路径以及他们的权重 616 z foo # 跳到历史路径中匹配 foo 的权重最大的目录 617 z foo bar # 跳到历史路径中匹配 foo 和 bar 权重最大的目录 618 z -l foo # 列出所有历史路径中匹配 foo 的目录及权重 619 z -r foo # 按照最高访问次数优先进行匹配跳转 620 z -t foo # 按照最近访问优先进行匹配跳转 621 622 623 ############################################################################## 624 # 键盘绑定 625 ############################################################################## 626 627 bind '"\eh":"\C-b"' # 绑定 ALT+h 为光标左移,同 CTRL+b / 628 bind '"\el":"\C-f"' # 绑定 ALT+l 为光标右移,同 CTRL+f / 629 bind '"\ej":"\C-n"' # 绑定 ALT+j 为下条历史,同 CTRL+n / 630 bind '"\ek":"\C-p"' # 绑定 ALT+k 为上条历史,同 CTRL+p / 631 bind '"\eH":"\eb"' # 绑定 ALT+H 为光标左移一个单词,同 ALT-b 632 bind '"\eL":"\ef"' # 绑定 ALT+L 为光标右移一个单词,同 ALT-f 633 bind '"\eJ":"\C-a"' # 绑定 ALT+J 为移动到行首,同 CTRL+a / 634 bind '"\eK":"\C-e"' # 绑定 ALT+K 为移动到行末,同 CTRL+e / 635 bind '"\e;":"ls -l\n"' # 绑定 ALT+; 为执行 ls -l 命令 636 637 638 ############################################################################## 639 # 网络管理:ip / ifconfig / nmap ... 640 ############################################################################## 641 642 ip a # 显示所有网络地址,同 ip address 643 ip a show eth1 # 显示网卡 IP 地址 644 ip a add 172.16.1.23/24 dev eth1 # 添加网卡 IP 地址 645 ip a del 172.16.1.23/24 dev eth1 # 删除网卡 IP 地址 646 ip link show dev eth0 # 显示网卡设备属性 647 ip link set eth1 up # 激活网卡 648 ip link set eth1 down # 关闭网卡 649 ip link set eth1 address {mac} # 修改 MAC 地址 650 ip neighbour # 查看 ARP 缓存 651 ip route # 查看路由表 652 ip route add 10.1.0.0/24 via 10.0.0.253 dev eth0 # 添加静态路由 653 ip route del 10.1.0.0/24 # 删除静态路由 654 655 ifconfig # 显示所有网卡和接口信息 656 ifconfig -a # 显示所有网卡(包括开机没启动的)信息 657 ifconfig eth0 # 指定设备显示信息 658 ifconfig eth0 up # 激活网卡 659 ifconfig eth0 down # 关闭网卡 660 ifconfig eth0 192.168.120.56 # 给网卡配置 IP 地址 661 ifconfig eth0 10.0.0.8 netmask 255.255.255.0 up # 配置 IP 并启动 662 ifconfig eth0 hw ether 00:aa:bb:cc:dd:ee # 修改 MAC 地址 663 664 nmap 10.0.0.12 # 扫描主机 1-1000 端口 665 nmap -p 1024-65535 10.0.0.12 # 扫描给定端口 666 nmap 10.0.0.0/24 # 给定网段扫描局域网内所有主机 667 nmap -O -sV 10.0.0.12 # 探测主机服务和操作系统版本 668 669 670 ############################################################################## 671 # 有趣的命令 672 ############################################################################## 673 674 man hier # 查看文件系统的结构和含义 675 man test # 查看 posix sh 的条件判断帮助 676 man ascii # 显示 ascii 表 677 getconf LONG_BIT # 查看系统是 32 位还是 64 位 678 bind -P # 列出所有 bash 的快捷键 679 mount | column -t # 漂亮的列出当前加载的文件系统 680 curl ip.cn # 取得外网 ip 地址和服务商信息 681 disown -a && exit # 关闭所有后台任务并退出 682 cat /etc/issue # 查看 Linux 发行版信息 683 lsof -i port:80 # 哪个程序在使用 80 端口? 684 showkey -a # 取得按键的 ASCII 码 685 svn diff | view - # 使用 Vim 来显示带色彩的 diff 输出 686 mv filename.{old,new} # 快速文件改名 687 time read # 使用 CTRL-D 停止,最简单的计时功能 688 cp file.txt{,.bak} # 快速备份文件 689 sudo touch /forcefsck # 强制在下次重启时扫描磁盘 690 find ~ -mmin 60 -type f # 查找 $HOME 目录中,60 分钟内修改过的文件 691 curl wttr.in/~beijing # 查看北京的天气预报 692 echo ${SSH_CLIENT%% *} # 取得你是从什么 IP 链接到当前主机上的 693 echo $[RANDOM%X+1] # 取得 1 到 X 之间的随机数 694 bind -x '"\C-l":ls -l' # 设置 CTRL+l 为执行 ls -l 命令 695 find / -type f -size +5M # 查找大于 5M 的文件 696 chmod --reference f1 f2 # 将 f2 的权限设置成 f1 一模一样的 697 curl -L cheat.sh # 速查表大全 698 699 700 ############################################################################## 701 # 常用技巧 702 ############################################################################## 703 704 # 列出最常使用的命令 705 history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head 706 707 # 列出所有网络状态:ESTABLISHED / TIME_WAIT / FIN_WAIT1 / FIN_WAIT2 708 netstat -n | awk '/^tcp/ {++tt[$NF]} END {for (a in tt) print a, tt[a]}' 709 710 # 通过 SSH 来 mount 文件系统 711 sshfs name@server:/path/to/folder /path/to/mount/point 712 713 # 显示前十个运行的进程并按内存使用量排序 714 ps aux | sort -nk +4 | tail 715 716 # 在右上角显示时钟 717 while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done& 718 719 # 从网络上的压缩文件中解出一个文件来,并避免保存中间文件 720 wget -qO - "http://www.tarball.com/tarball.gz" | tar zxvf - 721 722 # 性能测试:测试处理器性能 723 python -c "import test.pystone;print(test.pystone.pystones())" 724 725 # 性能测试:测试内存带宽 726 dd if=/dev/zero of=/dev/null bs=1M count=32768 727 728 # Linux 下挂载一个 iso 文件 729 mount /path/to/file.iso /mnt/cdrom -oloop 730 731 # 通过主机 A 直接 ssh 到主机 B 732 ssh -t hostA ssh hostB 733 734 # 下载一个网站的所有图片 735 wget -r -l1 --no-parent -nH -nd -P/tmp -A".gif,.jpg" http://example.com/images 736 737 # 快速创建项目目录 738 mkdir -p work/{project1,project2}/{src,bin,bak} 739 740 # 按日期范围查找文件 741 find . -type f -newermt "2010-01-01" ! -newermt "2010-06-01" 742 743 # 显示当前正在使用网络的进程 744 lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2 745 746 # Vim 中保存一个没有权限的文件 747 :w !sudo tee > /dev/null % 748 749 # 在 .bashrc / .bash_profile 中加载另外一个文件(比如你保存在 github 上的配置) 750 source ~/github/profiles/my_bash_init.sh 751 752 # 反向代理:将外网主机(202.115.8.1)端口(8443)转发到内网主机 192.168.1.2:443 753 ssh -CqTnN -R 0.0.0.0:8443:192.168.1.2:443 [email protected] 754 755 # 正向代理:将本地主机的 8443 端口,通过 192.168.1.3 转发到 192.168.1.2:443 756 ssh -CqTnN -L 0.0.0.0:8443:192.168.1.2:443 [email protected] 757 758 # socks5 代理:把本地 1080 端口的 socks5 的代理请求通过远程主机转发出去 759 ssh -CqTnN -D localhost:1080 [email protected] 760 761 # 终端下正确设置 ALT 键和 BackSpace 键 762 http://www.skywind.me/blog/archives/2021 763 764 765 ############################################################################## 766 # 有用的函数 767 ############################################################################## 768 769 # 自动解压:判断文件后缀名并调用相应解压命令 770 function q-extract() { 771 if [ -f $1 ] ; then 772 case $1 in 773 *.tar.bz2) tar -xvjf $1 ;; 774 *.tar.gz) tar -xvzf $1 ;; 775 *.tar.xz) tar -xvJf $1 ;; 776 *.bz2) bunzip2 $1 ;; 777 *.rar) rar x $1 ;; 778 *.gz) gunzip $1 ;; 779 *.tar) tar -xvf $1 ;; 780 *.tbz2) tar -xvjf $1 ;; 781 *.tgz) tar -xvzf $1 ;; 782 *.zip) unzip $1 ;; 783 *.Z) uncompress $1 ;; 784 *.7z) 7z x $1 ;; 785 *) echo "don't know how to extract '$1'..." ;; 786 esac 787 else 788 echo "'$1' is not a valid file!" 789 fi 790 } 791 792 # 自动压缩:判断后缀名并调用相应压缩程序 793 function q-compress() { 794 if [ -n "$1" ] ; then 795 FILE=$1 796 case $FILE in 797 *.tar) shift && tar -cf $FILE $* ;; 798 *.tar.bz2) shift && tar -cjf $FILE $* ;; 799 *.tar.xz) shift && tar -cJf $FILE $* ;; 800 *.tar.gz) shift && tar -czf $FILE $* ;; 801 *.tgz) shift && tar -czf $FILE $* ;; 802 *.zip) shift && zip $FILE $* ;; 803 *.rar) shift && rar $FILE $* ;; 804 esac 805 else 806 echo "usage: q-compress ./foo ./bar" 807 fi 808 } 809 810 # 漂亮的带语法高亮的 color cat ,需要先 pip install pygments 811 function ccat() { 812 local style="monokai" 813 if [ $# -eq 0 ]; then 814 pygmentize -P style=$style -P tabsize=4 -f terminal256 -g 815 else 816 for NAME in $@; do 817 pygmentize -P style=$style -P tabsize=4 -f terminal256 -g "$NAME" 818 done 819 fi 820 } 821 822 823 ############################################################################## 824 # 好玩的配置 825 ############################################################################## 826 827 # 放到你的 ~/.bashrc 配置文件中,给 man 增加漂亮的色彩高亮 828 export LESS_TERMCAP_mb=$'\E[1m\E[32m' 829 export LESS_TERMCAP_mh=$'\E[2m' 830 export LESS_TERMCAP_mr=$'\E[7m' 831 export LESS_TERMCAP_md=$'\E[1m\E[36m' 832 export LESS_TERMCAP_ZW="" 833 export LESS_TERMCAP_us=$'\E[4m\E[1m\E[37m' 834 export LESS_TERMCAP_me=$'\E(B\E[m' 835 export LESS_TERMCAP_ue=$'\E[24m\E(B\E[m' 836 export LESS_TERMCAP_ZO="" 837 export LESS_TERMCAP_ZN="" 838 export LESS_TERMCAP_se=$'\E[27m\E(B\E[m' 839 export LESS_TERMCAP_ZV="" 840 export LESS_TERMCAP_so=$'\E[1m\E[33m\E[44m' 841 842 # ALT+hjkl/HJKL 快速移动光标,将下面内容添加到 ~/.inputrc 中可作用所有工具, 843 # 包括 bash/zsh/python/lua 等使用 readline 的工具,帮助见:info rluserman 844 "\eh": backward-char 845 "\el": forward-char 846 "\ej": next-history 847 "\ek": previous-history 848 "\eH": backward-word 849 "\eL": forward-word 850 "\eJ": beginning-of-line 851 "\eK": end-of-line 852 853 854 ############################################################################## 855 # References 856 ############################################################################## 857 858 https://github.com/Idnan/bash-guide 859 http://www.linuxstall.com/linux-command-line-tips-that-every-linux-user-should-know/ 860 https://ss64.com/bash/syntax-keyboard.html 861 http://wiki.bash-hackers.org/commands/classictest 862 https://www.ibm.com/developerworks/library/l-bash-test/index.html 863 https://www.cyberciti.biz/faq/bash-loop-over-file/ 864 https://linuxconfig.org/bash-scripting-tutorial 865 https://github.com/LeCoupa/awesome-cheatsheets/blob/master/languages/bash.sh 866 https://devhints.io/bash 867 https://github.com/jlevy/the-art-of-command-line 868 https://yq.aliyun.com/articles/68541 869 870 # vim: set ts=4 sw=4 tw=0 et :