Created
October 10, 2018 02:48
-
-
Save yangfch3/56131443e43234b50edfcda6ef984e7e to your computer and use it in GitHub Desktop.
[bash 速查手册] #bash #cheatsheets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################## | |
# BASH CHEATSHEET (中文速查表) - by skywind (created on 2018/02/14) | |
# Version: 43, Last Modified: 2018/04/02 17:00 | |
# 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 -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 可以指定深度 | |
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} # 如果变量不为空则返回变量,否则返回 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[*]}") # 用斜杠链接数组并赋值给变量 | |
$(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/ | |
!# # 本条命令之前所有的输入内容 | |
############################################################################## | |
# 函数 | |
############################################################################## | |
# 定义一个新函数 | |
function myfunc() { | |
# $1 代表第一个参数,$N 代表第 N 个参数 | |
# $# 代表参数个数 | |
# $0 代表被调用者自身的名字 | |
# $@ 代表所有参数,类型是个数组,想传递所有参数给其他命令用 cmd "$@" | |
# $* 空格链接起来的所有参数,类型是字符串 | |
{shell commands ...} | |
} | |
myfunc # 调用函数 myfunc | |
myfunc arg1 arg2 arg3 # 带参数的函数调用 | |
myfunc "$@" # 将所有参数传递给函数 | |
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 | |
pattern1 ) | |
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 # 强制输出到文件,即便设置过:set -o noclobber | |
n>| file # 强制将文件描述符 n的输出重定向到文件 | |
<> file # 同时使用该文件作为标准输入和标准输出 | |
n<> file # 同时使用文件作为文件描述符 n 的输出和输入 | |
n> file # 重定向文件描述符 n 的输出到文件 | |
n< file # 重定向文件描述符 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 '/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 / <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 | |
# 终端下正确设置 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 | |
# vim: set ts=4 sw=4 tw=0 et : |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment