linux bash sheet

##############################################################################

#BASH CHEATSHEET (中文速查表)  -  by skywind (created on 2018/02/14)

#Version: 46, Last Modified: 2019/02/25 16:53

#https://github.com/skywind3000/awesome-cheatsheets

##############################################################################

##############################################################################

#常用快捷键(默认使用 Emacs 键位)

##############################################################################

CTRL+A#移动到行首,同

CTRL+B#向后移动,同

CTRL+C#结束当前命令

CTRL+D#删除光标前的字符,同 ,或者没有内容时,退出会话

CTRL+E#移动到行末,同

CTRL+F#向前移动,同

CTRL+G#退出当前编辑(比如正在 CTRL+R 搜索历史时)

CTRL+H#删除光标左边的字符,同

CTRL+K#删除光标位置到行末的内容

CTRL+L#清屏并重新显示

CTRL+N#移动到命令历史的下一行,同

CTRL+O#类似回车,但是会显示下一行历史

CTRL+P#移动到命令历史的上一行,同

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}#切换特定后台进程到前台

trapcmd 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 可以指定深度

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=valuecommand#定义子进程变量并执行子进程

echo$varname#查看变量内容

echo$$#查看当前 shell 的进程号

echo$!#查看最近调用的后台任务进程号

echo$?#查看最近一条命令的返回码

exportVARNAME=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}#如果变量不为空则返回变量,否则返回 word

${varname:=word}#如果变量不为空则返回变量,否则赋值成 word 并返回

${varname:?message}#如果变量不为空则返回变量,否则打印错误信息并退出

${varname:+word}#如果变量不为空则返回 word,否则返回 null

${varname:offset:len}#取得字符串的子字符串

