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