正在加载今日诗词....

linux常用工具命令速查

linux常用工具总述

原文链接在此

  1. mv、cp、wc
    1. 目录操作
  2. grep
    1. 基础知识
  1. sed
  2. awk
  3. find
    1. 常用实例
      1. 普通查找与匹配
      2. 按文件类型匹配
      3. 按时间查找
      4. 按大小查找
      5. 删除匹配文件
      6. 按照权限查找
      7. 借助-exec与其他命令连用
      8. -exec后接多行命令
      9. 跳过(排除)指定目录搜索
    2. find其他技巧收集
    3. 详细语法
  4. zsh
    1. 配置
      1. oh-my-zsh
      2. zsh-autosuggestions
  5. head
    1. 查看指定多行
  6. sort
    1. 基础
    2. 按照指定列排序
  7. uniq
  8. clash
  9. ssh
    1. ssh远程转发(反向代理)
    2. 配置无响应断连的时长
      1. 方案1,修改ssgd_config
      2. 方案2,修改profile,设置TMOUT
  10. tar
    1. 压缩
    2. 解压
  11. samba配置
  12. windows
    1. chocolately包管理器
  13. linux
    1. 关机
    2. ctrl+z
    3. apt
      1. 查看已安装软件
      2. 卸载软件
    4. dpkg
      1. 查看已安装软件
      2. 查看软件安装路径
    5. ubuntu18.04更换清华源
    6. ln 软硬链接
      1. 硬链接
      2. 软连接
      3. 软硬链接的区别
  14. gcc
  15. gdb
  16. shell
  17. SpaceVim
  18. VIM
    1. vim + grep 过滤文件内容
      1. 保留指定内容
      2. 保留多个指定内容的行
      3. 反向过滤,不要指定内容的行
    2. 将其他程序的输出导入vim
    3. 模式匹配相关
      1. 大小写
      2. 正则相关
      3. 界定符 “< >”
    4. 使用括号匹配
    5. vimc常用命令
    6. 安装
      1. ⭐Carl的VIM安装
      2. 针对vim低于8版本的安装
        1. 安装vim9
        2. 安装neovim
      3. zr_nvim及插件安装
    7. nvim中调用shell命令
    8. nvim配置
    9. 在多行开头和结尾添加
  19. tmux
  20. Makefile
    1. 自制模板V1.2
      1.
    2. 正点原子模板
    3. 报错.deps是一个文件
  21. git
    1. 远程仓库
    2. 本地仓库关联远程分支
    3. 将本地文件git push到远程新建仓库
    4. 撤销git add的文件
  22. gitigonre不起作用的问题
  23. sed
    1. sed中特殊符号
    2. 提取标签并计算不重复标签数
  24. vscode
    1. vscode创建工作区
  25. uboot
    1. uboot查看mmc(SD)是否正常
  26. tree
    1. windows10下列出所有目录下文件

基础命令,但仅日常使用到的在此总结,以作查阅;

简介:对于使用过的命令以及应对场景进行总结,主要以linux下基础命令为主,归档以供随时查阅;

Version

  • 20230804 V1.0:初稿

mv、cp、wc

目录操作

1
$ mv /dir_old /dir_new
  • -f 强制覆盖

$ cp -rp -p会保持原权限、属性、时间戳等;

$ wc -l 统计行数

grep

基础知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在file中查找内容
$ grep aaa file
## -v 反向搜索
$ grep -v t file
## -n 加行号
$ grep -n t file
## -c 打印匹配个数
$ grep -c t file
## -e 指定多个匹配项,一次查找多个匹配性
$ grep -e 14 -e 23 -e 29 -e 33 -e 35 file
## -i 忽略大小写
$ grep -i
## --color=auto 颜色显示

# 可使用正则
$ grep [tf] file
... ...

# 其它
$ grep -a # 将binary以text方式搜索

sed

awk

find

常用实例

### 普通查找与匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 查找以.txt结尾的文件
find /home -name "*.txt"
## 查找以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
find . -name "*.txt" -o -name "*.pdf"
## 匹配文件路径或者文件
find /usr/ -path "*local*"

## 基于正则匹配
find . -regex ".*\(\.txt\|\.pdf\)$"
## 同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"

# 否定
## 找出不是以.txt结尾的文件
find /home ! -name "*.txt"

按文件类型匹配

  • f 普通文件
  • l 符号链接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p fifo
1
2
3
# 按文件类型匹配
## 搜索向下深度为2的所有普通文件
find . -mindepth 2 -type f

按时间查找

linux文件系统每个文件都有三种时间戳:

  • 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
  • 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
