0%

一、简介

iText是著名的开源的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

二、maven依赖导入

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!--支持中文水印-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>

三、获取关键字所在坐标位置

PDFHelperUtils.java

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.mro.finance.util.itextpdf;

import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;

public class PDFHelper {

/**
* @param filepath 文件路径
* @param keyWords 关键字
* @return float[]
* @Description 用于供外部类调用获取关键字所在PDF文件坐标
*/
public static MatchItem getKeyWordsByPath(String filepath, String keyWords) {
MatchItem matchItem = null;
try {
PdfReader pdfReader = new PdfReader(filepath);
matchItem = getKeyWords(pdfReader, keyWords);
} catch (IOException e) {
e.printStackTrace();
}
return matchItem;
}


public static MatchItem getKeyWordsByPath(InputStream inputStream, String keyWords) {
MatchItem matchItem = null;
try {
PdfReader pdfReader = new PdfReader(inputStream);
matchItem = getKeyWords(pdfReader, keyWords);
} catch (IOException e) {
e.printStackTrace();
}
return matchItem;
}

/**
* @param pdfReader pdfReader
* @param keyWords 关键字
* @return 坐标包装对象
* @Description 获取关键字所在PDF坐标
*/
private static MatchItem getKeyWords(PdfReader pdfReader, String keyWords) {
int page = 0;
try {
int pageNum = pdfReader.getNumberOfPages();
PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
CustomRenderListener renderListener = new CustomRenderListener();
renderListener.setKeyWord(keyWords);
StringBuilder allText = null;
for (page = 1; page <= pageNum; page++) {
renderListener.setPage(page);
pdfReaderContentParser.processContent(page, renderListener);

List<MatchItem> matchItems = renderListener.getMatchItems();
if (matchItems != null && matchItems.size() > 0) {
// 完全匹配返回首个匹配项
return matchItems.get(0);
}
List<MatchItem> allItems = renderListener.getAllItems();
allText = new StringBuilder();
for (MatchItem item : allItems) {
allText.append(item.getContent());
// 关键字存在连续多个块中
if (allText.indexOf(keyWords) != -1) {
return item;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}


// 添加图片
public static void andImage(String filePath, String imgPath, int pageNum, float x, float y) {
String fileName = filePath.substring(0, filePath.lastIndexOf("."));
String outputPath = fileName + (int) ((Math.random() * 9 + 1) * 100000L) + ".pdf";
try {
PdfReader reader = new PdfReader(filePath);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outputPath));
final float width = 128, height = 128;

Image img = Image.getInstance(imgPath);
img.scaleAbsolute(width, height); // 图片大小
img.setAbsolutePosition(x, y - height / 2); // 设置图片的绝对位置,根据左顶角为原坐标
img.setAlignment(Image.TEXTWRAP);
PdfContentByte under = stamp.getUnderContent(pageNum);
under.addImage(img);
stamp.close();
reader.close();
/*
* Image类方法:
* scaleAbsolute(float newWidth, float newHeight); // 将图像缩放到绝对宽度和绝对高度。
* scaleAbsoluteHeight(float newHeight); // 将图像缩放到绝对高度。
* scaleAbsoluteWidth(float newWidth); //将图像缩放到绝对宽度。
* scalePercent(float percent); // 将图像缩放到一定百分比。
* scalePercent(float percentX, float percentY); //将图像的宽度和高度缩放到一定百分比。
* scaleToFit(float fitWidth, float fitHeight); //缩放图像,使其适合特定的宽度和高度。
*/

} catch (Exception e) {
e.printStackTrace();
}

}

// 添加水印
public static void andWatermark(String filePath, String markStr, int pageNum, float x, float y) {
String fileName = filePath.substring(0, filePath.lastIndexOf("."));
String outputPath = fileName + "(水印).pdf";
try {
PdfReader reader = new PdfReader(filePath);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outputPath));

// 文字水印
PdfContentByte over = stamp.getOverContent(pageNum);
// 设置透明度
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.1f);
over.beginText();
//under.setColorFill(BaseColor.PINK); // 文字颜色
// BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
over.setGState(gs);
over.setFontAndSize(bf, 18); // 水印字体大小
over.setTextMatrix(1, 1);
over.showTextAligned(Element.ALIGN_CENTER, String.join("", Collections.nCopies(10, markStr + " ")), x, y, 45);
over.endText(); //添加水印文字
stamp.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}

}


public static void main(String[] args) throws Exception {
String filePath = "D:\\合同模板.pdf";
String imgPath = "D:\\印章.png";
String keyWord = "代表人:";
String markStr = "WDNMD";

MatchItem matchItem = getKeyWordsByPath(filePath, keyWord);
System.out.println("x:" + matchItem.getX() + "y:" + matchItem.getY() + "页数:" + matchItem.getPageNum());
// andImage(filePath, imgPath, matchItem.getPageNum(), matchItem.getX(), matchItem.getY());
andWatermark(filePath, markStr, matchItem.getPageNum(), matchItem.getX(), matchItem.getY());
}
}

返回体包装MatchItem.java

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
package com.mro.finance.util.itextpdf;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MatchItem {

private String content;
private int pageNum;
private float x;
private float y;

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public int getPageNum() {
return pageNum;
}

public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}

public float getX() {
return x;
}

public void setX(float x) {
this.x = x;
}

public float getY() {
return y;
}

public void setY(float y) {
this.y = y;
}
}

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
package com.mro.finance.util.itextpdf;

import com.itextpdf.awt.geom.Rectangle2D.Float;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;

import java.util.ArrayList;
import java.util.List;

public class CustomRenderListener implements RenderListener {

/**
* 定位坐标的关键字
*/
private String keyWord;
/**
* 关键字所在的页数
*/
private int page;
// 所有匹配的项
private List<MatchItem> matchItems = new ArrayList<>();
// 所有项
private List<MatchItem> allItems = new ArrayList<>();

public String getKeyWord() {
return keyWord;
}

public void setKeyWord(String keyWord) {
this.keyWord = keyWord;
}

public int getPage() {
return page;
}

public void setPage(int page) {
this.page = page;
}

public List<MatchItem> getMatchItems() {
return matchItems;
}

public void setMatchItems(List<MatchItem> matchItems) {
this.matchItems = matchItems;
}

public List<MatchItem> getAllItems() {
return allItems;
}

public void setAllItems(List<MatchItem> allItems) {
this.allItems = allItems;
}

@Override
public void beginTextBlock() {

}

@Override
public void renderText(TextRenderInfo textRenderInfo) {
String text = textRenderInfo.getText();
Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();
MatchItem matchItem = new MatchItem();
matchItem.setContent(text);
matchItem.setPageNum(page);
matchItem.setX(boundingRectange.x);
matchItem.setY(boundingRectange.y);
if (null != text && !" ".equals(text)) {
if (text.equalsIgnoreCase(keyWord)) {
matchItems.add(matchItem); // 匹配的项
}
}
allItems.add(matchItem);
}

@Override
public void endTextBlock() {

}

@Override
public void renderImage(ImageRenderInfo imageRenderInfo) {

}
}

