get started
References:
常用快捷键(默认使用 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} |
切换特定后台进程到前台 |
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[*]}") |
用斜杠链接数组并赋值给变量 |
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)) |
复杂计算 |
事件指示符
命令 |
功能 |
!! |
上一条命令 |
!^ |
上一条命令的第一个单词 |
!: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
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 -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 |
去重排序 |
命令 |
功能 |
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 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