Every little helps


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签
Every little helps

shell总结

发表于 2017-04-19 | 分类于 Linux |

查看当前用户

1
whoami

显示系统的所有shell

1
2
3
4
5
6
7
8
9
10
11
12
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
切换:直接敲shell的名称

输出当前shell ID

1
echo $$

隔开同一行敲的多个命令

1
;

另起一行

1
\

变量

变量名=值

  1. 变量名不能以数字开头
  2. 等号两边不能有空格
  3. 值用双引号引起来
  4. 定义变量时不加$,引用时需要加$
  5. 在终端敲该命令,所得的变量是当前shell的变量
  6. 单引号引用的变量不会被解析
  7. 这样定义是本地变量,不会影响到子shell

变量定义

1
2
3
4
5
6
7
8
9
10
11
12
13
declare -x dd=12 / export yy=10
定义环境变量
可以影响到所有子shell
declare +x dd
将环境变量变成本地变量
declare -r dd (readonly dd)
将变量设为只读
declare -i aa #定义整型,目的是可以做数值运算,默认情况下会直接输出
let bb=1+8 同上
cc=((1+1)) 同上

输出变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo
-n 输出不换行
-e 解析 \n 等字符
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

取消变量

1
unset

显示设置变量

1
2
3
4
5
6
set 显示所有变量
set 1 2 3 4 5 设置参数
env 显示所有环境变量
export 显示所有环境变量
export -p 显示所有环境变量

方法参数取值

1
2
3
4
5
$0 文件的名字
$# 参数的个数
${12} 文件的第12个参数
$* 所有的参数
$? 记录上面的命令是否执行成功,0表示失败,非0表示成功

全局变量

1
2
3
4
5
6
$PATH
$HOME 家目录
$USER 当前登录用户
$PS1 提示符 export PS1="\[\e[36m\][\u@\h \W]\$\[\e[m\] "
$LAGN 系统当前编码
$REPLY read默认赋予的变量

查看系统所支持的所有编码

1
locale -a

读取输入值

1
2
read -p "pleace input word:" name
相当于先输出再读取变量

数组操作

1
2
3
4
5
6
xx=(aa bb cc dd) 赋值
echo ${xx[0]} 取值第一个元素
echo ${xx[*]} 取所有
echo ${xx[@]} 取所有
echo ${!xx[@]} 查看所有下标
echo ${#xx[@]} 查看元素个数

字符串中执行命令

1
$(hostname) 或者`hostname`

查看系统限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7866
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

前后截断字符串

1
2
3
4
5
6
r=${path#*kkk/bin}
删除path变量中的按 *kkk/bin 匹配的前面的字符串,然后赋值给r(第一个匹配开始处理)
r=${path##*kkk/bin}
删除path变量中的按 *kkk/bin 匹配的前面的字符串,然后赋值给r(最后一个匹配开始处理)
#删除前面的字符串,%删除后面的字符串

赋值检查

1
2
3
4
5
r=${xx-"hello"} 如果变量xx存在就将xx值赋予r否则将hello赋值给r
r=${xx:-"hello"} 在上面的基础上还要判断是否为空
r=${xx:="hello"} 在上面的基础上将字符串赋值给xx
r=${xx:?"error"} 检查xx是否为空,如果是空的话显示?后面定义的字符串警告信息
r=${xx:+"hello"} 如果xx非空将后面的字符串赋值给r

查看命令执行顺序

1
2
3
type -a ls # 查看命令执行顺序
type source 查看source是否是shell内置命令,如果是的话which查不出来

登录时读取配置文件顺序

1
2
3
/etc/profile 环境变量
/etc/inputrc 快捷键
~/.bash_profile

set排错

1
2
3
4
set -u 开启当所用到的变量没有被设置时就会报错
+u 关闭
-x 追踪每一个操作,排错时候使用
+x 关闭

文件重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1>
ls -a > a.txt 文件重定向(清空)
ls -a >> a.txt 文件重定向(追加)
xx 2> a.txt 只重定向错误的结果
xx &>> a.txt 不管正确还是错误全部都追加
xx > a.txt 2>&1 错误的结果像正确的一样导入
2>
$ cat > filename <<EOF
> nihao
> $HOME
> $PATH
> EOF
$ cat filename
nihao
/home/mjs
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/jdk8/bin:/opt/redis/redis-2.8.24/src:/home/mjs/.local/bin:/home/mjs/bin

文本替换

1
2
tr 'a-z' 'A-Z' < hosts
将hosts文件中的字母从小写转为大写并输出到屏幕

搜索文件中的内容

1
2
3
4
5
6
7
8
grep
-i 不区分大小写
--color 颜色高亮
-n 出现在第几行
-v 反向过滤,不显示选中的结果,^表示开头
-A3 过滤选中行,并向下延伸3行
-B3 过滤选中行,并向上延伸3行
-q 不显示结果

文件内容追加

1
2
3
4
tee -a xx
可追加到xx文件中
cut xx | tee xx | grep aa # tee的作用是将输出信息保存在xx文件中

切分文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1>
cut -d: -f1 /etc/passwd
-d:分隔符
-f:查看第几部分
2>
split -b 10k /etc/services xxx 将services文件以每块10k前缀为xxx进行切分
-l 100 以每100行一个文件的粒度切分
3>
awt -F: '{print $1}' xx 以:为切分附(默认是空格)将xx文件切分,然后取第一部分。0表示整行记录
'{print NR, $1, NF}' NR添加行号,NF是显示该行有几个字段
awt -F: '$3<=1 {print $1}' xx 前面 $3<=1 是条件
awk -F: 'BEGIN{OFS="\t\t"; ORS="\n\n"}{print $1 $2}' xx
OFS表示每一部分是用什么分隔符(tab键),ORS表示每行之间使用什么分隔符

排序

1
2
3
4
5
6
7
8
sort
-n 以数字的形式排序
-r 反向排序
sort -t: -k3 -n passwd 以切分出来的第三部分来排序整行
-t:分隔符
-k:第几部分
-u:排除重复(与通过管道传给 uniq 命令等效,该命令 -c 参数可以统计每个单词出现几次)

统计字符

1
2
3
4
5
6
7
8
9
10
11
12
wc 统计字符
-l 查看几行
-w 几个单词
-c 几个字符
wc ProducerCustomer.java
85 183 1720 ProducerCustomer.java
85:行数
183:单词数
1720:字符数

将Tab键转化为空格

1
col -x 和 expand

查看两个文件异同

1
diff

不能使用管道的命令使用管道

1
2
3
xargs
find ./ -name *.sh | xargs ls -l

sed文本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sed '1,2d' hosts 删除前两行
-i 直接修改文件,默认是输出到控制台
-e 同时可以做多个操作,一个操作写一个-e
-f 调用文件中的内容
sed '$d' hosts 删除最后一行
sed 's/root/ROOT/g' xx 将root转换为ROOT
sed '/adm/ixxxxxxxxxxxxxx' xx 在adm的上一行添加xxxxxxxxxxxxxx
sed '/adm/axxxxxxxxxxxxxx' xx 在adm的下一行添加xxxxxxxxxxxxxx
sed '/adm/cxxxxxxxxxxxxxx' xx 将adm行换掉xxxxxxxxxxxxxx

运行shell

1
2
3
./xx.sh 开启子shell运行
bash xx.sh 开启子shell运行
source xx.sh 当前shell下运行

比较

1
2
3
4
5
6
7
数字 字符
等于 -eq ==
不等于 -ne !=
大于 -gt >
大于等于 -ge >=
小于 -lt <
小于等于 -le <=

文件判断

1
2
3
4
[ -f /etc/passwd ] #判断文件是否存在(存在返回0)
[ -r /etc/passwd ] #判断文件是否有读权限
[ -w /etc/passwd ] #判断文件是否有写权限
[ -x /etc/passwd ] #判断文件是否有执行权限

if语句

1
2
3
4
5
6
if [ "$?" -eq 0 ]; then
echo "$1 存在"
elif []; then
else
echo "$1 不存在"
fi

case语句

1
2
3
4
5
6
7
8
9
10
11
12
13
case
case $1 in
[Tt]o*)
echo tom
;;
bob | mary )
echo xxx
;;
*)
echo zzz
;;
esac