IDEA使用时配置

1、多行显示

Settings -> Editor -> General -> Editor Tabs

Show tabs in one row 单行显示

Closing Policy -> Tab limit 窗口上限

image-20230302104554358

2、显示git修改过的文件列表

Settings -> Version Control -> Commit

Use non-modal commit interface取消勾选

image-20230302134157815

3、默认字符编码

Settings -> Editor -> File Encodings

三处都设置为UTF-8。 中间的Path列表为各个项目,可以对某个项目进行设置字符编码。

下面的Transparent native-to-ascii conversion一般都勾上,避免Properties等文件中的注释显示乱码。

image-20230303151134372

4、自动添加文件头

Settings -> Editor -> File and Code Templates

image-20230303153819392

5、设置忽略大小写提示

idea的默认设置是严格区分大小写提示的,所以当我们输入的字段的大小写不一致的时候是不进行代码提示的。

File–->settings–->Editor–->General–>Code Completion

取消勾选Match case

image-20230303155608446

6、设置关闭后打开项目为最后关闭项目

File–>Settings–>Appearance –> Behavior–> System Settings

取消勾选 Reopen projects on starup

image-20230303160418339

7、显示方法之间的分割线

File–>Settings–>Editor–>General–>Appearance

勾选 Show method separators

image-20230303161011426

8、护眼模式 豆沙绿

护眼主题 Love Your Eyes Theme

Editor -> Color Scheme -> Console Colors ->Console -> Background

设置成 CAECCE:202,236,206

image-20230328140744676

9、IDEA更改maven镜像源

找到idea使用的maven配置文件(settings.xml)

打开 Maven 的配置文件(windows机器一般默认放在maven安装目录的conf/settings.xml),在<mirrors></mirrors>标签中添加 mirror 子节点:

image-20230510151515215

添加如下所示的阿里镜像站代码块,由阿里mirror提供

1
2
3
4
5
6
7
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

image-20230510151748593

特殊情况处理

由于使用了HTTPS,存在着SSL证书验证的问题,因此需要在IDEA中添加配置来忽略SSL证书的验证

下载过程中虽然显示已经配置过阿里云的镜像,但是新版本的阿里云镜像不再支持http下载,只支持https下载,再次做出修改配置

1
2
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
1

image-20230510152003645

配置完成后apply即可,重启IDEA生效配置。

基础命令

1
2
3
4
5
6
7
8
9
systemctl start docker  #启动docker
systemctl stop docker #关闭
systemctl stop docker #重启
systemctl status docker #查看docker 运行状态

docker version #查看docker 版本号信息
docker info #显示docker的系统信息,包括镜像和容器的数量

docker 命令 --help #帮助命令

镜像命令

1
2
3
4
5
6
7
8
9
docker images                #查看所有本地主机上的镜像 docker image ls
docker search 镜像名 #搜索镜像
docker search --filter=STARS=9000 mysql #搜索 STARS >9000的 mysql 镜像
docker pull 镜像名:tag #下载镜像 docker image pull 不加tag(版本号) 即拉取docker仓库中最新的版本
docker rmi 镜像名:tag #删除镜像,多个镜像用空格隔开
docker rmi -f $(docker images -aq) #删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker image rm 镜像名/镜像ID #强制删除镜像
docker save 镜像名/镜像ID -o 保存位置与名字 #保存镜像
docker load -i 镜像保存文件位置 #加载镜像

docker官方镜像搜索

容器命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run 镜像id #新建容器并启动
docker ps #列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
#删除所有容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
docker run 镜像id #新建容器并启动
-p #宿主机端口:容器端口
-v #宿主机文件存储位置:容器内文件位置
-d #指定容器运行于前台还是后台,默认为false
-i #打开STDIN,用于控制台交互
--name="" #指定容器名字
docker ps #列出所有运行的容器 docker container list
-a #--all列出所有容器,包含正在运行 和已停止的
-q #--quiet输出仅包含容器 ID
-l #--latest 按创建日期的顺序列出容器
docker rm 容器id #删除指定容器
#删除所有容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作

