linux常用工具总述
原文链接在此
mv、cp、wc
目录操作
grep
基础知识
sed
awk
find
常用实例
普通查找与匹配
按文件类型匹配
按时间查找
按大小查找
删除匹配文件
按照权限查找
借助-exec与其他命令连用
-exec后接多行命令
跳过(排除)指定目录搜索
find其他技巧收集
详细语法
zsh
配置
oh-my-zsh
zsh-autosuggestions
head
查看指定多行
sort
基础
按照指定列排序
uniq
clash
ssh
ssh远程转发(反向代理)
配置无响应断连的时长
方案1,修改ssgd_config
方案2,修改profile,设置TMOUT
tar
压缩
解压
samba配置
windows
chocolately包管理器
linux
关机
ctrl+z
apt
查看已安装软件
卸载软件
dpkg
查看已安装软件
查看软件安装路径
ubuntu18.04更换清华源
ln 软硬链接
硬链接
软连接
软硬链接的区别
gcc
gdb
shell
SpaceVim
VIM
vim + grep 过滤文件内容
保留指定内容
保留多个指定内容的行
反向过滤,不要指定内容的行
将其他程序的输出导入vim
模式匹配相关
大小写
正则相关
界定符 “< >”
使用括号匹配
vimc常用命令
安装
⭐Carl的VIM安装
针对vim低于8版本的安装
安装vim9
安装neovim
zr_nvim及插件安装
nvim中调用shell命令
nvim配置
在多行开头和结尾添加
tmux
Makefile
自制模板V1.2 1.
正点原子模板
报错.deps是一个文件
git
远程仓库
本地仓库关联远程分支
将本地文件git push到远程新建仓库
撤销git add的文件
gitigonre不起作用的问题
sed
sed中特殊符号
提取标签并计算不重复标签数
vscode
vscode创建工作区
uboot
uboot查看mmc(SD)是否正常
tree
windows10下列出所有目录下文件
基础命令,但仅日常使用到的在此总结,以作查阅;
简介: 对于使用过的命令以及应对场景进行总结,主要以linux下基础命令为主,归档以供随时查阅;
Version
mv、cp、wc 目录操作
$ 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 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 安装步骤:
把插件下载到本地的 ~/.oh-my-zsh/custom/plugins
目录:
1 git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
在 .zshrc
中,把 zsh-autosuggestions
加入插件列表:
1 2 3 4 plugins=( # other plugins... zsh-autosuggestions # 插件之间使用空格隔开 )
head 查看指定多行
#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
然后关闭系统代理:
再次检查程序端口、进程以及环境变量,都没有的话表示服务正常关闭。
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系统上配置(大同小异)
编辑配置文件: sudo nvim /etc/samba/smb.conf
将linux用户添加到可使用samba的名单中:sudo smbpasswd zhai
,然后会要求输出密码(独立的远程访问密码,可与sudo密码不一致)
添加配置:
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
在windows文件管理器–网络中输入ip地址\\192.168.1.123
,即可看到共享的文件夹,点击输入用户名和密码即可(第一次连接即使用户名密码输入正确也会报输入错误,此时重新打开文件管理器即可);
windows chocolately包管理器
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 查看已安装软件
一般使用dpkg
###卸载软件
apt-get remove
删除已安装的软件包(保留配置文件),不会删除依赖软件包,保留配置文件;
apt-get purge
删除已安装的软件包(不保留配置文件),删除软件包,同时删除相应依赖软件包;
apt-get autoremove
删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包),保留配置文件;
apt-get clean
删除已经安装过的的软件安装包;
dpkg 查看已安装软件
查看软件安装路径
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
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 ...
反向过滤,不要指定内容的行
将其他程序的输出导入vim
1 $ strace -f gcc helloworld.c |& vim -
其中|&
是将 stdin 和 stderr 的信息全部放入管道。
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 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命令
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://Lizxxxxx@gitee.com’: 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的文件
gitigonre不起作用的问题
注意其中路径要用斜杠/
,反斜杠不起作用
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
实现:
点击“文件–>将工作区另存为”,保存到当前源码根路径下;
创建.vscode
文件夹,在其下创建setting.json
文件
输入
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下列出所有目录下文件