1
2
3
4
5
6
7
8
9
## 搜索最近7天内被访问过的所有文件
find . -type f -atime -7
## 搜索恰好在7天前被访问过的文件
find . -type f -atime 7
## 搜索最近7天外被访问过的所有文件
find . -type f -atime +7

## 搜索比file.log修改时间更长的文件
find . -type f -newer file.log

按大小查找

  • b —— 块(512字节)
  • c —— 字节
  • w—— 字(2字节)
  • k —— 千字节
  • M —— 兆字节
  • G —— 吉字节
1
2
3
4
## 搜索 大于/小于/等于 10k的文件
find . -type f -size +10k
find . -type f -size -10k
find . -type f -size 10k

删除匹配文件

1
find . -type f -name "*.txt" -delete

按照权限查找

1
2
3
4
5
6
7
8
## 找出权限为777的文件
find . -type f -perm 777

## 找出权限不是644的.php文件
find . -type f -name "*.php" ! -perm 644

## 找出当前目录用户组zhai拥有的文件
find . -type f -group zhai

借助-exec与其他命令连用

1
2
3
4
5
6
7
8
9
10
11
12
## 找出当前目录下所有root的文件,并把所有权更改为用户tom
find .-type f -user root -exec chown tom {} \;
# 上例中,**{}** 用于与**-exec**选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
## 找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} \;
# 上例中,**-ok**和**-exec**行为一样,不过它会给出提示,是否执行相应的操作。
## 查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
## 将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
## 找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

-exec后接多行命令

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令

1
-exec ./text.sh {} \;

跳过(排除)指定目录搜索

1
2
## 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print

find其他技巧收集

1
2
## 要列出所有长度为零的文件
find . -empty

详细语法

查找目录:find /(查找范围) -name ‘查找关键字’ -type d

查找文件:find /(查找范围) -name 查找关键字 -print

find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法find <选项> <参数>

zsh