命令大全

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
docker attach	#连接到正在运行中的容器
docker build #使用 Dockerfile 创建镜像
docker builder #管理builds
docker builder prune #清除build缓存
docker checkpoint #管理checkpoints
docker checkpoint create #从正在运行的容器创建检查点
docker checkpoint ls #列出容器的检查点
docker checkpoint rm #删除指定的检查点
docker commit #从容器创建一个新的镜像
docker config #管理Docker配置
docker config create #创建配置文件
docker config inspect #查看配置文件信息
docker config ls #显示docker里已经保存得配置文件
docker config rm #删除配置文件
docker container #管理容器
docker container prune #删除所有已停止的容器
docker context #管理contexts
docker context create #创建一个上下文
docker context export #将上下文导出到tar或kubecconfig文件中
docker context import #从tar或zip文件导入上下文
docker context inspect #在一个或多个上下文上显示详细信息
docker context ls #列出上下文
docker context rm #删除一个或多个上下文
docker context update #更新
docker context use #设置当前docker的上下文
docker cp #用于容器与主机之间的数据拷贝
docker create #创建一个新的容器但不启动它
docker diff #检查容器里文件结构的更改
docker events #从服务器获取实时事件
docker exec #在运行的容器中执行命令
docker export #将文件系统作为一个tar归档文件导出到STDOUT
docker history #查看指定镜像的创建历史
docker image #管理镜像
docker image inspect #显示一个或多个镜像的元数据
docker image ls #列出本地镜像
docker image prune #删除没有使用的镜像
docker image rm #删除一个或多个镜像
docker images #列出本地镜像
docker import #从归档文件中创建镜像
docker info #显示 Docker 系统信息,包括镜像和容器数
docker inspect #获取容器/镜像的元数据
docker kill #杀掉一个运行中的容器
docker load #导入使用 docker save 命令导出的镜像
docker login #登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout #登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logs #获取容器的日志
docker manifest #管理manifest(实验,不应用于生产环境)
docker manifest annotate #向本地镜像清单添加附加信息
docker manifest create #创建用于注释和推入注册表的本地清单列表
docker manifest inspect #显示镜像清单或清单列表
docker manifest push #将清单列表推入仓库
docker manifest rm #从本地存储中删除一个或多个清单列表
docker network #管理网络
docker network connect #将容器连接到网络
docker network create #创建一个网络
docker network disconnect #断开容器的网络
docker network inspect #显示一个或多个网络的元数据
docker network ls #列出网络
docker network prune #删除所有没有使用的网络
docker network rm #删除一个或多个网络
docker node #管理集群(swarm)节点
docker node demote #从群集(swarm)管理器中降级一个或多个节点
docker node inspect #显示一个或多个节点的元数据
docker node ls #列出群集(swarm)中的节点
docker node promote #将一个或多个节点推入到群集管理器中
docker node ps #列出在一个或多个节点上运行的任务,默认为当前节点
docker node rm #从群集(swarm)删除一个或多个节点
docker node update #更新一个节点
docker pause #暂停容器中所有的进程
docker plugin #管理插件
docker plugin create #从rootfs和配置创建一个插件。插件数据目录必须包含config.json和rootfs目录。
docker plugin disable #禁用插件
docker plugin enable #启用插件
docker plugin inspect #显示一个或多个插件的元数据
docker plugin install #安装一个插件
docker plugin ls #列出所有插件
docker plugin push #将插件推送到注册表
docker plugin rm #删除一个或多个插件
docker plugin set #更改插件的设置
docker plugin upgrade #升级现有插件
docker port #列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker ps #列出容器
docker pull #从镜像仓库中拉取或者更新指定镜像
docker push #将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker rename #重命名容器
docker restart #重启容器
docker rm #删除一个或多个容器
docker rmi #删除一个或多个镜像
docker run #创建一个新的容器并运行一个命令
docker save #将指定镜像保存成 tar 归档文件
docker search #从Docker Hub查找镜像
docker secret #管理Docker secrets
docker secret create #从文件或STDIN创建一个秘密作为内容
docker secret inspect #显示有关一个或多个秘密的详细信息
docker secret ls #列出秘密
docker secret rm #删除一个或多个秘密
docker service #管理服务
docker service create #创建一个服务
docker service inspect #查看服务的元数据
docker service logs #获取服务的日志
docker service ls #列出服务
docker service ps #列出一个或多个服务的任务
docker service rm #删除一个或多个服务
docker service rollback #将更改恢复到服务的配置
docker service scale #缩放一个或多个复制服务
docker service update #更新服务
docker stack #管理堆栈
docker stack deploy #部署新的堆栈或更新现有堆栈
docker stack ls #列出现有堆栈
docker stack ps #列出堆栈中的任务
docker stack rm #删除堆栈
docker stack services #列出堆栈中的服务
docker start #启动一个或多个已经被停止的容器
docker stats #显示容器的实时流资源使用统计信息
docker stop #停止一个运行中的容器
docker swarm #管理集群(Swarm)
docker swarm ca #查看或旋转当前群集CA证书。此命令必须针对管理器节点
docker swarm init #初始化一个群集(Swarm)
docker swarm join #加入群集作为节点和/或管理器
docker swarm join-token #管理加入令牌
docker swarm leave #离开群集(Swarm)
docker swarm unlock #解锁群集(Swarm)
docker swarm unlock-key #管理解锁钥匙
docker swarm update #更新群集(Swarm)
docker system #管理Docker
docker system df #显示docker磁盘使用情况
docker system events #从服务器获取实时事件
docker system info #显示系统范围的信息
docker system prune #删除未使用的数据
docker tag #标记本地镜像,将其归入某一仓库
docker top #查看容器中运行的进程信息,支持 ps 命令参数
docker trust #管理Docker镜像的信任
docker trust inspect #返回有关key和签名的低级信息
docker trust key #管理登入Docker镜像的keys
docker trust key generate #生成并加载签名密钥对
docker trust key load #加载私钥文件以进行签名
docker trust revoke #删除对镜像的认证
docker trust sign #镜像签名
docker trust signer #管理可以登录Docker镜像的实体
docker trust signer add #新增一个签名者
docker trust signer remove #删除一个签名者
docker unpause #恢复容器中所有的进程
docker update #更新一个或多个容器的配置
docker version #显示 Docker 版本信息
docker volume #管理volumes
docker volume create #创建一个卷
docker volume inspect #显示一个或多个卷的元数据
docker volume ls #列出卷
docker volume prune #删除所有未使用的卷
docker volume rm #删除一个或多个卷
docker wait #阻塞运行直到容器停止,然后打印出它的退出代码

标题

1
2
可以直接使用快捷键: Ctrl + 1-6
或者 # 标题名字(井号的个数代表标题的级数,最多支持6级标题)
  1. #一级标题 使用1个#

  2. ##二级标题使用2个#

  3. ###三级标题使用3个#

  4. ####四级标题使4用个#

  5. #####五级标题使用5个#

  6. 六级标题使用6个#

基础

1. 删除线 ~~

1
2
这就是 ~~删除线~~ (使用波浪号)

这就是 删除线 (使用波浪号)


2. 斜体 *

1
2
3
4
这是用来 *斜体* 的 _文本_
使用*斜体内容*
或者 _斜体内容_
再或者 快捷键ctrl+i

这是用来 斜体文本_


3. 加粗 **

1
2
3
4
这是用来 **加粗** 的 __文本__
使用**加粗内容**
或者 __加粗内容__
再或者 快捷键ctrl+b

这是用来 加粗文本


4. 斜体+加粗 ***

1
2
这是用来 ***斜体+加粗*** 的 ___文本___
三个下划线,或者 三个*

这是用来 斜体+加粗文本


5. 下划线 Ctrl+u

下划线是HTML语法:

1
2
<u>我是下划线</u>
或者 快捷键ctrl+u

我是下划线


6. 高亮(需勾选扩展语法) ==

1
这是用来 ==高亮的语法== 的文本

这是用来 ==斜体+加粗== 的文本


7. 下标(需勾选扩展语法)~

1
2
3
水 H~2~O 
双氧水 H~2~O~2~
其实就是 ~ 小波浪中间的字体会标记在下方

水 H2O

双氧水 H2O2


8. 上标(需勾选扩展语法)^

1
2
3
面积 m^2^ 
体积 m^3^
其实就是 ^ 向上的尖符号 (异或符号) 中间的字体会标记在上方

面积 m^2^
体积 m^3^


9. 表格 Ctrl+t

表格的语法很麻烦,可以直接使用快捷键ctrl + t 调用表格

使用 | 来分隔不同的单元格,使用 - 来分隔表头和其他行:

1
2
3
4
name | price
--- | ---
fried chicken | 19
cola|5

为了使 Markdown 更清晰,|- 两侧需要至少有一个空格(最左侧和最右侧的 | 外就不需要了)。

name price
fried chicken 19
cola 5

为了美观,可以使用空格对齐不同行的单元格,并在左右两侧都使用 | 来标记单元格边界,在表头下方的分隔线标记中加入 :,即可标记下方单元格内容的对齐方式:

1
2
3
4
|    name       | price |
| :------------ | :---: |
| fried chicken | 19 |
| cola | 32 |
name price
fried chicken 19
cola 32