定义函数

1
2
3
4
5
6
7
function xx (){
echo "hello"
}
xx (){
echo "hello"
}

while循环

1
2
3
4
5
6
while []
do
$xx
done
until与while相反,一开始不满足,直到满足之后就会跳出循环

for循环

1
2
3
for xx in aa,bb cc
do
done

Every little helps

Linux常用命令

发表于 2017-04-18 | 分类于 Linux |

计算器

1
2
bc
-scale=10 保留10位数

显示日历

1
2
3
cal
2016 一年的日历
12 2016 某月的日历

显示时间

1
2
date
+%Y

列出文件信息

1
2
3
4
5
6
7
8
9
10
11
12
ls 显示文件(list)
-a 显示所有文件
-l 显示文件详细信息
-h 将占用的字节人性化显示
-d 显示目录信息
-i 显示 inode ID
-s 显示大小
-1 一行行显示
--time=atime 显示访问时间
--time=ctime 显示创建时间
-R 递归显示

查看历史命令

1
2
history
!numner 执行历史命令

查看命令简短信息

1
whatis

生成whatis库

1
makewhatis

查找命令的目录及帮助文档的目录

1
2
3
whereis
-b 只显示二进制文件
-m 显示帮助文档

查找命令所在的路径及有无别名

1
which

查看配置文件简短信息

1
apropos

查看命令帮助

1
2
3
4
man
/search
n/N 查找
^search 开头

将缓存中的内容写到磁盘中去

1
sync

开关机

1
2
3
4
5
6
7
8
9
10
11
shutdown
-r now 重启
-k 显示通知信息不会真的关机
-h 10 10分钟后关机
-h 8:20 到时间自己关机
reboot 重启
-f 强制重启
poweroff 关机
-f 强制关机

运行级别

1
2
3
4
5
6
7
8
9
10
11
0 关机
1 单用户
2 不带网络的多用户
3 带网络的多用户
4 保留,用户可以自给定义
5 图形界面的多用户
6 重起系统
runlevel # 显示当前环境级别
init number # 改变当前环境的级别

图形文本界面互换

1
2
3
4
5
6
7
8
9
10
11
12
multi-user.target 第3运行级
graphical.target 第5运行级
1,设置开机模式为:命令模式
systemctl set-default multi-user.target
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
2,设置开机模式为:图形模式
systemctl set-default graphical.target
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
startx # 开启xwindow

文件类型