``$ chsh -s /bin/zsh` 命令将 zsh 设置为系统默认 shell

配置

oh-my-zsh

使用 wget 下载脚本并安装:

1
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

然后同意使用 Oh-my-zsh 的配置模板覆盖已有的 .zshrc

zsh-autosuggestions

安装步骤:

  1. 把插件下载到本地的 ~/.oh-my-zsh/custom/plugins 目录:
1
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
  1. .zshrc 中,把 zsh-autosuggestions 加入插件列表:
1
2
3
4
plugins=(
# other plugins...
zsh-autosuggestions # 插件之间使用空格隔开
)

head

查看指定多行

1
$ head -n 1000

#sort

基础

1
2
3
4
5
6
7
8
9
10
[root@www ~]# sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空白字元部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用‘纯数字’进行排序(预设是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的资料中,仅出现一行代表;
-t :分隔符号,预设是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思

按照指定列排序

$ sort -nk 3 #按照第 3 列排序

uniq

1
2
3
4
[root@www ~]# uniq [-ic]
选项与参数:
-i :忽略大小写字元的不同;
-c :进行计数

#clash

在linux下使用clash

(1)下载clash-for-linux

1
$ git clone https://github.com/wanhebin/clash-for-linux.git

修改start.sh中URL为订阅地址;

(2)启动程序

直接运行脚本start.sh,会打印以下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sh start.sh
Clash订阅地址可访问! [ OK ]
配置文件config.yaml下载成功! [ OK ]
服务启动成功! [ OK ]

Clash Dashboard 访问地址:http://IP:9090/ui
Secret:xxxxxxxxxxxxx

请执行以下命令加载环境变量: source /etc/profile.d/clash.sh

请执行以下命令开启系统代理: proxy_on

若要临时关闭系统代理,请执行: proxy_off

使用命令行登录:

1
2
3
4
# $  curl http://192.168.10.29:9090/ui -H "Authentication: b&ZlKTte5OnEt2Sn"
$ curl http://192.168.1.123:9090/ui -H "Authentication: b&ZlKTte5OnEt2Sn"
$ source /etc/profile.d/clash.sh
$ proxy_on

(3)检查是否打开

检查服务端口

1
2
3
4
5
$ netstat -tln | grep -E '9090|789.'
tcp 0 0 127.0.0.1:9090 0.0.0.0:* LISTEN
tcp6 0 0 :::7890 :::* LISTEN
tcp6 0 0 :::7891 :::* LISTEN
tcp6 0 0 :::7892 :::* LISTEN

检查环境变量:

1
2
3
$ env | grep -E 'http_proxy|https_proxy'
http_proxy=http://127.0.0.1:7890
https_proxy=http://127.0.0.1:7890

如果上述信息正常,表示启动成功。

(4)停止程序

1
2
$ cd clash-for-linux
$ ./shutdown.sh

然后关闭系统代理:

1
$ proxy_off

再次检查程序端口、进程以及环境变量,都没有的话表示服务正常关闭。

ssh

ssh远程转发(反向代理)

(105条消息) 利用阿里云虚拟机作为跳板机实现内网穿透_阿里云跳板机_coderduck的博客-CSDN博客

使用ipad通过云主机huiweiyun跳转连接到办公室主机deepin上;

云主机上的操作:

如果需要用20022端口做转发,则需要把改端口开放

以下操作在办公室电脑上完成:

(1)ssh使用密匙登录云主机(实现免密登录)

1
2
3
4
### 1. 生成ssh密匙 
$ ssh-keygen
### 2. 上传到远程主机的authorized_keys文件上
$ ssh-copy-id zhai@<huaweiyun_ip>

(2)设置办公室主机ssh监视端口,以允许任意端口可以监视ssh端口

1
2
3
4
5
6
7
8
### 1.修改配置文件
$ sudo vim /etc/ssh/sshd_config
# 然后找到“#GatewayPorts no”,取消注释并把no改为yes

### 2.重启sshd服务
$ sudo systemctl restart sshd
#或者
$ sudo service sshd restart

(3)安装autossh(主要是有一个掉线自连的功能)

1
$ sudo apt-get install autossh

(4)开启autossh

此操作将云主机的20023端口作为转发端口,外界如ipad ssh连接到20023端口后,所有与此端口的交互都会被转发到实验室主机的22端口(ssh端口),以此实现内网穿透;

1
$ autossh -p 22 -M 1234 -fCNR 20023:localhost:22 zhai@<huaweiyun_ip>

参数介绍:

  • -p 指定远程连接到的ssh端口(如果是22可省略,因为22是ssh默认端口号)
  • -M “port” 指定端口,用于监听该ssh转发服务;如果该服务异常关闭会自动重启;
  • -f 后台运行
  • -N 不执行远程命令
  • -R 将云主机20023端口的内容转发到localhost的22端口

(5)可选,设置autossh开机自启

如果不设置此项,可手动执行步骤(4)中的指令启动;(个人未设置)

1
2
3
4
### 修改一个开机执行的脚本,将启动命令加进去
$ sudo vim /etc/rc.local
### 添加以下命令
$ su -c 'autossh -p 22 -M 1234 -fCNR 20023:localhost:22 zhai@<huaweiyun_ip>' <本地用户> &

进行访问

在任何一台支持ssh的主机上输入命令:

1
$ ssh <实验室主机用户名>@<huaweiyun_ip> -p 20023

注意连接密码是实验室主机上的用户密码。

配置无响应断连的时长

方案1,修改ssgd_config
1
2
3
4
5
$ vim /etc/ssh/sshd_config 
#ClientAliveInterval 0 #服务器向客户端发送请求消息的时间间隔,默认为0,不发送
#ClientAliveCountMax 3 #服务器发出求后客户端没有响应的最大次数,超过后将自动断开。
ClientAliveInterval 60 #每60秒发送一个KeepAlive请求
ClientAliveCountMax 15 #总时间为:15*60 ,15分钟没有操作,终端断开。

重启: #重启ssh服务,或用service sshd restart

方案2,修改profile,设置TMOUT
1
2
3
$ vim /etc/profile
export TMOUT=1200 #单位秒 ,在文件末尾添加
$ source /etc/profile #reload配置文件

tar

压缩

  • tar –cvf jpg.tar *.jpg 将目录里所有jpg文件打包成tar.jpg
  • tar –czf jpg.tar.gz *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
  • tar –cjf jpg.tar.bz2 *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
  • tar –cZf jpg.tar.Z *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
  • rar a jpg.rar *.jpg rar格式的压缩,需要先下载rar for linux
  • zip jpg.zip *.jpg zip格式的压缩,需要先下载zip for linux

解压

  • tar –xvf file.tar 解压 tar包
  • tar -xzvf file.tar.gz 解压tar.gz
  • tar -xjvf file.tar.bz2 解压 tar.bz2
  • tar –xZvf file.tar.Z 解压tar.Z
  • unrar e file.rar 解压rar
  • unzip file.zip 解压zip

.bz2
  解压1:bzip2 -d FileName.bz2
  解压2:bunzip2 FileName.bz2
  压缩: bzip2 -z FileName

.tar.bz2
  解压:tar jxvf FileName.tar.bz2 或 tar –bzip xvf FileName.tar.bz2
  压缩:tar jcvf FileName.tar.bz2 DirName

samba配置

注:在deepin系统上配置(大同小异)

  1. 编辑配置文件: sudo nvim /etc/samba/smb.conf
  2. 将linux用户添加到可使用samba的名单中:sudo smbpasswd zhai ,然后会要求输出密码(独立的远程访问密码,可与sudo密码不一致)
  3. 添加配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[zhai_workspace]	# 用win连接时会显示的远程文件目录名称
comment = zhai Directories
#是否可浏览
browseable = yes
# 共享目录的路径
path = /home/zhai/workspace/
# 是否可写
writable = yes
# 设置远程用户创建文件时的默认权限
directory mode = 0755
force directory mode = 0755
# 是否可创建文件夹
create mode = 0644
force create = 0644
# 设置能访问该目录的用户
valid user = zhai
  1. 在windows文件管理器–网络中输入ip地址\\192.168.1.123,即可看到共享的文件夹,点击输入用户名和密码即可(第一次连接即使用户名密码输入正确也会报输入错误,此时重新打开文件管理器即可);

windows

chocolately包管理器

1
choco install  <name>

linux

##关机

1
2
3
4
5
6
7
8
# 关机
$ shutdown -h now
$ shutdown -h +30 ## 30分钟后
## :在晚上 20:00 关机,并显示 "系统维护" 消息给登录用户
$ sudo shutdown -h 20:00 "系统维护"

# 重启
$ shutdown -r

ctrl+z

将程序切换到后台

1
2
3
4
5
6
7
8
9
10
# 输入ctrl+z可以将程序暂停并放到后台,运行后会有如下提示:
[1]+ stopped ...

# 把程序调度到后台执行
$ bg 1 # 1为作业号
# 查看作业号
$ jobs
[1]+ running ... &
# 调到前台运行
$ fg 1

apt

查看已安装软件

1
$ apt list --installed

一般使用dpkg

###卸载软件

apt-get remove 删除已安装的软件包(保留配置文件),不会删除依赖软件包,保留配置文件;
apt-get purge 删除已安装的软件包(不保留配置文件),删除软件包,同时删除相应依赖软件包;
apt-get autoremove 删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包),保留配置文件;
apt-get clean 删除已经安装过的的软件安装包;

dpkg

查看已安装软件

1
$ dpkg -l | grep  

查看软件安装路径

1
$ dpkg -L | grep

ubuntu18.04更换清华源

先备份一下原文件,然后编辑文件:

1
sudo vim /etc/apt/sources.list

ln 软硬链接

命令格式:$ ln [选项] 源文件 目标文件

选项:

  • -s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件;
  • -f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;

硬链接

1
2
3
$ ln /root/cangls /tmp
# 建立硬链接文件,目标文件没有写文件名,会和原名一致
# 也就是/tmp/cangls 是硬链接文件

软连接

类似快捷方式,删除软链接并不影响源文件

1
2
3
4
5
6
7
8
9
10
11
12
#建立软链接文件
$ ln -s /zhai/bols /tmp
## ln -s <源存在文件> <“快捷方式”>
## 会在tmp下创建一个“软链接(快捷方式)”指向/zhai/bols
## 结果:/tmp/bols --> /zhai/bols

# 链接目录
$ ln -s /zhai/test/ /tmp/
## 结果:/tmp/test/ --> /zhai/test/

# 修改软链接
$ ln –snf [新的源文件或目录] [目标文件或目录]

注:这里需要注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。这是初学者非常容易犯的错误。

软硬链接的区别

参考文献: Linux ln软硬链接原理详解

“一般使用软链接”;

硬链接的特点

不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变。

  • 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 262147 的文件)都可以被访问。
  • 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
  • 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
  • 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。

软链接的特点(软链接的特点和 Windows 中的快捷方式完全一致)

  • 不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。
  • 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
  • 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。
  • 软链接可以链接目录。
  • 软链接可以跨分区。

gcc

一些编译选项

1
2
3
4
5
# 打印日志
--verbose

# 打印链接选项
-Wl

gdb

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
> layout next  //显示源程序
> r //运行源程序
> refresh //清除界面信息
> b <func_name> //对函数打断点
> b <line_num> if a == 2
> tbreak //临时断点(只中断一次)
> where //段错误时可定位到哪一行错误
> watch a //查看变量a变化,会在界面打印a的值
> c //运行直到下一个断点
> thread apply all watch a
> info threads
> info b //查看所有断点
> d <break_num> //删除断点
> thread 3 //查看线程3
> bt //查看调用堆栈

> n //下一步(不进入函数)
> s //下一步(进入函数)
> c //执行到断点
> q //退出
> start //执行到main停下
> p a //查看a值
> ptype a //查看a类型

> set args <参数1> ; r //设置参数后执行
> r <参数1> //设置启动参数1
> display a //每次单步执行后查看变量值
  • (gdb) p hct->m_epollfd ==> $2 = (int *) 0x0:指针值为 0x0 表示该指针当前为空指针,即未指向任何有效的内存地址;

shell

1
#!/bin/bash

SpaceVim

需要的快捷键:

快捷键 功能描述 备注
\
便签页操作 ################################### ################
Leader 1 跳转到标签栏1
g r 跳回前一个Tab,常用于两个Tab来回切换
SPC t t 打开标签管理器
–> o r n N x 展开/重命名/新建命名/新建匿名标签页 打开标签管理器后的操作
–> Ctrl-S-↑ 向上移动光标下的标签页
文件树 ################################### ################
F3 / SPC f t 切换文件树 F3被截图占用,使用后者打开
–> h j k l 移至父目录并关闭文件夹 上 下 展开或打开
–> N 在光标位置新建文件
–> y y 复制光标下文件路径值系统剪切板
–> y Y 复制文件
–> P 粘贴文件
–> . 切换显示隐藏文件
–> s v/g 水平/垂直分屏编辑文件
–> < > 调整文件树宽度
–> ‘ / V 标记 取消标记 光标下的文件(夹)
–> Ctrl + r 刷新页面
基本操作 ################################### ##################
H / L 移动光标至屏幕顶部 / 底部
> / < 左右移动文本
} / { 向前 / 后 移动一个段落
Ctrl-f/b Shift-↓/↑ 向下 / 上翻页
注释 ################################### ##################
SPC ; 进入注释选择模式 需要搭配 3 + j/k样式使用
SPC c l 注释/反注释 当前行

VIM

vim + grep 过滤文件内容

其实就是用grep的结果覆盖掉所选定范围内的内容,具体操作看grep的使用。

在vim中输入:

保留指定内容

:%!grep execve 用grep的结果来替换全文的内容;

  • %表示范围为所有内容,也可使用块模式选择范围后使用,或者使用行号表示范围;
  • !表示管道符

保留多个指定内容的行

1
:%!grep -e str01 -e str02 ...

反向过滤,不要指定内容的行

1
:%!grep -v str01

将其他程序的输出导入vim

1
$ strace -f gcc helloworld.c |& vim -
  • 其中|&是将 stdinstderr 的信息全部放入管道。
  • vim -命令 将 stdin 重定向到 /dev/null并打开vim,意味着可以在没有文件名的情况下启动vim并读取stdin内容;$ cat | vim - output.txt //读取stdin并保存到output.txt中

注意:必须是vim -,少 - 会闪退。

模式匹配相关

####大小写

  • /\c 查找模式忽略大小写;
  • /\C 查找强制区分大小写;

正则相关

默认模式下( ) { } 需要转义。以下的在前缀匹配符号:/ 后面的那内容:

  • \v very magic模式,假定 _ 所有字母 0~9之外的所有字符都具有特殊含义(想用源字符加 \);
  • \x 匹配完整的字符集:[0-9a-fA-F]
  • \V 按照原文匹配(不按照正则),如匹配”a.b”:/\Va.b,“.”不会被当作特殊字符;
  • /\v%(A|B) “%()”表示仅匹配但并不会赋值给寄存器\1

==一个例子:==csv格式的三元组(中间用空格隔开),创建为neo4j的插入语句,原数据为:

1
江河 超过警戒水位 当地防汛机构

需要改写为:

1
2
3
4
(江河:地点{name:'江河'}),
(当地防汛机构:管理单位{name:'当地防汛机构'}),
(江河)-[:发生]->(超过警戒水位),
(超过警戒水位)-[:管理单位]->(当地防汛机构),

当然上述是两种格式,分两个匹配格式:

1
2
3
### 两种为:
:s/\v(\w+)\_s(\w+)\_s(\w+)\_s/(\1:地点{name:'\1'}),\r(\3:风险事件{name:'\3'}),/g
:s/\v(\w+)\_s(\w+)\_s(\w+)\_s/(\1)-[:发生]->(\3),\r(\2)-[:管理单位]->(\3),/g

界定符 “< >”

对于文本内容:“these the they the”,如果直接匹配the,会匹配到 4 个结果。如果想只匹配the,加上界定符即可:/\v<the>

使用括号匹配

1
2
3
4
5
6
7
8
9
10
11
# 例如有如下文件格式:test.txt
$ cat test.txt
AAA BBB CCC
DDD EEE FFF
# 使用(括号)匹配,将他们格式化为"CCC BBB AAA"和"DDD EEE FFF"
## 方法一:直接使用 先用shift+v选中块,然后:s替换 \v表示
:s/\v(\w+)\_s(\w+)\_s(\w+)\_s/\3 \2 \1/g

## 方法二:先 /搜索并将文本加入缓存,再使用:s
/\v(\w+)\_s(\w+)\_s(\w+)\_s
:s/\1 \2 \3/\3 \2 \1/g

其中:

  • \w+表示匹配一个或多个字母或数字,如果是汉字,需要使用\S+
  • (\w+)表示将匹配的值加入缓存,使用\数字来使用它
  • \_s表示匹配空格或换行
  • \r表示换行

vimc常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#vim 
> 全局替换:`:g/p1/s//p2/g`
> 范围替换:`:n1,n2s/p1/p2/g`
> 单行替换:`s/p1/p2/g`

