230625review-后端er的Linux-Ubuntu初体验


VMware虚拟机Nat模式无法联网解决方式

背景:使用mumu模拟器时禁用了hyper-v,之后虚拟机出现连不上网的情况
初步调查发现VMwareWorkStationServer服务消失
解决过程:

  1. 重置网络:编辑→虚拟网络编辑器→还原默认设置(无效)
  2. VMware修复:右键VMwareWorkStation选择更改→修复(无效)
  3. VMware重装:卸载VMware后重装(无效)
  4. 重装虚拟机:彻底删除Ubuntu虚拟机后重新安装并初始化
    建立新的虚拟机后网络问题解决。

Linux服务端开发工作流和环境搭建

工作流:

开发环境:neovim
版本控制:git
测试工具:待选

环境搭建:

数据库:mySQL和postgreSQL

同时使用两种数据库
使用mySQL存储结构化数据和频繁查询的数据
使用postgreSQL存储非结构化数据和频繁更新的数据

mySQL开发环境配置
sudo apt-get update
sudo apt-get install mysql-server #安装服务端
sudo apt-get install mysql-client #安装客户端
sudo apt-get install libmysqlcppconn-dev #安装开发套件

调用时包含下列头文件

#include <iostream>
#include <cppconn/driver.h>
#include <cppconn/connection.h>
#include <cppconn/statement.h>
#include <cppconn/resultset.h>

编译时遇到链接库问题:
按照下列指令编译时
g++ -o test test.cpp -I/usr/include/mysql-cppconn-8 -L/usr/lib/x86_64-linux-gnu -lmysqlcppconn8
g++输出报错信息说明没有找到指定的链接库

解决方法:
使用下列参数进行编译
sudo g++ -I/usr/include/cppconn -o test test.cpp -L usr/Lib -lmysqlcppconn

postgreSQL开发环境配置
sudo apt-get update
sudo apt-get install postgresql

创建用户和数据库

CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE mydatabase;
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;

调用时包含下列头文件

#include <iostream>
#include <pqxx/pqxx>

编译选项

g++ -o program program.cpp -lpqxx -lpq
网络库:libevent

环境配置

sudo apt-get update
sudo apt-get install libevent-dev

编译选项

g++ -o my_program my_program.cpp -levent

定时器示例

#include <stdio.h>
#include <stdlib.h>
#include <event2/event.h>
// 定义回调函数
static void timer_cb(evutil_socket_t fd, short event, void *arg)
{
    printf("Hello, world!\n");
    struct timeval tv;
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    // 重新添加定时器
    event_add((struct event *)arg, &tv);
}
int main(int argc, char *argv[])
{
    struct event_base *base;
    struct event *timer_event;
    struct timeval tv;
    // 初始化 libevent
    base = event_base_new();
    if (!base) {
        perror("event_base_new()");
        return -1;
    }
    // 创建定时器事件
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    timer_event = event_new(base, -1, EV_PERSIST, timer_cb, event_self_cbarg());
    if (!timer_event) {
        perror("event_new()");
        return -1;
    }
    // 添加定时器事件
    event_add(timer_event, &tv);
    // 进入事件循环
    event_base_dispatch(base);
    // 释放资源
    event_free(timer_event);
    event_base_free(base);
    return 0;
}

vim速查表

光标移动

注:一般模式下,任意一个动作都可以重复。