1
2
3
4
5
- 普通文件
d 文件夹
b 块设备(U盘)
c 字符型设备文件(鼠标)
l 快捷方式(软连接)

修改权限

1
2
3
4
chmod [{ugoa}{+-=}{rwx}][文件或目录]
[rwx=421][文件或目录]
-R 递归修改

修改文件所有者

1
2
3
4
chown -R root
chown -R root[:.]root /aa # 修改文件所有者及所属组
chgrp -R root /aa # 修改所属组

文件访问权限说明

  1. 文件夹的 x 代表是否可以进入该文件夹,如果没有 x,即使有w,其他用户也不可操作该文件将夹下的文件
  2. 文件夹的 w 代表是否可以操作文件夹中的文件,当文件夹有 w 时,即使其他用户没有读该文件夹中文件的权限,该用户也可以删除文件
  3. 文件夹没有 r 时,其他用户可以进入该文件夹但是不能读取该文件夹中的文件,但是可以创建文件,操作文件

查看文件类型

1
file filename

目录结构

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
/bin
/sbin
相当于win32的作用
/boot
主要存放启动Linux系统所必需的文件,包括内核文件、启动菜单配置文件等
/dev
设备文件,字符设备,存储设备
/etc
主要存放系统配置文件
/lib
主要存放一些库文件
/media 自动挂载
/mnt 手动挂载
在某些Linux的发行版中用来挂载那些USB接口的移动硬盘(U盘)等
/opt
可以理解为安装可选程序的地方。安装源码包
/proc
内核参数,不占用磁盘大小
/root
根用户的家目录。里面存放根目录的数据、文件等。
/usr
主要存放安装的软件、系统共用的文件、内核源码等。
/tmp
临时文件
/var
缓存,日志,数据库文件

查看系统信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
uname
-i # 架构
-r # 内核
-a # 查看所有
cat /etc/redhat-release # CentOS Linux release 7.1.1503 (Final)
hostnamectl
status 查看操作系统信息
--static 查看静态主机名
--transient 查看瞬态主机名
--pretty 查看灵活主机名
hostname # 主机名

创建目录

1
2
3
mkdir
-p 递归创建
-p small/{bug,cat,hadoop}

复制文件

1
2
3
4
5
6
7
8
cp [item] resource target
-r 复制目录
-p 保留文件属性
-u 新文件覆盖旧文件(旧文件不会覆盖新文件)
-l 生成硬链接
-f 强制
-a = -rfp
-d 默认情况下拷贝链接会把原文件拷贝出来,可以加该参数拷贝链接

创建软硬链接

1
2
ln # 硬链接不能跨分区
-s 创建软连接

移动和改名

1
2
3
4
mv
-i 询问要不要删除(默认)
-r 递归
-f 强制

别名

1
2
3
alias ll # 显示别名
alias ll='ls -lh --color=auto' # 修改别名

显示文件名目录名

1
2
basename # 只显示文件名
dirname # 只显示目录名

浏览小文件信息

1
2
cat
-n 显示行号

反向浏览文件

1
tac

不算空行显示行号

1
2
nl
-d # 算空行显示行号

浏览文件信息

1
2
3
4
more
(空格)或f 翻页
(Enter) 换行
q或Q 退出

浏览文件信息

1
2
3
4
5
6
7
8
9
less
(空格)或f 翻页
(Enter) 换行
q或Q 退出
上箭头 向上翻一行
pgup 向上翻一页
/XXX 搜索
n 下一个搜索结果
-N 显示行号

显示文件前几行

1
2
head
-5 显示前5行

显示文件后几行

1
2
3
tail
-n 显示后几行
-f 动态显示文件末尾内容(监视日志)或者 tailf

查看非文本文件

1
2
3
4
od
-t c # 以ASCII码格式显示输出
strings # 显示二进制文本文件

删除文件

1
2
3
4
5
rm
-r 删除目录
-f 强制删除
rm -rf !(keep1 | keep2) # 删除keep1,keep2文件之外的文件

显示当前目录

1
pwd

创建文件

1
touch {a,b,c,d}

权限过滤符

1
2
3
umask
文件权限 = 666 - umask
目录权限 = 777 - umask

隐藏属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lsattr # 列出文件隐藏属性
chattr # 修改文件隐藏属性
+a (文件不可写,文件夹只可创建不可删除)
+i (文件夹中,不可添加也不可删除文件)
SUID 在命令所有者的位置上出现S代表其他人在执行该命令时具有所有者的权限
chmod u+s xx
chmod 4333 xx
SGID 如果一个文件夹的的所属组中出现了S,代表着之后在该文件夹下创建的文件都将会继承该文件夹的所属组
chmod g+s xx
chmod 2333 xx
SBIT 只出现在文件夹的其他人权限位,意思是除了root和所有者外其他人即使有权限也不能删除
chmod o+t xx
chmod 1333 xx

在字符串中执行命令

1
2
echo "hostname is `hostname`"
echo "hostname is $(hostname)"

快速搜索

1
2
3
4
5
locate # 每天跟新一次数据库,新创建的文件可能找不到
-i 不区分大小写
updatedb # 更新资料库
/var/lib/mlocate/mlocate.db 数据库位置