#缓冲区
> :ls 查看缓冲区文件列表
> :bpre :bnext :bfirst :blast 切换缓冲区内的文件
> :edit <filename> 把文件加入缓冲区

#多窗口(水平切是指上下窗口)
> <C-w>s 水平 <C-w>v 垂直
> :split {file} 水平切分窗口,新窗口显示file(即把file加入缓冲区)
> :vsplit {file}
> <C-w>w <C-w>hjkl 切换窗口
> <C-w>c :close 关闭活动窗口
> <C-w>o :only 只保留活动窗口,关闭其他窗口

# 合并行,保留空格
> 1, 3J
# 合并行,行之间无空格
> g + shift + j

安装

⭐Carl的VIM安装

当前方案

zr修改版本地址:https://gitee.com/zhaixiangchao/zr_vim.git

  • 使用:创建~/.config/nvim/,将上述clone至nvim/下(注意将目录移一下)

源地址https://github.com/youngyangyang04/PowerVim

注意,其中自带Nerdtree、airline等,不需要自己安装

所做的修改:

  • 主题修改
  • 去掉一些java的辅助
  • windows下需要安装ctags,简单下载,放到环境变量里即可;linux下apt直接安装。

针对vim低于8版本的安装

安装vim9

1、先卸载默认的vim8