${variable#pattern}#如果变量头部匹配 pattern,则删除最小匹配部分返回剩下的

${variable##pattern}#如果变量头部匹配 pattern,则删除最大匹配部分返回剩下的

${variable%pattern}#如果变量尾部匹配 pattern,则删除最小匹配部分返回剩下的

${variable%%pattern}#如果变量尾部匹配 pattern,则删除最大匹配部分返回剩下的

${variable/pattern/str}#将变量中第一个匹配 pattern 的替换成 str,并返回

${variable//pattern/str}#将变量中所有匹配 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=$(($num+1))#变量递增

num=$((num+1))#变量递增,双括号内的 $ 可以省略

num=$((1+(2+3)*2))#复杂计算

##############################################################################

#事件指示符

##############################################################################

!!#上一条命令

!^#上一条命令的第一个单词

!$#上一条命令的最后一个单词

!string#最近一条包含string的命令

!^string1^string2#最近一条包含string1的命令, 快速替换为string2, 相当于!!:s/string1/string2/

!## 本条命令之前所有的输入内容

##############################################################################

#函数

##############################################################################

#定义一个新函数

functionmyfunc(){

#$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>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

testcond&&cmd1#判断条件为真时执行 cmd1

[ cond ]&&cmd1#和上面完全等价

[ cond ]&&cmd1||cmd2#条件为真执行 cmd1 否则执行 cmd2

#判断 /etc/passwd 文件是否存在

#经典的 if 语句就是判断后面的命令返回值为0的话,认为条件为真,否则为假

iftest-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-gt10 ]&&[$x-lt20 ];then

echo"yes, between 10 and 20"

fi

#可以用 && 命令连接符来做和上面完全等价的事情

[$x-gt10 ]&&[$x-lt20 ]&&echo"yes, between 10 and 20"

#小括号和 -a -o 是 POSIX XSI 扩展写法,小括号是字面量,输入时前面要加反斜杆

if[\($x-gt10\)-a\($x-lt20\)];then

echo"yes, between 10 and 20"

fi

#同样可以用 && 命令连接符来做和上面完全等价的事情

[\($x-gt10\)-a\($x-lt20\)]&&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 循环

whilecondition;do

    statements

done

i=1

while[$i-le10 ];do

echo$i;

i=$(expr$i+ 1)

done

#for 循环:上面的 while 语句等价

foriin{1..10};do

echo$i

done

forname [in list];do

    statements

done

#for 列举某目录下面的所有文件

forfin/home/*;do

echo$f

done

#bash 独有的 (( .. )) 语句,更接近 C 语言,但是不兼容 posix sh

for((initialisation ; ending condition ; update));do

    statements

done

#和上面的写法等价

for((i=0; i<10; i++));doecho$i;done

#case 判断

caseexpressionin

    pattern1 )

        statements ;;

    pattern2 )

        statements ;;

*)

        otherwise ;;

esac

#until 语句

untilcondition;do

    statements

done

#select 语句

selectname[in list];do

statements that can use$name

done

##############################################################################

#命令处理

##############################################################################

commandls#忽略 alias 直接执行程序或者内建命令 ls

builtincd#忽略 alias 直接运行内建的 cd 命令

enable#列出所有 bash 内置命令,或禁止某命令

help{builtin_command}#查看内置命令的帮助(仅限 bash 内置命令)

eval$script#对 script 变量中的字符串求值(执行)

##############################################################################

#输出/输入 重定向

##############################################################################

cmd1|cmd2#管道,cmd1 的标准输出接到 cmd2 的标准输入

>file#将命令的标准输出重定向到文件,会覆盖文件

>>file#将命令的标准输出重定向到文件,追加不覆盖

>|file#强制输出到文件,即便设置过:set -o noclobber

n>|file#强制将文件描述符 n的输出重定向到文件

<>file#同时使用该文件作为标准输入和标准输出

n<>file#同时使用文件作为文件描述符 n 的输出和输入

n>file#重定向文件描述符 n 的输出到文件

n

n>&#将标准输出 dup/合并 到文件描述符 n

n<&#将标准输入 dump/合并 定向为描述符 n

n>&m#文件描述符 n 被作为描述符 m 的副本,输出用

n<&m#文件描述符 n 被作为描述符 m 的副本,输入用

&>file#将标准输出和标准错误重定向到文件

<&-#关闭标准输入

>&-#关闭标准输出

n>&-#关闭作为输出的文件描述符 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#去重排序

##############################################################################

#快速跳转 - 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 /

bind'"\el":"\C-f"'#绑定 ALT+l 为光标右移,同 CTRL+f /

bind'"\ej":"\C-n"'#绑定 ALT+j 为下条历史,同 CTRL+n /

bind'"\ek":"\C-p"'#绑定 ALT+k 为上条历史,同 CTRL+p /

bind'"\eH":"\eb"'#绑定 ALT+H 为光标左移一个单词,同 ALT-b

bind'"\eL":"\ef"'#绑定 ALT+L 为光标右移一个单词,同 ALT-f

bind'"\eJ":"\C-a"'#绑定 ALT+J 为移动到行首,同 CTRL+a /

bind'"\eK":"\C-e"'#绑定 ALT+K 为移动到行末,同 CTRL+e /

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 linkseteth1 up#激活网卡

ip linkseteth1 down#关闭网卡

ip linkseteth1 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#查看文件系统的结构和含义

mantest#查看 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}#快速文件改名

timeread#使用 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

#在右上角显示时钟

whilesleep 1;dotput 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  [email protected]

#正向代理:将本地主机的 8443 端口,通过 192.168.1.3 转发到 192.168.1.2:443

ssh -CqTnN -L 0.0.0.0:8443:192.168.1.2:443  [email protected]

#socks5 代理:把本地 1080 端口的 socks5 的代理请求通过远程主机转发出去

ssh -CqTnN -D localhost:1080  [email protected]

#终端下正确设置 ALT 键和 BackSpace 键

http://www.skywind.me/blog/archives/2021

##############################################################################

#有用的函数

##############################################################################

#自动解压:判断文件后缀名并调用相应解压命令

functionq-extract(){

if[-f$1];then

case$1in

*.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

}

#自动压缩:判断后缀名并调用相应压缩程序

functionq-compress(){

if[-n"$1"];then

FILE=$1

case$FILEin

*.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 ./bar"

fi

}

#漂亮的带语法高亮的 color cat ,需要先 pip install pygments

functionccat(){

localstyle="monokai"

if[$#-eq0 ];then

pygmentize -P style=$style-P tabsize=4 -f terminal256 -g

else

forNAMEin$@;do

pygmentize -P style=$style-P tabsize=4 -f terminal256 -g"$NAME"

done

fi

}

##############################################################################

#好玩的配置

##############################################################################

#放到你的 ~/.bashrc 配置文件中,给 man 增加漂亮的色彩高亮

exportLESS_TERMCAP_mb=$'\E[1m\E[32m'

exportLESS_TERMCAP_mh=$'\E[2m'

exportLESS_TERMCAP_mr=$'\E[7m'

exportLESS_TERMCAP_md=$'\E[1m\E[36m'

exportLESS_TERMCAP_ZW=""

exportLESS_TERMCAP_us=$'\E[4m\E[1m\E[37m'

exportLESS_TERMCAP_me=$'\E(B\E[m'

exportLESS_TERMCAP_ue=$'\E[24m\E(B\E[m'

exportLESS_TERMCAP_ZO=""

exportLESS_TERMCAP_ZN=""

exportLESS_TERMCAP_se=$'\E[27m\E(B\E[m'

exportLESS_TERMCAP_ZV=""

exportLESS_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

#vim: set ts=4 sw=4 tw=0 et :

你可能感兴趣的:(linux bash sheet)