h # 光标左移,同
j # 光标下移,同
k # 光标上移,同
l # 光标右移,同
Ctrl+e # 向上滚动一行
Ctrl+y # 向下滚动一行
Ctrl+u # 向上滚动半屏 –> Move up 1/2 a screen
Ctrl+d # 向下滚动半屏 –> Move down 1/2 a screen
Ctrl+f # 向下滚动一屏 –> Move forward one full screen
Ctrl+b # 向上滚动一屏 –> Move back one full screen
0 # 跳到行首,数字 0,效用等同于
^ # 跳到从行首开始第一个非空白字符
$ # 跳到行尾,效用等同于
gg # 跳到第一行,效用等同于 Ctrl+
G # 跳到最后一行,效用等同于 Ctrl+
nG # 跳到第 n 行,比如 10G 是移动到第十行
:n # 跳到第 n 行,比如 :10 是移动到第十行
10% # 移动到文件 10% 处
15| # 移动到当前行的 15 列
w # 跳到下一个单词开头(word:标点或空格分隔的单词)
W # 跳到下一个单词开头(Word:空格分隔的单词)
e # 跳到下一个单词尾部(word:标点或空格分隔的单词)
E # 跳到下一个单词尾部(Word:空格分隔的单词)
b # 跳到上一个单词开头(word:标点或空格分隔的单词)
B # 跳到上一个单词开头(Word:空格分隔的单词)
ge # 跳到前一个单词结尾
) # 向前移动一个句子(句号分隔)
( # 向后移动一个句子(句号分隔)
} # 向前移动一个段落(空行分隔)
{ # 向后移动一个段落(空行分隔)
# 移动到下一行首个非空字符
n # 光标向下移动 n 行

  •               # 移动到下一行首个非空字符(同回车键)
    
  •               # 移动到上一行首个非空字符
    

H # 移动到屏幕上部
M # 移动到屏幕中部
L # 移动到屏幕下部
<S+Left> # 按住 Shift 按左键,向左移动一个单词
<S+Right> # 按住 Shift 按右键,向右移动一个单词
<S+Up> # 按住 Shift 按上键,向上翻页
<S+Down> # 按住 Shift 按下键,向下翻页
gm # 移动到行中
gj # 光标向下移动一个屏幕行(忽略自动换行)
gk # 光标向上移动一个屏幕行(忽略自动换行)
zz # 调整光标所在行到屏幕中央
zt # 调整光标所在行到屏幕上部
zb # 调整光标所在行到屏幕下部

插入模式

i # 在光标处进入插入模式
I # 在行首进入插入模式
a # 在光标后进入插入模式
A # 在行尾进入插入模式
o # 在下一行插入新行并进入插入模式
O # 在上一行插入新行并进入插入模式
gi # 进入到上一次插入模式的位置
# 退出插入模式
Ctrl+[ # 退出插入模式(等价于 Esc 键)

插入模式的命令

注:由 i, I, a, A, o, O 等命令进入插入模式。

# 光标向上移动
# 光标向下移动
# 光标向左移动
# 光标向右移动
<S+Left> # 按住 Shift 按左键,向左移动一个单词
<S+Right> # 按住 Shift 按右键,向右移动一个单词
<S+Up> # 按住 Shift 按上键,向上翻页
<S+Down> # 按住 Shift 按下键,向下翻页
# 上翻页
# 下翻页
# 删除光标处字符
# Backspace 向后删除字符
# 光标跳转行首
# 光标跳转行尾
Ctrl+d # 减少缩进
Ctrl+f # 减少缩进
Ctrl+t # 增加缩进
Ctrl+h # 删除前一个字符,相当于回格键 Backspace
Ctrl+o # 临时退出插入模式,执行单条命令又返回插入模式
Ctrl+u # 当前行删除到行首所有字符
Ctrl+w # 删除光标前的一个单词
Ctrl+\ Ctrl+O # 临时退出插入模式(光标保持),执行单条命令又返回插入模式
Ctrl+R 0 # 插入寄存器(内部 0 号剪贴板)内容,Ctrl+R 后可跟寄存器名
Ctrl+R “ # 插入匿名寄存器内容,相当于插入模式下 p 粘贴
Ctrl+R = # 插入表达式计算结果,等号后面跟表达式
Ctrl+R : # 插入上一次命令行命令
Ctrl+R / # 插入上一次搜索的关键字
Ctrl+v {char} # 插入非数字的字面量
Ctrl+v {code} # 插入用三位数字表示的 ASCII/Unicode 字符编码,如 Ctrl+v 065
Ctrl+v 065 # 插入 10 进制 ASCII 字符(两数字) 065 即 A 字符
Ctrl+v x41 # 插入 16 进制 ASCII 字符(三数字) x41 即 A 字符
Ctrl+v o101 # 插入 8 进制 ASCII 字符(三数字) o101 即 A 字符
Ctrl+v u1234 # 插入 16 进制 Unicode 字符(四数字)
Ctrl+v U12345678 # 插入 16 进制 Unicode 字符(八数字)
Ctrl+K {ch1} {ch2} # 插入 digraph(见 :h digraph),快速输入日文或符号等

自动补全

在插入模式下,最常用的补全

Ctrl+n # 插入模式下文字自动补全
Ctrl+P # 插入模式下文字自动补全
Ctrl+e # 有补全列表时,终止这次补全,继续输入

智能补全

Ctrl+X # 进入补全模式
Ctrl+X Ctrl+L # 整行补全
Ctrl+X Ctrl+N # 插入模式下,根据当前文件里关键字补全
Ctrl+X Ctrl+K # 根据字典补全
Ctrl+X Ctrl+T # 根据同义词字典补全
Ctrl+X Ctrl+F # 插入模式下补全文件名
Ctrl+X Ctrl+I # 根据头文件内关键字补全
Ctrl+X Ctrl+] # 根据标签补全
Ctrl+X Ctrl+D # 补全宏定义
Ctrl+X Ctrl+V # 补全 Vim 命令
Ctrl+X Ctrl+U # 用户自定义补全方式
Ctrl+X Ctrl+S # 拼写建议,例如:一个英文单词
Ctrl+X Ctrl+O # 插入下 Omnifunc 补全

文本编辑

r # 替换当前字符
R # 进入替换模式,直至 Esc 离开
s # 替换字符(删除光标处字符,并进入插入模式,前可接数量)
S # 替换行(删除当前行,并进入插入模式,前可接数量)
cc # 改写当前行(删除当前行并进入插入模式),同 S
cw # 改写光标开始处的当前单词
ciw # 改写光标所处的单词
caw # 改写光标所处的单词,并且包括前后空格(如果有的话)
c0 # 改写到行首
c^ # 改写到行首(第一个非零字符)
c$ # 改写到行末
C # 改写到行尾(同 c$)
ci” # 改写双引号中的内容
ci’ # 改写单引号中的内容
cib # 改写小括号中的内容
cab # 改写小括号中的内容(包含小括号本身)
ci) # 改写小括号中的内容
ci] # 改写中括号中内容
ciB # 改写大括号中内容
caB # 改写大括号中的内容(包含大括号本身)
ci} # 改写大括号中内容
cit # 改写 XML tag 中的内容
cis # 改写当前句子
c2w # 改写下两个单词
ct( # 改写到小括号前
x # 删除当前字符,前面可以接数字,3x 代表删除三个字符
X # 向前删除字符
dd # 删除(剪切)当前行,并把删除的行存到剪贴板里 –> Delete (cut) a line
d0 # 删除(剪切)到行首
d^ # 删除(剪切)到行首(第一个非零字符)
d$ # 删除(剪切)到行末
D # 删除(剪切)到行末(同 d$)
dw # 删除(剪切)当前单词
diw # 删除(剪切)光标所处的单词
daw # 删除(剪切)光标所处的单词,并包含前后空格(如果有的话)
di” # 删除双引号中的内容
di’ # 删除单引号中的内容
dib # 删除小括号中的内容
di) # 删除小括号中的内容
dab # 删除小括号内的内容(包含小括号本身)
di] # 删除中括号中内容
diB # 删除大括号中内容
di} # 删除大括号中内容
daB # 删除大括号内的内容(包含大括号本身)
dit # 删除 XML 中 tag 中的内容
dis # 删除当前句子
d2w # 删除下两个单词
dt( # 删除到小括号前
dgg # 删除到文件头部
dG # 删除到文件尾部
d} # 删除下一段
d{ # 删除上一段
10d # 删除当前行开始的 10 行
:10d # 删除第 10 行
:1,10d # 删除 1-10 行
J # 链接多行为一行
. # 重复上一次操作
~ # 替换大小写
g~iw # 替换当前单词的大小写
gUiw # 将单词转成大写
guiw # 将当前单词转成小写
guu # 全行转为小写
gUU # 全行转为大写
<< # 减少缩进

             # 增加缩进

== # 自动缩进
Ctrl+A # 增加数字
Ctrl+X # 减少数字

Linux基本命令速查表

一、文件相关操作

1、创建和查看文件夹

1)ls命令,查看文件夹下的内容,语法:ls [-参数] [路径]