1
2
sudo apt purge vim vim-*
sudo apt autoremove

2、安装编译依赖

1
sudo apt install lua5.3 liblua5.3-dev ruby2.5-dev python3-pip cmake gettext

3、下载源码

1
git clone -b v9.0.1504 https://github.com/vim/vim.git ~/Downloads/vim9

4、编译与安装

1
2
3
4
5
6
7
8
9
10
11
12
13
./configure --prefix=/opt/vim \
--with-features=huge \
--enable-multibyte \
--enable-rubyinterp=yes \
--enable-python3interp=yes \
--enable-luainterp=yes \
--enable-gui=gtk2 \
--enable-cscope \
--enable-fail-if-missing

make -j6
sudo make install
sudo ln -s /opt/vim/bin/vim /usr/local/bin/vim

安装neovim

1、下载源码

1
git clone -b v0.9.0 https://github.com/neovim/neovim.git ~/Downloads/neovim9

2、编译与安装

1
2
3
make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=/opt/neovim"
sudo make install
sudo ln -s /opt/neovim/bin/nvim /usr/local/bin/nvim
zr_nvim及插件安装

所有必要的东西已传git:https://e.coding.net/zhaixc/util_workspace/utils_git.git

安装方式见其中的README.txt

##nvim中调用shell命令