查找文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
find path -option [argu]
-or 或关联关系
-name 根据名称查找
-size +5M 根据大小查找
-size -5M -size +3M 查找大于3M小于5M的文件
-user smallbug 根据所有者查找
-group 根据所属组查找
-ctime +1 创建超过1天的文件
-cmin +1 创建时间超过一分钟
-amin 访问时间
-newer filename 查找比当前文件比较新的文件
-perm 222 根据权限查找(2 -> o, 22 -> go)
+222 ugo只要有一个写权限就行
-222 ugo必须都有写权限

分区介绍

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
1>
MBR->[分区]->[分区]
MBR:引导程序(446) + 分区表(64) + 结束符(2)
一个分区需要16字节
2>
[分区]
[block group]
boot sector -> {
[super block->文件系统描述信息->块位图->inode位图->inode表->block],
[super block->文件系统描述信息->块位图->inode位图->inode表->block],
[super block->文件系统描述信息->块位图->inode位图->inode表->block]
}
super block : 记录inode和block信息,使用多少剩余多少
文件系统描述信息 :记录一个分区中的 block group 信息。
块位图 :记录block区域中哪些block使用了,哪些没使用。
inode位图:同上
inode表:记录文件存放在哪些block中(128/4只能指向32个block)
|--→直接区(12)
|--→间接区(1)
|--→二间接区(1)
|--→三间接区(1)

查看文件在哪些block中

1
filefrag -v cc

查看分区信息

1
2
3
dumpe2fs /dev/sda3
tune2fs -l /dev/sda5 # 显示的是上面信息的头部部分

显示文件夹大小

1
2
3
du
-s 单层显示
-h 人性化显示

显示已挂载磁盘信息

1
2
3
df
-h 人性化显示
-T 显示文件类型

分区操作

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
1>
fdisk -l 查看分区情况(有多个硬盘的话可以加硬盘名)
2>
fdisk /dev/sda 给sda分区
3>
## m查看帮助
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition //删除分区
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types //列出分区类型
m print this menu
n add a new partition //创建一个新的分区
o create a new empty DOS partition table
p print the partition table //显示分区表
q quit without saving changes //不保存退出
s create a new empty Sun disklabel
t change a partition's system id //修改分区类型
u change display/entry units
v verify the partition table
w write table to disk and exit //保存并推出
x extra functionality (experts only)
4>
partprobe [/dev/sda] //更新分区表
5>
mkfs -t ext3 /dev/sda5 格式化分区(=mkfs.ext3 /dev/sda5)
mkfs -t ext3 -b 4096 /dev/sda5 //每一个block是4k
6>
mount /dev/sda5 /mnt //挂载
umount /dev/sda5 //卸载
mount -o remount,ro /mnt //以只读的形式挂载(remount:重新挂载,先卸载再挂载)
mount -o remount,rw /mnt //读写权限
mount -o remount,noexec /mnt //无执行权限
mount -o loop xx.iso /mnt //挂载镜像
vim /etc/fstab //永久挂载
(/dev/sda5 /home/smallbug/workspace ext3 defaults 0 0)
(defaults:默认权限,0:是否要做备份 0:是否用fsck检查)

检查磁盘

1
fsck -f(强制检查) -C(显示进度)/dev/sda4

检查坏道

1
badblock -sv(进度)/dev/sda4

查看哪个进程占用该磁盘

1
fuser -mv /mnt

查看交换分区

1
cat /proc/swaps

将Linux文件格式转换为windows格式

1
unix2dos -n 123 345

压缩备份

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
1>
gzip # 压缩文件为 *.gz
-d # 解压
gzip -c hosts > hosts.gz # 压缩时保留源文件
2>
zcat # 查看gzip压缩过的文件
3>
gunzip(gzip -d) # 解压缩文件
4>
zip -r 压缩目录
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
5>
bzip2 压缩文件
-k 产生压缩文件后保留原文件
-d 解压
bzip2 -c hosts > hosts.bz2 缩时保留源文件
bzcat 查看bzip2压缩过的文件
bunzip2 解压缩文件
6>
tar 打包文件
-c 打包(-x 解包)
-v 显示详细信息
-f 指定文件名
-z 打包同时压缩(解压缩)(gzip)
-j 打包同时压缩(解压缩)(bzip2)
-t 不解档的情况下,查看文件内容
-C 目录 指定解档目录
tar zcvf mkd.tar.gz ./mkd/
7>
创建ISO镜像
mkisofs -o xx.iso file1 file2 file3
cp /dev/cdrom xxx.iso
直接将光盘中的文件复制成iso镜像
8>
dd if=/dev/sda5 of=test 将sda5分区中的数据备份到test中
dd if=/dev/zero of=file bs=1M count=100 ## 创建100M文件file