参数列表:

  • a:显示所有文件和目录
  • l:显示文件和目录的详细信息
  • d:只显示目录
  • R:递归显示所有子目录和文件

示例:ls -l /root/

2)cd 命令,用于切换 当前工作目录,语法:cd [路径名]

特殊路径:~表示登录用户的home,. 表示当前路径,.. 表示上级路径

3)mkdir 创建文件夹 ,语法:mkdir -p [路径,多个路径用空格分开]

参数-p 的作用,是如果路径不存在则进行创建。没有此参数时,创建重复路径会报错。

2、修改文件夹

1)mv 命令可以移动文件夹,语法:mv [-参数] 源文件或文件夹,多个源空格分开 目标文件或文件夹 。

参数说明:

  • i:文件重名时,是否询问
  • b:文件重名时覆盖,并且对被覆盖的文件进行备份

2)cp 命令,复制文件,语法和mv相似。

3)rm 命令,删除文件,语法:rm [-参数] [删除的路径,多个路径空格分开]

参数:

  • r:递归删除
  • f:只读的文档也删除
3、查找文件

find 命令,可以查找某个路径下的文件,语法:find [查找的路径] [查找匹配表达式] 。

查找匹配表达式,用来匹配特定的文件,例如名称为XX的文件等等。

该命令会遍历路径下所有子文件进行查找。