1
:!man socket

nvim配置

直接下载上述zr版即可,不需要配置

windows配置文件路径:C:\Users\zhai\AppData\Local\nvim\init.vim

linux 安装nvim后自己在~/.config/nvim/init.vim

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
zhai@zhai-PC:~/.config$ cat nvim/init.vim
set tabstop=4
set softtabstop=4
set shiftwidth=4

set noexpandtab
set nu
set autoindent
set cindent
set encoding=utf-8
set fileencodings=utf-8

" 设置默认主题
set bg=dark "设置背景为黑色
colorscheme snazzy "设置主题为 snazzy
" set guioptions= "去掉两边的scrollbar
" set guifont=Monaco:h17 "设置字体和字的大小

" 设置光标
" set guicursor=a:blinkon100 "设置光标为方块闪烁,使用windows terminal时配置此选项
set guicursor=n:blinkon100,i:ver10,v:hor40

插件放置(离线安装)

在github下载相应的插件源码后,直接将必要的源码复制到nvim/下即可;

目录内容如下:

1
2
zhai@zhai-PC:~/.config$ ls nvim/
_config.yml autoload colors init.vim lib nerdtree_plugin plugin syntax

在多行开头和结尾添加

1
2
:1,10s/^/"/g	# ^表示行开头,且不包含字符;同理$表示末尾
:1,10s/$/"/g