vim程序编辑器

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
vi filename(进入)--->命令模式
:wq(退出)------>命令模式
|
|ESC
|
iao------------>插入模式
a 在光标所在字符后插入
A 在光标所在行尾插入
i 在光标所在字符前插入
I 在光标所在行行首插入
o 在光标下插入新行
O 在光标上插入新行
:set nu 设置行号
:set nonu 取消行号
gg 到第一行
G 到最后一行
nG 到第n行
:n 到第n行
$ 移至行尾
0 移至行首
x 删除光标所在处字符
nx 删除光标所在处后n个字符
dd 删除光标所在行
ndd 删除n行
dG 删除光标所在行到文件末尾内容
D 删除光标所在处到文件末尾内容
:n1,n2d 删除指定范围的行
yy 复制当前行
nyy 复制当前行以下n行
dd 剪切当前行
ndd 剪切当前行以下n行
p、P 粘贴在当前光标所在行下或行上
r 取代光标所在处字符
R 从光标所在处开始替换字符,按ESC结束
u 取消上一步操作
/string 搜索指定字符串
搜索时忽略大小写:set ic
n 搜索指定字符串的下一个出现的位置
:%s/old/new/g(不询问)c(询问) 全文替换指定的字符串
:n1,n2s/old/new/g 在一定范围内替换指定字符串
:W 保存修改
:W new_filename 另存为指定文件
:wq 保存修改并退出
ZZ 快捷键,保存修改并退出
:q! 不保存修改退出
:wq! 保存修改并退出(文件所有者及root可以使用)
:r 文件名 将文件中的所有内容导入到该文件中
: !命令 执行命令
:map Ctrl+v Ctrl+() 增加快捷键
:n1,n2s/^/#/g 注释多行
:ab 打出a换成b
:sp 分屏
ctrl+w 切换
:only 取消分屏
/home/username/.vimrc 普通用户设置vim快捷键
/root/.vimrc root用户设置vim快捷键
vim插件:
1>https://github.com/ma6174/vim
编写python程序
自动插入头信息:
#!/usr/bin/env python
# coding=utf-8
输入.或按TAB键会触发代码补全功能
:w保存代码之后会自动检查代码错误与规范
按F6可以按pep8格式对代码格式优化
按F5可以一键执行代码
多窗口操作
使用:sp + 文件名可以水平分割窗口
使用:vs + 文件名可以垂直分割窗口
使用Ctrl + w可以快速在窗口间切换
编写markdown文件
编写markdown文件(*.md)的时候,在normal模式下按 md 即可在当前目录下生成相应的html文件
生成之后还是在normal模式按fi可以使用firefox打开相应的html文件预览
当然也可以使用万能的F5键来一键转换并打开预览
如果打开过程中屏幕出现一些混乱信息,可以按Ctrl + l来恢复
快速注释
按\ 可以根据文件类型自动注释
2>https://github.com/amix/vimrc

用户信息查看

1
2
3
4
5
/etc/passwd # 用户信息存放目录
/etc/shadow # 用户密码存放目录
/etc/group # 组的存放目录

UID & passwd

1
2
3
4
5
6
7
8
1>
uid标志一个用户
每一个UID对应一个用户,root的UID是0,1~499是系统用户UID,500~65535是普通用户
2>
passwd 每一行是6个冒号分成7部分
repository:x:1000:1000:repository:/home/repository:/bin/bash
用户名:密码占位符:UID:GID:注释信息:家目录:shell信息

用户用户组管理

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
groupadd bob # 添加一个组
groupdel bob # 删除一个组
gpasswd -a smallbug root # 将smallbug添加到root组中
-d 删除
groups smallbug 查看smallbug用户的所属组
newgrp root //临时切换默认组(exit可恢复到原状态)
useradd 添加用户
-D 查看创建用户时的默认值
-c "注释"
-s 制指定shell
-d 家目录
-g 组(不创建组,只分配到默认组)
-G root 除了创建本组外还会将用户添加到root组中
-u UID
vim /etc/default/useradd 修改默认值
/sbin/nologin 只能登陆服务不能登陆主机
usermod -c "修改用户信息" repository
userdel -r 删除用户
usermod 可用来修改用户帐号的各项设定。
 -c<备注>  修改用户帐号的备注文字。
 -d登入目录>  修改用户登入时的目录。
 -e<有效期限>  修改帐号的有效期限。
 -f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。
 -g<群组>  修改用户所属的群组。
 -G<群组>  修改用户所属的附加群组。
 -l<帐号名称>  修改用户帐号名称。
 -L  锁定用户密码,使密码无效。
 -s<shell>  修改用户登入后所使用的shell。
 -u<uid>  修改用户ID。
 -U  解除密码锁定。
查看系统中有哪些用户:cut -d : -f 1 /etc/passwd
查看可以登录系统的用户:cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1
查看用户登录历史记录:last

密码操作

1
2
3
4
5
6
7
8
9
10
11
password smallbug 修改smallbug的密码
sudo passwd -S smallbug 查看smallbug密码的加密方式
passwd -S repositpry //查看密码信息
passwd -d repository //清空密码
-l //锁定账号信息(=usermod -L smallbug)
-u //解锁(=usermod -U smallbug)
echo $xx | passwd --stdin tom 脚本方式修改密码

查看用户UID,GID,GROUPS

1
2
3
$> id tom
uid=1001(tom) gid=1001(tom) groups=1001(tom)

当前有哪些用户登录

1
who

查看是否开启信息功能

1
2
3
4
mesg # 即使关闭,root发送的信息也可看到
write tom pts/3 写信息
你好

查看当前在线用户

1
w

查看后台进程

1
jobs

运行后台进程

1
bg 1

将进程重新调到前台

1
fg 1

杀死后台进程号为1的进程

1
2
3
4
5
kill -9 %1
kill -l 查看所有信号
killall -9 java 直接杀死进程

关闭远程客户端程序依然在运行

1
nohup ping www.baidu.com &

ps命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ps -l 当前shell运行的程序
ps -aux 显示所有进程,所有者,详细信息
ps -ex -o comm,%cpu 查看进程名及对应的CPU使用情况
%mem 内存使用率
pid 显示pid
stat 显示进程状态
R 正在运行
Z 僵尸状态
T 停止状态
S 睡眠状态
ps -ex -o comm,%cpu,%mem,pid,stat

查看某一个PID是多少

1
pidof bash

进程查看优先级改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
top 动态显示资源使用状态
top -d 1 一秒钟刷新一次状态
优先级=优先系数+nice值(-20~19)(最高~最低)
1> 在top中r修改nice值,改变进程优先级
2> PID to renice [default pid = 25593]
3> Renice PID 23369 to value -12
renice -20 2061 修改PID为2061的进程将其nice值改成-20
nice -n -19 cat 以nice值为-19来运行cat命令

显示内存及交换分区的使用情况

1
free -h # 人性化显示

时间查看

1
uptime # 当前时间,系统运行时间,连接用户,系统负荷

系统资源状态

1
vmstat 1 3 1s执行一次,执行3次

查看有哪些端口处于监听状态

1
netstat -ntul # n:做反向解析

显示进程树

1
pstree -u

查看系统中的服务

1
ls -al /usr/lib/systemd/system

编译安装

1
2
3
4
5
6
yum install gcc-c++ libstdc++-devel
安装未指定目录默认路径是 /usr/local
./configure --prefix=/opt/XXX 指明安装目录
生成makeFile文件之后 make & make install

rpm & yum

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
1>
rpm:
-ivh i安装 v显示过程 h调用数字签名(--force强制安装)
-qa 查看当前系统所安装的所有软件包
-ql 查看软件安装目录
-qc 查看软件安装配置文件
-qd 查看帮助文档
-qi 查看详细信息
-qf 查看该软件由哪个软件包安装的
-K 验证rpm包是否是官方原版(rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7)
-qlp 查看rpm包的安装目录
-e 卸载软件 (--nodeps 忽略软件包的依赖关系)
-Uvh 更新软件
--test 安装测试,并不实际安装
--replacepkge 无论软件包是否已被安装,都强行安装软件包
2>
yum [options] [command] [package ...]
-h 帮助
-y 当安装过程提示选择全部为"yes"
-q 不显示安装的过程
yum install yum-fastestmirror 自动搜索最快镜像插件
yum install yumex 安装yum图形窗口插件
yum grouplist 查看可能批量安装的列表
1 安装
yum install 全部安装
yum install package1 安装指定的安装包package1
yum groupinsall group1 安装程序组group1
2 更新和升级
yum update 全部更新
yum update package1 更新指定程序包package1
yum check-update 检查可更新的程序
yum upgrade package1 升级指定程序包package1
yum groupupdate group1 升级程序组group1
3 查找和显示
yum info package1 显示安装包信息package1
yum list 显示所有已经安装和可以安装的程序包
yum list package1\* 显示指定程序包安装情况package1,\*代表后面字符不受限制
yum search package 查看远程和本地可用的包
yum groupinfo group1 显示程序组group1信息yum search string 根据关键字string查找安装包
4 删除程序
yum remove package1 删除程序包package1
-y 不会询问,直接卸载
yum groupremove group1 删除程序组group1
yum deplist package1 查看程序package1依赖情况
5 清除缓存
yum clean packages 清除缓存目录下的软件包
yum clean headers 清除缓存目录下的 headers
yum clean oldheaders 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) 清除缓存目录下的软件包及旧的headers

Every little helps

MySQL Explain 详解

发表于 2016-12-22 | 分类于 MySQL |

id 列

  从ID列可以判断SQL的执行顺序:从大到小,如果ID相同,就从上到下执行。如果行引用联合结果的其他行,那么它的值可能为NULL,这种情况下,table列的值会显示为<unionM,N>来指明行引用的是联合行中的带有指定M,N值的ID。


select_type 列

  • SIMPLE
    简单的 SELECT 语句(没有使用 union 或者 子查询)

  • PRIMARY
    最外层的 SELECT 语句

  • UNION
    在一个 UNION 语句中第二或之后的SELECT语句

  • DEPENENT_UNION
    在一个 UNION 语句中第二或之后的 SELECT 语句,取决于外层的查询

  • UNION_RESULT
    UNION 的结果集

  • SUBQUERY
    子查询中的第一个 SELECT

  • DEPENENT_SUBQUERY
    子查询中的第一个 SELECT ,取决于外层的查询

  • DERIVED
    SELECT 的驱动表( FROM 子查询)

  • MATERIALIZED
    物化子查询

  • UNCACHEABLE SUBQUERY
    不能将结果缓存的子查询,必须重新计算外部查询的每一行

  • UNCACHEABLE UNION
    在一个 UNION 中第二或之后的 SELECT 查询属于UNCACHEABLE SUBQUERY(请看 UNCACHEABLE SUBQUERY )

  • 特别声明
    DEPENDENT:典型代表就是使用了相关子查询。(相关子查询:子查询里包含了一个同时在子查询里,又在外部查询的表的查询)
    DEPENDENT SUBQUERY: 它不同于 UNCACHEABLE SUBQUERY 的求值。对于 DEPENDENT SUBQUERY ,子查询对于外部上下文里每一个集合中不同的变量值仅仅重新计算一次。而对于 UNCACHEABLE SUBQUERY,子查询对于外部上下文里的每一行都会重新计算一次。


table 列