4、文件压缩

常用tar 和gaip 命令。

5、文件差异

使用diff 命令

6、grep 查找字符,可以在某个文件,或者上一步输出的内容中进行查找。

语法:grep [-参数] 正则表达式 [文件] 。

其中,正则表达式部分,可以是一个字符串,也可以是正则表达式,用于文本查找。

参数部分,常用参数如下:

  • i:忽略匹配的大小写
  • n:显示匹配行号
  • c:计算符合的列数

一个典型的应用场景,就是在进程信息中进行查找,例如:

# 列出所有进程
ps -aux
# 但是我们想要查看python相关进程,或者nodejs相关进程,就需要对输出进行文本过滤
ps -aux | grep node

####二、网络管理

1、ip信息

ipconfig ,用于显示网络信息,还能配置某个网卡的信息 。

1)运行ipconfig

查看当前设备的网卡信息

2)网卡操作:ipconfig 网卡名 [操作名] [操作参数]

2、ping 命令,用于测试链接

3、netstat 用于显示网络状态,语法:netstat [-参数]

一些重要的参数:

  • a:显示所有的socket连接
  • p:使用socket的程序信息
  • t:使用tcp的连接状态
  • u:使用udp的连接状态

三、进程管理

1、ps 显示所有进程:ps [参数]

由于参数较多,其常使用的固定搭配ps -aux 用于列出所有的进程,参数列表:

  • A,e:显示所有进程
  • a:显示一个终端的所有进程
  • u:显示进程的归属用户,以及内存使用情况
  • x:显示没有终端进行控制的进程
  • l:显示详细信息

2、kill 命令终止进程,语法:kill 进程号

3、nohup 退出终端后仍然运行命令,语法:nohup 命令 [-参数] & 。


Author: morphotherain
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source morphotherain !
  TOC