tmux

1
$ tmux source-file ~/.tmux.conf

TIPS:如果ssh连接意外断开,则所有进程或者下载进度都会被终止;而使用tmux创建的会话是被保存的,不会终止。

结构:Session( windows( panes ) )

  • $ tmux 打开新窗口
  • $ tmux new -s <session-name> 会话外新建会话,也可以先离开当前会话,再输入tmux创建新的会话
  • $ tmux attach -t <session-name>重新进入会话
快捷键 默认都加前缀 ctrl + b 含义
>>会话快捷键 #######################################
s 列出所有会话
$ 重命名当前会话
d 离开当前会话(工作空间),但是该会话仍然存在
$ tmux attach -t <会话编号> 可重新连接会话
>> 窗口快捷键 ########################################
c 创建一个新窗口
n 切换到下一个窗口
w 从列表中选择窗口
<0~9> “ 切换到指定编号的窗口,编号在状态栏上下分屏
q 会显示窗口编号
重命名窗口
& 关闭窗口
>> 窗格的快捷键 #########################################
% 左右分屏
z 当前窗格全屏显示,再按一次恢复
q 显示窗格编号
t 在当前窗格显示时间
<上下左右> 切换窗格
o 光标切换到下一个窗格
{ 、 } 左移、右移当前窗格
Ctrl+o、 Alt+o 上移、下移当前窗格
space 切换窗格布局
x 关闭当前块屏
ctrl + d 或 exit 退出窗口

Makefile

变量 含义
$@ (左边的)所有生成目标
$< 取所有依赖目标中的第一个
$? 所有比目标新的依赖目标的集合
$^ 所哟依赖目标的集合
$+
$*

自制模板V1.2

非交叉编译使用此模板,只需要修改vpath对应新的.c目录即可

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
VERSION := 1.2

CC := gcc
CFLAGS := -Wall
LIBS := -lpthread

SRCS := $(shell find ./ -name "*.c")

SRCS_WITHOUT_DIR := $(notdir $(SRCS))
OBJS := $(SRCS_WITHOUT_DIR:.c=.o)
BUILD := ./build
OBJS := $(addprefix $(BUILD)/, $(OBJS))

TARGET := test

DEPDIR := .deps
DEPFILES := $(SRCS_WITHOUT_DIR:%.c=$(DEPDIR)/%.d)
# DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d

vpath %.c config
vpath %.c lock
vpath %.c log
vpath %.c webserver

all: $(TARGET)

include $(DEPFILES)

$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) $^ -o $@ $(LIBS)

$(OBJS): $(BUILD)/%.o : %.c $(DEPDIR)/%.d | $(DEPDIR)
$(CC) -c $(CFLAGS) $< -o $@ $(LIBS)

# 生成.d文件
$(DEPFILES) : $(DEPDIR)/%.d : %.c | $(DEPDIR)
$(CC) -MM $< > $@

$(DEPDIR):
@mkdir -p $(DEPDIR)


.PHONY: clean debug

clean :
rm -rf .deps $(OBJS)

debug :
@echo OBJS is[$(OBJS)]
@echo DEPFILES is[$(DEPFILES)]
@echo SRCS_WITHOUT_DOR is[$(SRCS_WITHOUT_DIR)]
@echo ALL_VPATH is[$(SRCS_WITHOUT_DIR)]

路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
zhai@zhai-PC:~/linux_workspace/c_webserver$ tree
.
├── Makefile
├── README.md
├── build
│ ├── main.o
│ ├── util.o
│ └── web_server.o
├── main.c
├── obj
├── project
├── test_server
├── util
│ ├── util.c
│ └── util.h
└── web_server
├── web_server.c
└── web_server.h

正点原子模板

参考正点原子,路径:F:\scm_source_workspace\IMX6Umini\01、例程源码\01、裸机例程\05_ledc_bsp\

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
CROSS_COMPILE 	?= arm-linux-gnueabihf-
TARGET ?= bsp

CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump

INCDIRS := imx6ul \
bsp/clk \
bsp/led \
bsp/delay

SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay


INCLUDE := $(patsubst %, -I %, $(INCDIRS))

SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))

SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS) $(COBJS)

VPATH := $(SRCDIRS)

.PHONY: clean

$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.lds -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