SQL中使用到的表。它的值也可为下面的其中之一:

  • <unionM,N>: 行引用了带有值为 M,N 的查询ID的联合行
  • <derivedN>: 行引用了值为 N 的ID的驱动表结果。例如,它是从 FROM 子查询中的结果形成的驱动表的结果集

  例:EXPLAIN SELECT * FROM (SELECT * FROM vip_system_user) b WHERE b.id>57

    

  • <subqueryN>: 行引用了一个值为 N 的ID的 materialized subquery(物化子查询)的结果。

partitions 列

查询中所匹配的记录所在的分区。这列只有在使用了 PARTITIONS 关键字时才会显示。对于没有使用分区表的,该值为NULL


type 列


连接类型

  • system
    表只有一行(=system table)。这个是 const 连接类型的一个特例。

  • const
    该表最多只有一条匹配的行,这是读取查询的开始。因为这里只有一行,该行这列的值可以被优化器的剩余部分认为是常量。const表是非常快的,因为它们只会读取一次。
    const 用于当你与主键 或者唯一索引的所有部分比较的是常量值时。在以下的查询中,tal_name 可以被用作const表:

  select * from tbl_name where primary_key = 1;
  select * from tbl_name where primary_key_part1 = 1 and primary_key_part2 = 2

  • eq_ref
    从该表中读取一行与前一张表的所有行的每一种组合。除了 system 和 const 类型,这可能是最好的连接类型了。它通常于用在连接时使用了索引的所有部分,并且索引是一个主键索引或者唯一非空索引。

  例:EXPLAIN SELECT u.user_name FROM vip_system_user_role ur LEFT OUTER JOIN vip_system_user u ON ur.sys_user_id=u.id

    

  • ref
    所有索引匹配的行的值与前一张表的所有行的每一种组合。ref用于连接仅使用最左前缀索引或者索引不是主键索引,唯一索引(换句话说,连接不能基于该索引值选择一行 )。如果索引用于匹配少数行,这是一个好的连接类型。ref 能够用于使用 = 或者 <=> 操作符的索引列中。

  例:EXPLAIN SELECT * FROM vip_system_permission p1 LEFT OUTER JOIN vip_system_permission p2 ON p1.id=p2.parent_id

    

  • fulltext
    这个连接使用fulltext索引执行

  • ref_or_null
    这个连接类型是类似ref,但有些额外的不同:MySQL要做一些额外操作去搜索包含NULL值的行。这个连接类型通常用于优化执行子查询

  • index_merge
    这个连接类型说明使用了索引合并优化。在这种情况下,在输出行的 key 列包含了一个使用索引的列表,并且 key_len 包含了使用了索引最长的那部分列表。

  • unique_subquery
    当子查询中查询的字段是主键或者唯一性索引时,用来在 IN 子查询中替代 ref 类型。

  例:EXPLAIN SELECT * FROM vip_system_permission p1 WHERE p1.parent_id IN (SELECT id FROM vip_system_permission)

  • index_subquery
    当子查询中查询的字段是非唯一性索引时,用来在 IN 子查询中替代 ref 类型。

  例:EXPLAIN SELECT * FROM vip_system_permission p1 WHERE p1.parent_id IN (SELECT DISTINCT parent_id FROM vip_system_permission)

  • range
    仅在给定的范围使用索引检索行。在输出的行中的 key 列说明使用了哪个索引。key_len 列包含了使用了索引的最长部分。对于这种类型下,ref列的值为NULL。
    range 可以用于当索引列使用以下任一个操作符与常量比较时使用:=, <>, >, >=, <, <=, IS NULL, <=>,BETWEEN 或者 IN()

  • index
    index 索引连接类型与 all 相同,除了它是扫描索引树外(即全索引扫描)。这在两种情况下发生:

  1. 如果索引对于查询来说是覆盖索引并且可用于满足要求表的数据要求,这时只有索引树会被扫描。在这种情况下,Extra 列会显示为 Using index。一个只读索引扫描通常比 ALL 更快,因为索引的大小通常是比表的大小更小。
  2. 全表扫描的执行是从索引读取的顺序去查找数据行。这时 Extra 列不会出现 Uses index。

  MySQL 当查询仅使用单独索引的一部分列时才会使用这个连接类型。

  • ALL
    从前表中每一个行组合进行全表扫描。如果表是第一个表并没有标识为 const 的话,这通常是不好的,并且在其他的情况下是非常糟糕的。所以,你可以通过添加索引来避免ALL连接类型,这使得行检索基于常量值或者从更早的表中的列值。

possible_keys 列

  该列指出MySQL可以从该表中使用哪个索引去查找行。注意,该列完全独立于 explain 输出结果显示的表的顺序的。这意味着,一些在possible_keys里的键,在实际上可能无法在产生表的顺序时使用。
  如果没有相关的索引,该列就为 NULL。在这种情况下,你可以通过测试 WHERE 子句检查它使用的列有没有适当的索引来提高查询的性能。如果的确如此的话,创建一个合适的索引并使用Explain来再次检查你的查询有没有用上了索引。
  查看表有哪些索引,可以使用show index from tbl_name


key 列

  该列指出MySQL实际决定使用的key(索引)。如果MySQL决定使用 possible_keys 中之一的索引去查找行,那么那个索引的值就是该key列的值
  不过,有可能key列的索引名没有出现在 possible_keys 列中。这可能发生在,如果 possible_keys 索引中没有一个是适合查找行的索引,但查询所选择的列都是其他索引中包含的列的情况。这意味着,命名的索引覆盖了所选择的列,所以尽管它不用于决定哪些行要检索,但一个索引扫描比数据行扫描更高效。
  对于InnoDB,二级索引可能覆盖了所选择的列,尽管查询也选择了主键,因为InnoDB保存每一个二级索引里保存了主键的值。如果key列为NULL,MySQL会发现没有索引可用于执行更高效的查询。
  强制MySQL去使用或者忽略在possible_keys列的某个索引,可以在查询中使用FORCE INDEX, USE INDEX 或者 IGNORE INDEX。
  对于MyISAM和NDB表,执行ANALYZE TABLE可以帮助优化器选择更好的索引。对于NDB表,这也会提高分布式下推连接的性能。对于MyISAM表,myisamchk –analyze 与 analyze table的作用相同。


key_len 列

  该列指出MySQL决定使用的索引(key)的长度。如果key列为NULL,那么该列也为NULL。注意,key_len的值能够让你确定MySQL实际上使用了一个组合索引中的多少部分。


ref 列

  该列显示了哪些列或常量是用于与在key列的命名的索引列来进行比较来从表中选择行的。
  如果值为func,该值就会用于一些函数的结果集。为了查找出哪些函数,执行SHOW WARNINGS之后,使用EXPLAIN EXTENDED来查看。函数可能实际上是一个操作符,像算术操作那样。


rows 列

  该列指出MySQL认为它必须检验执行查询的行数。
  对于InnoDB表,这个数值是个估计值,并不总是准确的。


filtered 列

  该列指出,表行中的百分比将会被表的条件过滤。即,rows列显示了测试的行数,而(rows * filtered / 100) 显示了将与之前的表进行连接的行数。该列将会在你使用 explain extended 时显示出来。


extra 列 及常见的值

该列包含了额外的关于MySQL执行查询的信息。

  • const row not found
    对于像select ... from tbl_name这样的查询,该表是空的。

  • Deleting all rows
    对于DELETE,一些存储引擎(例如MyISAM)支持的一个处理方法简单并且快速地删除所有表行。如果引擎使用了这个优化,则Extra表的值就会显示为这个。

  • Distinct
    MySQL 查找不重复的值,所以,它会停止搜索当前行之后已经第一次匹配的行。

  • FirstMatch(tbl_name)
    它是用于表tbl_name的 semi-join FirstMatch策略的缩写

  • Full scan on NULL key
    这出现在当优化器不能使用索引来优化子查询时的一个备用策略。

  • Impossible HAVING
    HAVING子句总是为false并且不能检索到任何行。

  • Impossible WHERE
    WHERE子句总是为false并且不能检索到任何行。

  • Impossible WHERE noticed after reading const tables
    MySQL 已经读取了所有const(和system)表,并且注意到WHERE子句总是为false.

  • LooseScan(m…n)
    semi-join LooseScan策略被使用。m和n是索引部分的数字。

  • Materialize, Scan
    在MySQL 5.6.7 之前,这表明使用了一个独立的物化临时表。如果Scan出现,表示临时表索引没有用于读取表。否则,表示使用了索引来查找。同样也看Start materialize
    在 MySQL 5.6.7 中,物化说明行的select_type列值为MATERIALIZED,并且行的table表是一个值为

  • No matching min/max row
    对于类似select min(…) from … where condition这样的查询没有满足条件的行。

  • no matching row in const table
    对于一个连接查询,有一个空表或者一个没有满足唯一索引条件的行的表。

  • No matching rows after partition pruning
    对于DELETE或者UPDATE,优化器发现进行分区调整时发现没有数据可以删除或者更新。这类似于select语句的Impossible WHERE

  • No tables used
      查询没有from子句,或者有一个from dual子句。
      对于INSERT或者REPLACE语句,当没有select部分时explain就会显示这个值。例如, 它会出现在explain insert into t values(10),因为它等效于explain insert into t select 10 from dual.

  • Not exists
      MySQL能够在进行left join查询优化,在它发现匹配LEFT JOIN 标准一行数之后不会对于之前的行组合中在该表上检查更多的行。这有一个使用该优化的查询例子: select * from t1 left join t2 on t1.id = t2.id where t2.id is null
      假设t2.id是定义为NOT NULL的。在这种情况下,MySQL扫描t1并使用t1.id的值查找t2的行。如果MySQL发现在t2中有匹配的行,它知道t2.id能够永不为NULL,并且不会扫描t2中具有相同id值的剩余的行。换句话说,对于每一个t1的行,MySQL只需要在t2中进行一次查找,而不管在t2中实际有多少匹配的行。

  • Using filesort
      MySQL 必须做一些额外的工作去决定如何检索的行进行排序。排序是通过根据连接类型所筛选的所有行然后保存要排序的键和这些所有经过WHERE子句筛选的所有行的指针来完成的。
      这些排序键将被保存然后按排序的顺序来检索行数据。

  • Using where
      使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

  • Using index
    从表中检索的列信息只需从索引信息中获取,而不用经过额外的访问实际的表数据来寻找。这个策略

joash

joash

3 日志
2 分类
2 标签
RSS
GitHub zhihu
© 2017 joash
由 Hexo 强力驱动
主题 - NexT.Mist