[TOC]
### 1.在语句中执行Linux命令
* 两种方法
~~~
echo the date is `date`
echo the date is $(date)
~~~
### 2.shell判断
~~~
$* 所有参数
$# 参数个数
$$ 进程的ID
$? 进程的返回状态
~~~
### 3.从文件中读取一行记录(重定向)
`read line < /etc/fstab`
![](https://box.kancloud.cn/2b22d6ab6839f1bafeb2f0ac0034c50f_563x67.png)
### 4. 包含文件
~~~
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
#使用 . 号来引用test1.sh 文件,可以使用其中的数据
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "dd:$url"
~~~
~~~
#!/bin/bash
. data-file # 加载一个数据文件.
# 与"source data-file"效果相同, 但是更具可移植性.
# 文件"data-file"必须存在于当前工作目录,
#+ 因为这个文件是使用'basename'来引用的.
# 现在, 引用这个文件中的一些数据.
echo "variable1 (from data-file) = $variable1"
echo "variable3 (from data-file) = $variable3"
let "sum = $variable2 + $variable4"
echo "Sum of variable2 + variable4 (from data-file) = $sum"
echo "message1 (from data-file) is $message1"
# 注意: 将双引号转义
print_message "This is the message-print function in the data-file." "cansghu2"
exit 0
~
点命令在shell中,加载文件,可以使用其中的变量和函数
~~~
### 5.printf 命令
~~~
printf format-string [arguments...]
# 参数说明:
# format-string: 为格式控制字符串
# arguments: 为参数列表。
~~~
~~~
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
~~~
~~~
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
~~~
> * %s %c %d %f都是格式替代符
> * %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
> * %-4.2f 指格式化为小数,其中.2指保留2位小数。
* 转义字符
~~~
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
~~~
## 2. 字符串处理
### 6. awk
> 1. awk是行处理器:
相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
> 2. awk处理过程:
依次对每一行进行处理,然后输出
#### 6.1 基本格式
~~~
awk 【option】【file】
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
echo file | awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’
~~~
参数说明:
~~~
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量(每行被切分后的列数量,可用于获取最后一个列值: awk '{print $NF}')
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
~~~
* 将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
~~~
awk -F: '{print $1; print $2}' /etc/passwd
~~~
* 输出字段1,3,6,以制表符作为分隔符
~~~
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
~~~
#### 6.2 匹配代码块
`!//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2 `
~~~
awk '/mysql/' /etc/passwd
awk '/mysql/{print }' /etc/passwd
awk '/mysql/{print $0}' /etc/passwd //三条指令结果一样
awk '!/mysql/{print $0}' /etc/passwd //输出不匹配mysql的行
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/,/mysql/{print}' /etc/passwd //区间匹配
awk '/[2][7][7]*/{print $0}' /etc/passwd //匹配包含27为数字开头的行,如27,277,2777...
awk -F: '$1~/mail/{print $1}' /etc/passwd //$1匹配指定内容才显示
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //与上面相同
awk -F: '$1!~/mail/{print $1}' /etc/passwd //不匹配
awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd
~~~
* 计算文件大小
~~~
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}'
# !/^d/ 不统计目录
~~~
#### 6.3 if语句
必须用在{}中,且比较内容用()扩起来
~~~
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //简写,建议这样写
awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd //全写
awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd //if...else...
~~~
#### 6.4 条件表达式
== != > >=
~~~
awk -F":" '$1=="mysql"{print $3}' /etc/passwd
awk -F":" '{if($1=="mysql") print $3}' /etc/passwd //与上面相同
awk -F":" '$1!="mysql"{print $3}' /etc/passwd //不等于
awk -F":" '$3>1000{print $3}' /etc/passwd //大于
awk -F":" '$3>=100{print $3}' /etc/passwd //大于等于
awk -F":" '$3<1{print $3}' /etc/passwd //小于
awk -F":" '$3<=1{print $3}' /etc/passwd //小于等于
~~~
#### 6.5 逻辑运算符
&& ||
~~~
awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd //逻辑与,$1匹配mail,并且$3>8
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd //逻辑或
awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd
~~~
* 例子:获取IP地址
`ifconfig eth0| grep 'inet '| awk -F: '{print $2;}'|sed s/Bcast//g`
#### 6.6 数值运算
~~~
awk -F: '$3 > 100' /etc/passwd
awk -F: '$3 > 100 || $3 < 5' /etc/passwd
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/mysql|mail/{print $3+10}' /etc/passwd //第三个字段加10打印
awk -F: '/mysql/{print $3-$4}' /etc/passwd //减法
awk -F: '/mysql/{print $3*$4}' /etc/passwd //求乘积
awk '/MemFree/{print $2/1024}' /proc/meminfo //除法
awk '/MemFree/{print int($2/1024)}' /proc/meminfo //取整
~~~
#### 6.7 输出分隔符OFS
~~~
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段
~~~
#### 6.8 输出处理结果到文件
~~~
①在命令代码块中直接输出 route -n|awk 'NR!=1{print > "./fs"}'
②使用重定向进行输出 route -n|awk 'NR!=1{print}' > ./fs
~~~
#### 6.9 格式化输出
~~~
netstat -anp|awk '{printf("%-8s %-8s %-10s\n",$1,$2,$3)}'
~~~
` %[flags][width][.precision]conversion `
~~~
%是必须的, 任何格式符都由百分号开始
flags 是可选的,详见下表
width 是可选的, 表示输出的宽度
precision 可选的, precision 依赖于 conversion, 详见下表.
conversion 是必须的, 表示如何格式化参数, 详见下表
~~~
* flag:
~~~
awk 支持如下标志(flag)
标志 描述 举例
- 左对齐 |3333.33 |
空格 在正数之前添加空格 | 3333.33|,|-3333.33|
+ 打印正负数符号 |+3333.33|,|-3333.33|
0 数字前面补0 |003333.33|
#(对于%o) 添加前缀0 |0515|
#(对于%x) 添加前缀0x |0x1bc|
#(对于%X) 添加前缀0X |0X1bc|
#(对于%e) 添加小数点 |1.000000e+01|
#(对于%E) 添加小数点 |1.000000E+01|
#(对于%f) 添加小数点 | 10.000000|
#(对于%g) 不删除尾部0 |10.4000|
#(对于%G) 不删除尾部0 |10.4000|
~~~
* awk 精度(precision)的意义。
~~~
转换符 精度意义
%d,%i,%o,%u,%x,%X 最少数字位数,如果数字位数少于精度,添加前缀0
%e, %E 最少数字位数,如果数字位数少于精度,添加后缀0
%f 小数的位数
%g, %G 最多数字位数
%s 字符位数
~~~
> printf表示格式输出
> %格式化输出分隔符
> -8长度为8个字符
> s表示字符串类型
> 打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),
> 第三个字段输出字符串类型(长度为10)
~~~
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s \n",NR,$1,$2,$3}'
~~~
#### 6.10 while语句
~~~
awk -F: 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' /etc/passwd
~~~
> 变量i被初始化为1 ;当i小于或等于记录的字段数(NF)时,先执行print语句,然后将i加1。接下来又重新测试表达式,直至i大于NF的值。变量i要在awk开始处理下一条记录时begin被重置。
> 7 root 1
> 7 x 2
> 7 0 3
> 7 0 4
> 7 root 5
> 7 /root 6
#### 6.11 for 循环
~~~
awk '{for(i=1;i<=NF;i++) print NF,$i}' /etc/passwd
~~~
对文件的每一个行都执行 for
#### 6.12 数组
~~~
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"\t",a[i]}'
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s \n", i,"\t",a[i]}'
~~~
> 9523 1
> 9929 1
> LISTEN 6
> 7903 1
> 3038/cupsd 1
> 7913 1
> 10837 1
> 9833 1
~~~
应用1
awk -F: '{print NF}' helloworld.sh //输出文件每行有多少字段
awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh //输出前5个字段
awk -F: '{print $1,$2,$3,$4,$5}' OFS='\t' helloworld.sh //输出前5个字段并使用制表符分隔输出
awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='\t' helloworld.sh //制表符分隔输出前5个字段,并打印行号
应用2
awk -F'[:#]' '{print NF}' helloworld.sh //指定多个分隔符: #,输出每行多少字段
awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='\t' helloworld.sh //制表符分隔输出多字段
应用3
awk -F'[:#/]' '{print NF}' helloworld.sh //指定三个分隔符,并输出每行字段数
awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' helloworld.sh //制表符分隔输出多字段
应用4
计算/home目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}' //int是取整的意思
应用5
统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
应用6
统计/home目录下不同用户的普通文件的总数是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}'
mysql 199
root 374
统计/home目录下不同用户的普通文件的大小总size是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/1024/1024,"MB"}'
~~~
> * -F: 指定列分割符,默认是tab
![](https://box.kancloud.cn/4aeb8b166a5a6b35b5a87cbd2e09a869_1164x111.png)
* 范例
~~~
ps -ef|grep "$PROC"|grep -v grep|awk '{if($1=="'$USER'"){print $2}}'|wc -l
~~~
* 获取非系统用户(/etc/passwd 第三列大于500的用户)
~~~
awk -F":" '{if ($3>500)print $1}' /etc/passwd
~~~
* 查看无密码的非系统用户
~~~
cat /etc/passwd | awk -F: '{if($2!=""&&$3>500) print $1}'
~~~
### 7. grep
行提取命令
![](https://box.kancloud.cn/a06c1b2f7e31ba2a13ad96d5f0a3042d_1628x160.png)
~~~
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]
OPTIONS:
-e: 使用正则搜索
-i: 不区分大小写
-v: 查找不包含指定内容的行
-w: 按单词搜索,精准匹配
-q:不打印任何输出,在只关心结果的场景下,很有用
-c: 统计匹配到的次数
-n: 显示行号
-r: 逐层遍历目录查找
-A: 显示匹配行及前面多少行, 如: -A3, 则表示显示匹配行及前3行
-B: 显示匹配行及后面多少行, 如: -B3, 则表示显示匹配行及后3行
-C: 显示匹配行前后多少行, 如: -C3, 则表示显示批量行前后3行
--color: 匹配到的内容高亮显示
--include: 指定匹配的文件类型
--exclude: 过滤不需要匹配的文件类型
~~~
#### 7.1 -w 精准匹配
![](https://box.kancloud.cn/681be9150ea62c467c3978cd12f2753f_338x166.png)
#### 7.2 -E 扩展正则
~~~
grep <re> <file> # 基础正则匹配,需要转义
egrep <re> <file> # 扩展正则匹配,不需要转义,等价于grep -E <re> <file>
grep -E <re> <file> # 扩展正则匹配,不需要转义
~~~
.{}[]等符号在basic正则当中,必须加转义,在扩展正则当中不用,如下图
![](https://box.kancloud.cn/0113535b51bb9b560e6e4d842c6791f5_1327x796.png)
#### 7.3 -q 不打印输出
~~~
grep -q用于if逻辑判断
突然发现grep -q 用于if 逻辑判断很好用。
-q 参数,本意是 Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected. 中文意思为,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
小应用
# cat a.txt
nihao
nihaooo
hello
# if grep -q hello a.txt ; then echo yes;else echo no; fi
yes
# if grep -q word a.txt; then echo yes; else echo no; fi
no
~~~
不打印任何输出,返回执行结果(正确0,错误大于等于1)
![](https://box.kancloud.cn/b5e32c001ecd112ce08538e006e9c871_869x107.png)
### 8. find
#### 8.1 规范
![](https://box.kancloud.cn/1986653a6bfd043951550c26a7605dc2_1756x832.png)
* 找到某一时间的文件,并执行命令,{}\为固定模式
![](https://box.kancloud.cn/df80068dc307f6e6c63d550e4d735dbc_774x252.png)
![](https://box.kancloud.cn/1eadcc3194259ccd943183eae6c6b007_1711x611.png)
![](https://box.kancloud.cn/3169a121f5632934523e78837443253d_1666x322.png)
* 按照权限找
![](https://box.kancloud.cn/5b83ed51ccd4d1139bd148c415edc0d6_1715x742.png)
* 根据所有者去找
![](https://box.kancloud.cn/951fd415bd3d4868289f272f12df671c_1637x436.png)
* 查找被删除的用户创建的文件,文件所有者为nouser
![](https://box.kancloud.cn/b72e801d5b188aa5609d09c0c29a894e_1621x289.png)
#### 8.2 例子
* 按照类型,名字,并且目录迭代层数为1,值找以及目录
~~~
find -type d -mindepth 1 -maxdepth 1 -name 2017* 2> /dev/null |xargs basename
~~~
![](https://box.kancloud.cn/7a0c14ef9adfaf5d24c0934cbc973ff0_1221x119.png)
### 9. sed
> * sed流式编辑工具,用于行处理
* 常用格式
~~~
sed [option] /pattern/action # action打印、替换等
~~~
option选项
~~~
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
~~~
替换标记
~~~
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
~~~
例子:
~~~
sed /pattern/p #
/pattern/s/pattern/new/g # 全局替换(先找到匹配的行)
s/pattern/new/g # 全局替换
sed -n '1,20s/My$/You/gp' datafile
#取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上。
sed -i /pattern/s/pattern/new/g # 把修改写入文件
~~~
例子:修改字符串
> s/haproxy.pid// :把haproxy.pid替换为空,精准匹配,不是/xxx/s/haproxy.pid// 先找到一行
~~~
tuna@docker02:~$ cat /usr/local/haproxy/haproxy.cfg |awk '{if($1=="pidfile"){print $2}}'
/var/run/haproxy/haproxy.pid
tuna@docker02:~$ cat /usr/local/haproxy/haproxy.cfg |awk '{if($1=="pidfile"){print $2}}'|sed 's/haproxy.pid//'
/var/run/haproxy/
~~~
1. 获得IP地址
~~~
ifconfig eth0 | grep 'inet '| sed -r 's/(^.*inet addr:)//g' | sed 's/Bcast.*//g'
~~~
> * `ifconfig eth0 | grep 'inet '`确定到地址
![](https://box.kancloud.cn/daaefd33a75ac242a5d1a68dfcc11f3c_1217x130.png)
> ` sed -r 's/(^.*inet addr:)//g'`去掉地址前面的东西(用空白替换了正则匹配到的东西),
![](https://box.kancloud.cn/edb836971ec4481304db3dcb0c687bbf_1054x157.png)
> -r:表示扩展正则,类似grep -E
> -n:表示只打印匹配到的行
> -g:表示一行中有多个str1的时候,都替换,而不是仅替换第一个
> ` sed 's/Bcast.*//g'` 去掉IP后边的东西
![](https://box.kancloud.cn/778a61affb66da729cf7a0fe8169d82c_1293x174.png)
2. 修改文件
> * 修改nimbus.host为nimbus.slave
![](https://box.kancloud.cn/d8ecbd9fce3d60cf45509214f4251ab9_902x388.png)
~~~
sed /imbus.host/s/host/slave/gp test.txt
~~~
> * 打印显示修改成功
![](https://box.kancloud.cn/dccdd874e864980c3e780fbdf8643a07_999x441.png)
> * 有点碍眼的是打印了不相关的内容,此时加入-n参数,只打印匹配到的行
~~~
sed -n /imbus.host/s/host/slave/gp test.txt
~~~
![](https://box.kancloud.cn/8c3c92ccd6fa864d358267404cfaa5fb_943x119.png)
* 虽然打印输出修成功,但是文件还是老样子
![](https://box.kancloud.cn/54ea4f124ebbd4be16df032bbc65f78f_979x514.png)
* 加 -i参数,把修改保存到源文件,此时不加-n,p,p:表示打印,会把匹配到的行,在文件当中多加一行造成重复
~~~
sed -i /imbus.host/s/host/slave/g test.txt
~~~
* 修改成功
![](https://box.kancloud.cn/22ad37cbb99977f9b9efe9e1637f2f0f_885x406.png)
* 加入p` sed -i /imbus.slave/s/slave/dailin/gp test.txt`
![](https://box.kancloud.cn/2e153864c4c33d14fa336961e3bd13b9_1048x430.png)
* 加入-n p (-n需要p),因为-n只打印匹配的行,所以文件只剩下匹配到的行,如果没有匹配到任何行,文件就空了,需要慎用
~~~
sed -i -n /imbus.slave/s/slave/dailin/gp test.txt
~~~
![](https://box.kancloud.cn/4d949a0fc09355aa0843ae14af8bac6d_575x415.png)
### 10. 指定用户启动进程(脚本中、自启动中)
> * 在系统启动时,在进程启动命令处指定用户即可,格式如下
> * 重点:在/etc/rc.local写程序的启动命令(系统执行内核过程中会启动init进程,该进程把当前runlevel所对应的的所有service 都启动后,才会执行rc.local里的命令),程序默认以root身份启动;也可以通过 sudo -u user1 命令 指定以user1身份启动。
由于tomcat运行需要JAVA_HOME,而在init进程运行时还未加载用户的profile,所以需要在命令前指定JAVA_HOME。
~~~
sudo -u 【user】 【命令】
~~~
> * 例如启动redis时,修改脚本。让redis用户启动redis服务。
![](https://box.kancloud.cn/7479c9aabb2541d280b032690dff3a69_859x464.png)
> * 实现了redis启动redis服务,以前启动都是root启动的
![](https://box.kancloud.cn/9fd16fa6de36995df9694a0282d1595c_1067x71.png)
### 10. cut
列提取命令,默认用tab分割行
cut 【选项】文件
选项:
-f:选择列 1 1,3
-d
- Docker
- 什么是docker
- Docker安装、组件启动
- docker网络
- docker命令
- docker swarm
- dockerfile
- mesos
- 运维
- Linux
- Linux基础
- Linux常用命令_1
- Linux常用命令_2
- ip命令
- 什么是Linux
- SELinux
- Linux GCC编译警告:Clock skew detected. 错误解决办法
- 文件描述符
- find
- 资源统计
- LVM
- Linux相关配置
- 服务自启动
- 服务器安全
- 字符集
- shell脚本
- shell命令
- 实用脚本
- shell 数组
- 循环与判断
- 系统级别进程开启和停止
- 函数
- java调用shell脚本
- 发送邮件
- Linux网络配置
- Ubuntu
- Ubuntu发送邮件
- 更换apt-get源
- centos
- 防火墙
- 虚拟机下配置网络
- yum重新安装
- 安装mysql5.7
- 配置本地yum源
- 安装telnet
- 忘记root密码
- rsync+ crontab
- Zabbix
- Zabbix监控
- Zabbix安装
- 自动报警
- 自动发现主机
- 监控MySQL
- 安装PHP常见错误
- 基于nginx安装zabbix
- 监控Tomcat
- 监控redis
- web监控
- 监控进程和端口号
- zabbix自定义监控
- 触发器函数
- zabbix监控mysql主从同步状态
- Jenkins
- 安装Jenkins
- jenkins+svn+maven
- jenkins执行shell脚本
- 参数化构建
- maven区分环境打包
- jenkins使用注意事项
- nginx
- nginx认证功能
- ubuntu下编译安装Nginx
- 编译安装
- Nginx搭建本地yum源
- 文件共享
- Haproxy
- 初识Haproxy
- haproxy安装
- haproxy配置
- virtualbox
- virtualbox 复制新的虚拟机
- ubuntu下vitrualbox安装redhat
- centos配置双网卡
- 配置存储
- Windows
- Windows安装curl
- VMware vSphere
- 磁盘管理
- 增加磁盘
- gitlab
- 安装
- tomcat
- Squid
- bigdata
- FastDFS
- FastFDS基础
- FastFDS安装及简单实用
- api介绍
- 数据存储
- FastDFS防盗链
- python脚本
- ELK
- logstash
- 安装使用
- kibana
- 安准配置
- elasticsearch
- elasticsearch基础_1
- elasticsearch基础_2
- 安装
- 操作
- java api
- 中文分词器
- term vector
- 并发控制
- 对text字段排序
- 倒排和正排索引
- 自定义分词器
- 自定义dynamic策略
- 进阶练习
- 共享锁和排它锁
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- Redis
- redis部署
- redis基础
- redis运维
- redis-cluster的使用
- redis哨兵
- redis脚本备份还原
- rabbitMQ
- rabbitMQ安装使用
- rpc
- RocketMQ
- 架构概念
- 安装
- 实例
- 好文引用
- 知乎
- ACK
- postgresql
- 存储过程
- 编程语言
- 计算机网络
- 基础_01
- tcp/ip
- http转https
- Let's Encrypt免费ssl证书(基于haproxy负载)
- what's the http?
- 网关
- 网络IO
- http
- 无状态网络协议
- Python
- python基础
- 基础数据类型
- String
- List
- 遍历
- Python基础_01
- python基础_02
- python基础03
- python基础_04
- python基础_05
- 函数
- 网络编程
- 系统编程
- 类
- Python正则表达式
- pymysql
- java调用python脚本
- python操作fastdfs
- 模块导入和sys.path
- 编码
- 安装pip
- python进阶
- python之setup.py构建工具
- 模块动态导入
- 内置函数
- 内置变量
- path
- python模块
- 内置模块_01
- 内置模块_02
- log模块
- collections
- Twisted
- Twisted基础
- 异步编程初探与reactor模式
- yield-inlineCallbacks
- 系统编程
- 爬虫
- urllib
- xpath
- scrapy
- 爬虫基础
- 爬虫种类
- 入门基础
- Rules
- 反反爬虫策略
- 模拟登陆
- problem
- 分布式爬虫
- 快代理整站爬取
- 与es整合
- 爬取APP数据
- 爬虫部署
- collection for ban of web
- crawlstyle
- API
- 多次请求
- 向调度器发送请求
- 源码学习
- LinkExtractor源码分析
- 构建工具-setup.py
- selenium
- 基础01
- 与scrapy整合
- Django
- Django开发入门
- Django与MySQL
- java
- 设计模式
- 单例模式
- 工厂模式
- java基础
- java位移
- java反射
- base64
- java内部类
- java高级
- 多线程
- springmvc-restful
- pfx数字证书
- 生成二维码
- 项目中使用log4j
- 自定义注解
- java发送post请求
- Date时间操作
- spring
- 基础
- spring事务控制
- springMVC
- 注解
- 参数绑定
- springmvc+spring+mybatis+dubbo
- MVC模型
- SpringBoot
- java配置入门
- SpringBoot基础入门
- SpringBoot web
- 整合
- SpringBoot注解
- shiro权限控制
- CommandLineRunner
- mybatis
- 静态资源
- SSM整合
- Aware
- Spring API使用
- Aware接口
- mybatis
- 入门
- mybatis属性自动映射、扫描
- 问题
- @Param 注解在Mybatis中的使用 以及传递参数的三种方式
- mybatis-SQL
- 逆向生成dao、model层代码
- 反向工程中Example的使用
- 自增id回显
- SqlSessionDaoSupport
- invalid bound statement(not found)
- 脉络
- beetl
- beetl是什么
- 与SpringBoot整合
- shiro
- 什么是shiro
- springboot+shrio+mybatis
- 拦截url
- 枚举
- 图片操作
- restful
- java项目中日志处理
- JSON
- 文件工具类
- KeyTool生成证书
- 兼容性问题
- 开发规范
- 工具类开发规范
- 压缩图片
- 异常处理
- web
- JavaScript
- 基础语法
- 创建对象
- BOM
- window对象
- DOM
- 闭包
- form提交-文件上传
- td中内容过长
- 问题1
- js高级
- js文件操作
- 函数_01
- session
- jQuery
- 函数01
- data()
- siblings
- index()与eq()
- select2
- 动态样式
- bootstrap
- 表单验证
- 表格
- MUI
- HTML
- iframe
- label标签
- 规范编程
- layer
- sss
- 微信小程序
- 基础知识
- 实践
- 自定义组件
- 修改自定义组件的样式
- 基础概念
- appid
- 跳转
- 小程序发送ajax
- 微信小程序上下拉刷新
- if
- 工具
- idea
- Git
- maven
- svn
- Netty
- 基础概念
- Handler
- SimpleChannelInboundHandler 与 ChannelInboundHandler
- 网络编程
- 网络I/O
- database
- oracle
- 游标
- PLSQL Developer
- mysql
- MySQL基准测试
- mysql备份
- mysql主从不同步
- mysql安装
- mysql函数大全
- SQL语句
- 修改配置
- 关键字
- 主从搭建
- centos下用rpm包安装mysql
- 常用sql
- information_scheme数据库
- 值得学的博客
- mysql学习
- 运维
- mysql权限
- 配置信息
- 好文mark
- jsp
- jsp EL表达式
- C
- test