对应路径:

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
# win10下tree
$ tree . /f

│ imx6ul.lds
│ imxdownload
│ ledc_bsp.code-workspace
│ load.imx
│ Makefile

├─bsp
│ ├─clk
│ │ bsp_clk.c
│ │ bsp_clk.h
│ │
│ ├─delay
│ │ bsp_delay.c
│ │ bsp_delay.h
│ │
│ └─led
│ bsp_led.c
│ bsp_led.h

├─imx6ul
│ cc.h
│ fsl_common.h
│ fsl_iomuxc.h
│ imx6ul.h
│ MCIMX6Y2.h

├─obj
└─project
main.c
start.S

报错.deps是一个文件

报错:make: *** .deps: Is a directory. Stop.

原因:.deps 赋值时后面有空格

git

远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1 clone仓库(clone之后一般自动关联)
$ clone
# 2 关联远程仓库(可选)
$ git remote add origin https://e.coding.net/zhaixc/linux/webserver_cc.git

# 创建分支
git branch <name>
# 重命名分支
git branch -m <oldname> <newname>
# 删除分支
git branch -d <name>
# 列出分支
git branch
# 切换分支
git checkout <name>
# 合并分支
git merge

本地仓库关联远程分支

1
2
3
4
5
6
7
8
9
10
11
12
13
# 初始化仓库
git init
# 创建本地分支
git branch zhai_branch
# 关联远程仓库
git remote add origin <url>
# 拉取远程分支(master,或者需要要关联的分支)
git pull origin master --allow-unrelated-histories
git pull origin zhai_branch --allow-unrelated-histories
# 读取远程仓库分支信息
git branch -r
# 本地分支与远程分支关联
git branch -u origin/zhai_branch zhai_branch

将本地文件git push到远程新建仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 初始化本地仓库
git init
# 关联远程仓库
git remote add origin <url>
# 上传
git add .
git commot -m " "
git push origin master

### 可能会出现报错
--------------------------------------------------------------------------
Username for ‘https://gitee.com’: xxxxxx
Password for ‘https://[email protected]’:
To https://gitee.com/Lizxxxxx0321/LZMtest.git
! [rejected] master -> master (fetch first)
error: 无法推送一些引用到 ‘https://gitee.com/Lizhiming0321/LZMtest.git’
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 ‘git pull …’)。
提示:详见 ‘git push --help’ 中的 ‘Note about fast-forwards’ 小节。
--------------------------------------------------------------------------
### 解决方案:
git push -u origin +master

撤销git add的文件

1
git reset <filename>

gitigonre不起作用的问题

1
.gitigorne

注意其中路径要用斜杠/,反斜杠不起作用

sed

#正则

sed中特殊符号

需要转义的:

1
. * [ ] $ { } \ + ? | ( )

提取标签并计算不重复标签数

文件内容格式:

1
2
3
你|+-+|B-NAM
好|+-+|B-LOC
...

目的:过去出B-*并计算不重复标签数

使用#grep 和#sed :

1
2
# uniq只能去除相邻的相同行,所以需要先排序
grep "|B-.*" bio_data.txt | sed 's/.*B-/B-/g' | sort | uniq -c

注意字符串中其它相同字符的影响,(有bug版本如下):

1
grep "B-.*" bio_data.txt | sed 's/.*B/B/g' | sort | uniq -c

vscode

vscode创建工作区

目的:查看一些工程源码,创建工作区后可以修改配置文件,可将无关的目录源码屏蔽掉;

实例:比喻查看uboot启动流程;

参考:imx6ul驱动开发指南–第31章–31.2 P740

实现:

  1. 点击“文件–>将工作区另存为”,保存到当前源码根路径下;
  2. 创建.vscode文件夹,在其下创建setting.json文件
  3. 输入
1
2
3
4
5
6
7
8
9
10
11
12
13
{ 
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
},
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
}
}

#uboot

uboot查看mmc(SD)是否正常

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
Normal Boot
Hit any key to stop autoboot: 0
=>

=> mmc list # 查看所有存储设备
FSL_SDHC: 0 (SD)
FSL_SDHC: 1
=> mmc dev 0 # 切换到dev 0
switch to partitions #0, OK
mmc0 is current device
=> mmc info # 查看信息
Device: FSL_SDHC
Manufacturer ID: 3
OEM: 5344
Name: SU08G
Tran Speed: 25000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB

tree

windows10下列出所有目录下文件

1
tree . \f

linux常用工具命令速查

https://bg4vrg.com/post/20240228150148.html

作者

fei

发布于

2024-02-28

更新于

2024-02-28

许可协议

评论