10. 块引用 >

1
>“块引用就是个向右侧的尖括号 >”

“块引用就是个向右侧的尖括号”

1
2
>也可以在引用中
>>使用嵌套的引用

也可以在引用中

使用嵌套的引用


11. 无序列表 * + -

无序列表–符号 空格

1
2
3
* 可以使用 `*` 作为标记
+ 也可以使用 `+`
- 或者 `-`
  • 可以使用 * 作为标记
  • 也可以使用 +
  • 或者 -

12. 有序列表

有序列表–数字 . 空格

1
2
3
1. 有序列表以数字和 `.` 开始;
2. 数字的序列并不会影响生成的列表序列;
3. 但仍然推荐按照自然顺序(1.2.3...)编写。
  1. 有序列表以数字和 . 开始;

  2. 数字的序列并不会影响生成的列表序列;

  3. 但仍然推荐按照自然顺序(1.2.3…)编写。

    可以使用:数字. 来取消显示为列表(用反斜杠进行转义)


13. 代码块

1
```语言名称    例如:```java
1
2
3
public static void main(String[] args) {
//-----------------
}

14. 行内代码

1
2
通过 ``,插入行内代码(` 是 `Tab` 键上边、数字 `1` 键左侧的那个按键):
例如 `Markdown`。会按照代码的格式显示入以下内容

Markdown


15. 分隔线

可以在一行中使用三个或更多的 *、- 或 _ 来添加分隔线(``):

1
2
3
***
------
___



16. 外部跳转–超链接

[] 中括号内为描述,()小括号内为链接地址

1
[帮助文档](https://support.typora.io/Links/#faq)

帮助文档


17. 内部跳转–本文件内跳(Typora支持) 必须是标题

1
2
[我想跳转到标题](#MarkDown基础)。。。
按住Ctrl键 点击超链接即可跳转

Open Links in Typora

You can use command+click (macOS), or ctrl+click (Linux/Windows) on links in Typora to jump to target headings, or open them in Typora, or open in related apps.

我想跳转到标题


18. 自动链接

使用 <> 包括的 URL 或邮箱地址会被自动转换为超链接:

1
<https://www.baidu.com>

https://www.baidu.com


19. 网上的图片

1
2
![自己起的图片名字](图片地址或者图片本地存储的路径)
![猫咪 ](./format.png)

ZIP安装

解压就完事了

配置

1. 配置环境变量

右键此电脑->属性—>高级系统设置—>环境变量—>系统变量

新建MYSQL_HOME,值为mySql的安装路径,如:

D:\software\developTools\mysql-5.7.35-winx64

然后编辑Path,增加%MYSQL_HOME%\bin

2. 配置my.ini文件

在安装目录下新建my.ini文件,文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[mysqld]
#端口号
port = 3306
#mysql的路径,记得改
basedir=D:\\software\developTools\mysql-5.7.35-winx64
#mysql的路径+\data
datadir=D:\\software\developTools\mysql-5.7.35-winx64\data
#最大连接数
max_connections=200
#编码
character-set-server=utf8

default-storage-engine=INNODB

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

skip-grant-tables

[mysql]
#编码
default-character-set=utf8

image-20230419161800417

3. 安装MySQL

1)在输入框内输入cmd,以****管理员的身份运行*,注意这里一定一定一定要以管理员的身份运行,否则在安装过程中会出现因为管理权限不够而导致的Install/Remove of the Service Denied!(安装/卸载服务被拒绝)*,这一点非常重要!

image-20230419161906809

2)在cmd中进入到mysql安装目录下:

  1. 输入安装命令:mysqld -install若出现Service successfully installed,证明安装成功;如出现Install of the Service Denied,则说明没有以管理员权限来运行cmd
  2. 然后继续输入命令:mysqld --initialize,此时不会有任何提示:
  3. 重启MySQL,输入启动命令:net start mysql,出现以下提示证明MySQL启动成功:

image-20230419162256031

4. 设置MySQL密码

  1. 首先停止MySQL服务,输入命令行 net stop mysql
  2. 在my.ini文件中,在[mysqld]字段下任意一行添加skip-grant-tables

image-20230419162631175

  1. 重启MySQL,输入启动命令:net start mysql

  2. 再输入命令mysql -u root -p,进入MySQL

  3. 输入命令行use mysql,进入数据库

  4. 输入命令行update user set authentication_string=password("xxxxxx") where user="root";

    xxxxxx是你设置的新密码,敲击回车后若出现以下信息,证明修改成功!最后面的分号不要忘记

  5. 再次停止MySQL服务,把my.ini文件中的skip-grant-tables删除,然后重启服务,输入启动命令:net start mysql,再输入mysql -u root -p,再输入你刚刚设置的密码,如果能进入到这个页面,则设置成功了。

image-20230419163537691

重置密码
键入命令行alter user user() identified by “xxxxxx”;

假如密码是123456,因此我键入 alter user user() identified by “123456”;
再次输入命令行use mysql验证一下,成功!

bash中常用的linux指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1)、cd : 改变目录。
2)、cd .. 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll列出的内容更为详细。
5)、touch : 新建一个文件,如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: 新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹。
9)、mv 移动文件/重命名, mv index.html src (index.html 是我们要移动的文件,当第二个参数类型是文件时,mv命令完成文件重命名,它将所给的源文件或目录重命名为给定的目标文件名。
当第二个参数是已存在的目录名称时,则讲文件移动指目标目录)-i:交互方式操作(做覆盖确认)。-f:禁止交互操作。
10)、reset 重新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释
16)、vim 编辑文件。

设置全局用户名与邮箱

1
2
3
$ git config --global user.name [名称]  
$ git config --global user.email [邮箱]

常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git init: 初始化仓库
git clone: 克隆远程仓库到本地
git pull: 获取最新的远程仓库代码
git add [文件名]: 添加文件到仓库
git commit -m "版本信息": 提交文件到仓库,-m后是本次提交的说明
git commit -amend: 修改上次提交的说明
git status: 查看仓库状态
git log: 查看历史记录,分支合并图(--graph)、一行显示(--pretty=oneline)、提交校验码缩略显示(--abbrev-commit)
git reflog: 显示所有历史记录
git reset --hart/--soft [版本id]: 回退版本(--hard不保存文件修改,--soft保存)
git push: 将当前分支推送到远程对应的分支(若远程无对应分支,则推送无效)
git push origin dev: 将分支dev提交到远程origin/dev(远程没有则创建, 远程没有dev则创建)
git remote add [origin] [address]: 与远程仓库建立连接,origin是你为远程仓库起的名字,address为远程仓库的真实地址
git remote: 查看远程库信息
git remote -v: 远程库详细信息

常用撤销指令

1
2
3
git checkout -- [文件名]: 撤销工作区的修改(注意,不加--是切换分支的指令)
git reset HEAD [文件名]: 撤销暂存区的修改,退回工作区,没文件名则撤回所有文件

版本库删除

1
2
3
4
rm [文件名]
git rm [文件名]: 删除文件并提交至暂存区
git checkout -- [文件名]: 撤回工作区的删除操作
git reset HEAD/--hard/--hard HEAD: 撤回工作区的删除操作

常用分支指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看分支:git branch 
创建分支:git branch [name]
切换分支:git checkout [name] 工作区文件内容会立即变化成对应分支的内容
创建并切换分支:git checkout -b [name]
合并某分支到当前分支:git merge [name]
删除分支:git branch -d [name]
从分支获取:git clone -b branchname XXX

查看分支合并情况:git log –graph –pretty=oneline –abbrev-commit

合并分支(快速合并-Fast forward):git merge [name]
–-no-ff 禁用Fast forward方式,进行普通合并
--squash 把一些不必要commit进行压缩,不显示该分支中的commit,只进行一次额外的commit来“总结”一下

git branch -r,git branch -a 查看远程分支
git branch –set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联
git checkout -b dev origin/dev 创建远程的origin/dev分支到本地

远程仓库操作流程

1.本地版本库与远程版本库冲突问题

git pull 将远程版本库改变拉到本地版本库中
git push 提交本地版本库

注意:如果出现冲突需要手动解决解决之后git add之后执行git commit

2.提交本地版本库的分支到远程仓库

1). git checkout -b dev
2). git add [文件名]
3). git comnmit -m “信息”
4). git push origin dev //将分支提交远程仓库
5). git checkout master //切换到master
6). git merge dev //合并dev中内容到master
7). git branch -d dev //删除本地分支
8). git push -d origin dev // 删除远程分支

[博客园链接](git常用指令 - B1nbin - 博客园 (cnblogs.com))

1. 注释

单行注释:使用#符号表示单行注释,注释内容写在#后面,如下所示:

1
# 这是一条单行注释

多行注释:使用’’’或”””表示多行注释,注释内容写在这两个符号之间,如下所示:

1
2
3
4
5
6
7
'''

这是一条多行注释

可以换行写注释内容

'''

2. 变量

python 中变量很简单,不需要指定数据类型,直接使用等号定义就好。python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前那个变量知道那个变量值的内存地址存起来,而不是指向之前的那个变量。

定义变量:使用赋值符号=定义变量,变量名由字母、数字、下划线组成,不能以数字开头,如下所示:

1
2
3
x = 10
name = 'Tom'
is_student = True

变量类型:Python中的变量是动态类型的,既不需要事先声明变量的类型,而是在运行时根据值的类型来确定变量的类型,如下所示:

1
2
3
x = 10 # 整数
y = 3.14 # 浮点数
z = 'hello' # 字符串

注意,以下关键字不能声明为变量名:

1
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif'',for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'try', 'while', 'with', 'yield']

3. 数据类型

3.1. 数字

Python中的数字包括整数、浮点数和复数,如下所示:

1
2
3
x = 10 # 整数
y = 3.14 # 浮点数
z = 2 + 3j # 复数
  1. python 中数字类型的变量可以表示任意大的数值

  2. 十六进制一 0x 开头,八进制以 0o 开头,二进制以 0b 开头

  3. python中可以表示复数用j来表示虚部,complex(a,b) 函数可以形成复数

    1
    2
    3
    a=3+4j
    b=complex(5,6)
    c=a+b
  4. real() 查看实部,imag() 查看虚部,conjugate()返回共轭复数

    1
    2
    3
    4
    print(c)
    print(c.real)
    print(c.imag)
    print(c.conjugate())

    运行结果

    1
    2
    3
    4
    (8+10j)
    8.0
    10.0
    (8-10j)

3.2. 字符串

Python中的字符串可以使用单引号、双引号、三单引号和三双引号来表示。三引号也可以多行注释代码,单行注释,使用#。如下所示:

1
2
3
4
5
6
7
8
9
s1 = 'hello' # 单引号字符串
s2 = "world" # 双引号字符串
s3 = '''hello,\nworld''' # 三单引号字符串,可以包含换行符
s4 = """hello,
world""" # 三双引号字符串,可以包含换行符
'''
三引号框起来的
也可以当做多行注释
'''

3.3. 列表

Python中的列表是由一组有序的元素组成,可以包含任意类型的数据,用中括号[]表示,如下所示:

1
list1 = [1, 2, 3, 'hello', 'world'] # 列表中可以包含不同类型的元素

与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。

1
2
3
4
5
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]

print "list1[0]: ", list1[0]
print "list2[1:5]: ", list2[1:5]

你可以对列表的数据项进行修改或更新,你也可以使用append()方法来添加列表项,如下所示:

1
2
3
4
list = []               ## 空列表
list.append('Google') ## 使用 append() 添加元素
list.append('Runoob')
print list

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。如下所示:

img

列表推导式

列表推导式(list comprehension),可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。语法如下所示:

1
[ 表达式 for 迭代变量 in 可迭代对象 if 条件表达式 ]

不使用列表推导式的语法:

1
2
3
for 迭代变量 in 可迭代对象 :
if 条件表达式 :
表达式

举几个栗子:

1
2
3
# 列表推导式
list_b = [b for b in range(5)]
print(list_b)

来看复杂点的列表推导式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# in后面跟其他可迭代对象,如字符串
list_c = [7 * c for c in "python"]
print(list_c)
# ['ppppppp', 'yyyyyyy', 'ttttttt', 'hhhhhhh', 'ooooooo', 'nnnnnnn']

# 带if条件语句的列表推导式
list_d = [d for d in range(6) if d % 2 != 0]
print(list_d)
# [1, 3, 5]

# 多个for循环
list_e = [(e, f * f) for e in range(3) for f in range(5, 15, 5)]
print(list_e)
# [(0, 25), (0, 100), (1, 25), (1, 100), (2, 25), (2, 100)]

# 嵌套列表推导式,多个并列条件
list_g = [[x for x in range(g - 3, g)] for g in range(22) if g % 3 == 0 and g != 0]
print(list_g)
# [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20]]
  1. 列表推导式会遍历后面的可迭代对象,然后按照for前的表达式进行运算,生成最终的列表.
  2. 如果有if条件语句,for遍历后紧跟着进行条件判断.
  3. 如果有多个for循环,则最终的数据数量为多个for循环的笛卡尔积.
  4. 可以进行嵌套的列表推导,与嵌套for循环的原理相同.
常用List列表函数&方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Python 包含以下函数:

len(list):列表元素个数
max(list):返回列表元素最大值
min(list):返回列表元素最小值
list(seq):将元组转换为列表

Python 包含以下方法:

list.append(obj):在列表末尾添加新的对象
list.count(obj):统计某个元素在列表中出现的次数
list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj):从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj):将对象插入列表
list.pop([index=-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj):移除列表中某个值的第一个匹配项
list.reverse():反向列表中元素
list.sort(cmp=None, key=None, reverse=False):对原列表进行排序

3.4. 元组

Python中的元组也是由一组有序的元素组成,但是元素不能修改,用小括号()表示,如下所示:

1
tuple1 = (1, 2, 3, 'hello', 'world') # 元组中可以包含不同类型的元素

3.5. 字典

Python中的字典是由一组键值对组成,用大括号{}表示,如下所示:

1
dict1 = {'name':'Tom', 'age': 18, 'gender': 'male'} # 字典中的键值对用冒号:分隔
字典推导式

如果列表推导的概念已经为你所熟知,接受字典推导并不难.直接看代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 因为key是唯一的,所以最后value都是1
dict_a = {key: value for key in 'python' for value in range(2)}
print(dict_a)
# {'p': 1, 'y': 1, 't': 1, 'h': 1, 'o': 1, 'n': 1}

# 可以根据键来构造值
dict_b = {key: key * key for key in range(6)}
print(dict_b)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 遍历一个有键值关系的可迭代对象
list_phone = [('HUAWEI', '华为'), ('MI', '小米'), ('OPPO', 'OPPO'), ('VIVO', 'VIVO')]
dict_c = {key: value for key, value in list_phone}
print(dict_c)
# {'HUAWEI': '华为', 'MI': '小米', 'OPPO': 'OPPO', 'VIVO': 'VIVO'}

3.6. 集合

Python中的集合是由一组无序的、唯一的元素组成,用大括号{}或set()函数表示,如下所示:

1
2
3
set1 = {1, 2, 3, 4, 5} # 使用大括号{}表示集合

set2 = set([2, 4, 6, 8]) # 使用set()函数创建集合
集合推导式

同样的,直接看代码,这样可以直观的看到集合推导式

1
2
3
# 遍历一个可迭代对象生成集合
set_a = {value for value in '有人云淡风轻,有人负重前行'}
print(set_a)

运行结果:

1
{'负', '有', '人', '轻', '前', '云', '重', ',', '淡', '风', '行'}

集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样。

4. 条件语句

if语句:用于判断一个条件是否成立,如果成立则执行if块中的语句,否则跳过if块,如下所示:

1
2
if x > 0:
print('x is positive')

if/else语句:用于判断一个条件是否成立,如果成立则执行if块中的语句,否则执行else块中的语句,如下所示:

1
2
3
4
if x > 0:
print('x is positive')
else:
print('x is non-positive')

if/elif/else语句:用于判断多个条件是否成立,如果第一个条件成立则执行if块中的语句,否则判断第二个条件,如果第二个条件成立则执行elif块中的语句,否则执行else块中的语句,如下所示:

1
2
3
4
5
6
if x > 0:
print('x is positive')
elif x == 0:
print('x is zero')
else:
print('x is negative')

5. 循环语句

for循环:用于遍历一个序列(如列表、元组、字符串等),如下所示:

1
2
for item in sequence:
print(item)

while循环:用于重复执行一段代码,直到条件不成立为止,如下所示:

1
2
while condition:
statement(s)

6. 函数

定义函数:使用def关键字定义函数,函数名由字母、数字、下划线组成,参数可以有默认值、可变参数、关键字参数等,如下所示:

1
2
3
4
5
6
7
8
def add(x, y):
return x + y


def foo(x, y=10, \*args, \kwargs):
print(x, y)
print(args)
print(kwargs)

调用函数:使用函数名和参数列表来调用函数,如下所示:

1
2
result = add(1, 2)
foo(1, 2, 3, 4, a=5, b=6)

6.1. range()函数

python 的 range() 函数可用来创建一个整数列表,一般用在 for 循环中.

  • range()语法:range(start, stop[, step])
  • start:计数从start开始,默认是从0开始(闭区间),如:range(5)等价于range(0,5)。
  • stop:计数到stop结束,但不包括stop(开区间),如:range(0,5)是[0, 1, 2, 3, 4],不包含5。
  • step:步长,相邻两个值的差值,默认为1,如:range(0,5)相当于range(0, 5, 1)。

7. 模块和包

python 中有大量第三方库可用 “pip3 install 。。。”进行有需要的安装

在使用库函数时,需要导入,有两种方法:

  • import 模块名【as 别名】:使用这种方式导入后,需要在使用的对象前加上前缀 “模块名 . 对项名”的方式进行访问,也可以用“别名 . 对象名”的方式使用其中的对象
  • from 模块名 import 对象名【as 别名】:使用这种方式仅导入使用的对象,并且可以为这个对象起一个别名,这种方法可以减少查询次数,减少程序员的代码量,不需要使用模块名作为前缀

比较极端的情况是一次导入模块中全部的对象:

1
from math import *

不推荐使用这中方法,一旦多个模块中有同名的对象,会导致混乱

8. 创建类

使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾:

1
2
3
class ClassName:
'''类的帮助信息''' #类文档字符串
class_suite #类体

类的帮助信息可以通过ClassName.__doc__查看。

class_suite 由类成员,方法,数据属性组成。

以下是一个简单的 Python 类的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
'所有员工的基类'
empCount = 0

def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1

def displayCount(self):
print "Total Employee %d" % Employee.empCount

def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary
  • empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
  • 第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
  • self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,按照惯例它的名称是 self。

8.1. 创建实例对象

实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。

以下使用类的名称 Employee 来实例化,并通过 init 方法接收参数。

1
2
3
4
# 创建 Employee 类的第一个对象
emp1 = Employee("Zara", 2000)
# 创建 Employee 类的第二个对象
emp2 = Employee("Manni", 5000)

8.2.访问属性

可以使用点号 . 来访问对象的属性。使用如下类的名称访问类变量:

1
2
3
4
5
6
7
8
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

# 结果
Name : Zara ,Salary: 2000
Name : Manni ,Salary: 5000
Total Employee 2

可以添加,删除,修改类的属性,如下所示:

1
2
3
emp1.age = 7  # 添加一个 'age' 属性
emp1.age = 8 # 修改 'age' 属性
del emp1.age # 删除 'age' 属性

也可以使用以下函数的方式来访问属性:

  • getattr(obj, name, [default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
  • delattr(obj, name) : 删除属性。
1
2
3
4
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age') # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(emp1, 'age') # 删除属性 'age'

9. 格式化输出

  什么是格式化输出呢,就是说把你的输出都格式化成一个样子的,比如说登录的欢迎信息,都是welcome to login,Marry。每个用户登录都是这样欢迎,但是每个用户的用户名都是一样的,不能一个用户写一行代码,所以这就用到了格式化输出。

格式化输出,有三种方式,

  • 第一种是用“+”连接,直接把输出的字符串和变量连接起来就可以了;

  • 第二种是用占位符,占位符有常用的三种:%s,%d和%f , %s是后面的值是一个字符串,%d后面的值必须是一个整数,%f后面是小数;

  • 第三种是使用{}和format方法

官方推荐使用format方法,不推荐使用第一种,第一种用加号的,会在内存里面开辟多个内存空间,而后面两种是只开辟一块内存空间。如下所示:

1
2
3
4
5
6
name=input('请输入你的名字:')
print('你的名字是' + name) #使用加号连接
print('你的名字是%s' % name) #使用占位符
print('你的名字是{your_name}'.format(your_name=name)) #使用format格式化输#出,{}里面的名字可以随便写但是要和后面的format中的名字保持一致,然后再把你前面定义的变量写到等号后面就可以了。
age=18
print('我的名字是%s,年龄是%d岁.' %(name, age)) #这种是里面有多个格式化内容的,前面那个是字符串,后面这个是整数,多个变量的后面跟值得时候必须要加上括号

基本概述

Linux文件

linux系统中一切皆文件。

Linux目录结构

  • /bin:Binary(二进制)的缩写,该目录存放着最经常使用的命令。
  • /boot: 启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。(不要动)
  • /dev : Device(设备)的缩写, 存放的是外部设备(访问设备的方式和访问文件的方式是相同的)。
  • /etc: 用来存放所有的系统管理所需要的配置文件和子目录。
  • /home:用户的主目录。每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
  • /lib:系统最基本的动态连接共享库。其作用类似于 Windows 里的 DLL 文件。(不要动)
  • /lost+found:一般情况下是空的,当系统非法关机后,这里就存放了一些文件。(存放突然关机的一些文件)
  • /media:系统会自动识别一些设备,例如U盘、光驱等等,当识别后,会把识别的设备挂载到这个目录下。
  • /mnt:供用户临时挂载别的文件系统,我们可以将光驱挂载在该目录上,然后进入该目录就可以查看光驱里的内容了。 (把一些本地的文件挂载在这个文件下)
  • /opt:主机额外安装软件所摆放的目录。比如安装一个 Oracle 数据库就可以放到这个目录下。默认是空的。
  • /proc:虚拟的目录,它是系统内存的映射,可以通过直接访问这个目录来获取系统信息。(不用管)
  • /root:系统管理员,也称作超级权限者的用户主目录。
  • /sbin:s 就是 super user 的意思,这里存放的是系统管理员使用的系统管理程序。
  • /srv:服务启动之后需要提取的数据。
  • /sys:这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs。
  • /tmp:用来存放临时文件。
  • /usr:用户的应用程序和文件都放在这个目录下,类似于 Windows 下的 program files 目录。
    • /bin: 系统用户使用的应用程序。
    • /sbin: 超级用户使用的比较高级的管理程序和系统守护程序。
    • /src: 内核源代码默认的放置目录。
  • /var:存放着在不断扩充着的东西,一般将那些经常被修改的目录放在这个目录下。包括各种日志文件。
  • /run:一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
  • /www: 存放服务器网站相关的资源,环境,网站的项目

常用命令概述

  • ls 显示文件或目录
    • -l 列出文件详细信息l(list)
    • -a 列出当前目录下所有文件及目录,包括隐藏的a(all)
    • -h 优化打印文件的尺寸大小
  • mkdir 创建目录
  • -p 创建目录,若无父目录,则创建p(parent)
  • cd 切换目录
    • cd .. 返回上一级目录
    • cd ../.. 返回上两级目录
    • cd - 返回上次所在的目录
  • touch 创建空文件
  • echo 创建带有内容的文件。
  • cat 查看文件内容
  • cp 拷贝
  • mv 移动或重命名
  • rm 删除文件
    • -r 递归删除,可删除子目录及文件
    • -f 强制删除
  • find 在文件系统中搜索某文件
  • wc 统计文本中行数、字数、字符数
  • grep 在文本文件中查找某个字符串
  • rmdir 删除空目录
  • tree 树形结构显示目录,需要安装tree包
  • pwd 显示当前目录
  • ln 创建链接文件
  • more、less 分页显示文本文件内容
  • head、tail 显示文件头、尾内容
  • ctrl+alt+F1 命令行全屏模式
  • shutdowm 关机指令,你可以man shutdown 来看一下帮助文档。
    • -h hours:minutes & 按预定时间关闭系统,poweroff
    • -r 重启, shutdown -r now 等同于 reboot
    • -c 取消按预定时间关闭系统
  • sync 数据由内存同步到硬盘
  • logout 注销
  • tail 显示尾部几行 -n控制行数
  • history 查看已执行过得历史命令

服务器指令(雾

  • tail -f xxxx.log 实时刷新
  • nohup 命令 > 文件名.log 2>&1 &
  • 代理网址 https://ghproxy.com/

vim常用命令

一般模式

语法 功能描述
yy 复制当前行
(数字n) yy 复制一段(当前行到后n行)
(数字n) p 粘贴n次
(数字n) dd 删除n行
u 撤销上次操作
y$ 光标位置复制到行结尾
y^ 光标位置复制到行开头
d$ 光标位置删除到行结尾
d^ 光标位置删除到行开头
yw 复制一个单词(光标位置到单词结束)
dw 删除一个单词(光标位置到单词结束)
x 向后剪切,相当于del
shift + x (X) 向前剪切,相当于BackSpace
gg / shift + h (H) 移动到页首
shift + g (G) / L 移动到页尾
(数字n) gg / G 移动到第n行
r 替换
shift + r (R) 多字符替换,相当于Insert
w 下个词的开头
e 下个词的词尾
b 上个词的开头

编辑模式

按键 功能
i 当前光标前
a 当前光标后
I 光标所在行最前
A 光标所在行最后
o 光标所在行下一行
O 光标所在行上一行

指令模式

在一般模式当中,输入『 : / ?』3个中的任何一个按钮,就可以将光标移动到最底下那一行。

命令 功能
:w 保存
:q 退出
:! 强制执行
/要查找的词 n 查找下一个,N 往上查找
:noh 取消高亮显示
:set nu 显示行号
:set nonu 关闭行号
:s/old/new 替换一行中的第一个匹配项
:%s/old/new/g 替换内容,%全文匹配,/g全部替换

vi,vim键盘图

网络配置

/etc/sysconfig/network-scripts/ifcfg-ens33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2e071f7c-84ad-488d-81f8-d76204e6768e"
DEVICE="ens33"
ONBOOT="yes"
#ip地址
IPADDR=192.168.129.100
#网关
GATEWAY=192.168.129.2
#域名解析器
DNS1=192.168.129.2

执行service network restart 重启网络

系统管理

Service服务管理

systemct l start | stop | restart | status 服务名

常用基本命令详解

bash全名 : bourne again shell

帮助命令

man 文档查看

语法:man 命令或配置文件

​ 使用 pgup 或 pgdn 翻页

help 获取shell内置命令的帮助信息

​ 一部分基础功能的系统命令是直接内嵌在shell中的,系统加载启动之后会随着shell一
起加载,常驻系统内存中。这部分命令被称为“内置(built-in) 命令”;相应的其它命令被
称为“外部命令”。

语法:help 命令

目录文档类

ls 列出目录的内容

语法:ls [选项] 目录或是文件

  • -a 列举全部文件及目录,包括隐藏文件(all)
  • -l 长数据串列举, 包含文件的属性与权限等数据,ll 等同于ls -l(可用alias查看)

​ 每行列出的信息依次是:文件类型与权限 链接数 文件属主 文件属组 文件大小用byte来表示 建立或最近修改的时间 名字

  • 当为[ d ]则是目录

  • 当为[ - ]则是文件;

  • 若是[ l ]则表示为链接文档 ( link file );

  • 若是[ b ]则表示为装置文件里面的可供储存的接口设备 ( 可随机存取装置 );

  • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标 ( 一次性读取装置 )

cd 切换目录

语法:cd 目录名 (绝对路径都是以 / 开头,相对路径,对于当前目录改如何寻找 ./../)

  • .. 返回当前目录的上一级菜单
  • . 当前目录
  • - 返回上一次的目录

mkdir 创建文件夹

语法:mkdir [-mp] 目录名称

  • -m :配置文件的权限。直接配置,不需要考虑默认权限(umask)。
  • -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来。

rmdir 删除文件夹

​ rmdir 仅能删除空的目录,如果下面存在文件,需要先删除文件,递归删除多个目录-p参数即可

touch/vim 创建空文件

语法:touch 文件名称

vi / vim 编辑文件

语法:vim 输出内容

cp 复制文件或目录

语法:cp [-r] 来源(source) 目标(destination)

  • -r 递归复制整个文件夹

rm 删除文件或目录

语法:rm [-i] deleteFile

  • -r 递归删除目录中的所有内容
  • -f 强制执行删除操作,不需要提示
  • -v 显示指令的详细执行过程

mv 移动文件或者目录(重命名)

​ mv oldNameFile newNameFile

​ mv /movefile /targetFolder

cat 查看文件内容

​ 查看文件内容(小文件),从第一行开始显示

​ 语法:cat [选项] 要查看的文件

  • -n 显示所有的行号,包括空行

more 文件内容分屏查看

语法:more 要查看的文件

操作 功能说明
space 向下翻页
enter 向下换行
q 退出more模式
ctrl+f 向下滚动一屏
ctrl+b 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号

less 文件内容分屏查看

​ less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强
大,支持各种显示终端。less 指令在显示文件内容时,并不是- -次将整个文件加载之后才显
示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

语法:less 要查看的文件

操作 功能说明
space 向下翻页(基本操作同上)
pagedown 向下翻页
pageup 向上翻页
/字串 向下搜寻「字串」的功能:n:向下查找; N:向上查找
?字串 向上搜寻「字串」的功能:n:向下查找; N:向上查找
g 跳转到文档头
shift+g 跳转到文档尾

echo 输出内容到控制台

​ echo [选项] 输出内容

  • -e 支持反斜线控制的字符转换

head 显示文件头部内容

​ head 用于显示文件开头部分内容,默认情况下显示文件前10行内容。

语法:head [选项] 文件

  • -n <行数> 查看n行的文件内容

tail 输出文件尾部内容(追踪日志)

​ tail用于输出文件中尾部的内容,默认情况下线束文件的后10行内容。(tail -f跟踪的是文件的索引号,用vim改完后索引号也会改变,就导致tail跟踪不到)

语法:tail [选项] 文件

  • -n <行数> 查看n行的文件内容
  • -f 实时追踪文档的所有更新
  • ctrl+s 暂停
  • ctrl+q 结束暂停

history 查看已执行过得历史命令

​ 语法:history [选项] 行数

  • -c 清除历史记录
  • !<行数> 执行历史n行的指令

> 输出重定向和 >> 追加

语法:

ls -l > 文件 (覆写文件)

ls -al >> 文件 (追加到文件末尾)

​ echo 语句 >> 文件

用户管理类

1 useradd 添加新用户

useradd 用户名 添加新用户

useradd -g 组名 用户名 添加新用户到某个组

2 passwd 设置用户密码

passwd 用户名 设置用户密码

搜索查找类

1 find 查找文件或者目录

​ 从指定目录向下递归遍历其子目录,将满足条件的文件显示在终端。

语法:find [搜索范围] [选项] (默认从当前文件夹开始)

  • -name <查询方式> 按照指定的文件名查找模式来查找文件
  • -user <用户名> 查找属于指定用户名的所有文件
  • -size <(+/-)文件大小> 按照指定的文件大小查找文件,单位为:
    • b——块(512字节)
    • c——字节
    • w——字(2字节)
    • k——千字节
    • M——兆字节
    • G——吉字节

2 locate 快速定位文件路径

​ Locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻。

语法:

  1. locate 搜索文件

  2. updatedb 更新locate数据库

  3. which/whereis 定位命令

3 grep 过滤查找及“|”管道符号

语法:

​ 1. grep [选项] [查找内容] [源文件]

  • -n 显示匹配行和行号

​ 2. cat [文件] | grep -n [关键字]

3. grep [内容] | wc [文件]  统计字符数(wordcount)

压缩解压类

1 gzip/gunzip 压缩

语法:

1. gzip [文件名]   压缩文件,只能将文件压缩成*.gz文件
2. gunzip [文件名.gz]   解压缩文件

注意事项:

​ 1. 只能压缩文件不能压缩目录

​ 2. 不保留原来的文件

​ 3. 同时多个文件会产生多个安装包

2 zip/unzip 压缩

​ zip压缩命令在windows/linux都通用, 可以压缩目录且保留源文件。

语法:

  1. zip [选项] [文件名.zip] [将要压缩的内容] 压缩文件和目录
    • -r 压缩目录
  2. unzip [选项] [文件名.zip] 解压缩
    • -d <目录> 指定解压后文件的存放目录

3 tar 打包

语法:tar [选项] [xxx.tar.gz] [打包的内容] 打包目录

常用: -zcvf(压缩) / -zxvf(解压)

  • -c 产生.tar打包文件
  • -v 显示详细信息
  • -f 指定压缩后的文件名
  • -z 打包同时压缩
  • -x 解包.tar文件
  • -C 解压到指定目录

磁盘查看和分区类

du 查看文件和目录占用的磁盘空间

这是一篇博客

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment