linux常用工具命令速查
linux常用工具总述
- sed
- awk
- find
- zsh
- head
- sort
- uniq
- clash
- ssh
- ssh远程转发(反向代理)
- 配置无响应断连的时长
- tar
- samba配置
- windows
- linux
- gcc
- gdb
- shell
- SpaceVim
- VIM
- vim + grep 过滤文件内容
- 将其他程序的输出导入vim
- 模式匹配相关
- 使用括号匹配
- vimc常用命令
- 安装
- ⭐Carl的VIM安装
- 针对vim低于8版本的安装
- zr_nvim及插件安装
- nvim中调用shell命令
- nvim配置
- 在多行开头和结尾添加
- tmux
- Makefile
- 自制模板V1.2
1. - 正点原子模板
- 报错.deps是一个文件
- 自制模板V1.2
- git
- gitigonre不起作用的问题
- sed
- vscode
- uboot
- tree
基础命令,但仅日常使用到的在此总结,以作查阅;
简介:对于使用过的命令以及应对场景进行总结,主要以linux下基础命令为主,归档以供随时查阅;
Version
- 20230804 V1.0:初稿
mv、cp、wc
目录操作
1 | $ mv /dir_old /dir_new |
- -f 强制覆盖
$ cp -rp
-p会保持原权限、属性、时间戳等;
$ wc -l
统计行数
grep
基础知识
1 | # 在file中查找内容 |
sed
awk
find
常用实例
### 普通查找与匹配
1 | ## 查找以.txt结尾的文件 |
按文件类型匹配
- f 普通文件
- l 符号链接
- d 目录
- c 字符设备
- b 块设备
- s 套接字
- p fifo
1 | # 按文件类型匹配 |
按时间查找
linux文件系统每个文件都有三种时间戳:
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
1 | ## 搜索最近7天内被访问过的所有文件 |
按大小查找
- b —— 块(512字节)
- c —— 字节
- w—— 字(2字节)
- k —— 千字节
- M —— 兆字节
- G —— 吉字节
1 | ## 搜索 大于/小于/等于 10k的文件 |
删除匹配文件
1 | find . -type f -name "*.txt" -delete |
按照权限查找
1 | ## 找出权限为777的文件 |
借助-exec与其他命令连用
1 | ## 找出当前目录下所有root的文件,并把所有权更改为用户tom |
-exec后接多行命令
因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
1 | -exec ./text.sh {} \; |
跳过(排除)指定目录搜索
1 | ## 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk |
find其他技巧收集
1 | ## 要列出所有长度为零的文件 |
详细语法
查找目录: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 | plugins=( |
head
查看指定多行
1 | $ head -n 1000 |
#sort
基础
1 | [root@www ~]# sort [-fbMnrtuk] [file or stdin] |
按照指定列排序
$ sort -nk 3
#按照第 3 列排序
uniq
1 | [root@www ~]# uniq [-ic] |
#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 | $ sh start.sh |
使用命令行登录:
1 | # $ curl http://192.168.10.29:9090/ui -H "Authentication: b&ZlKTte5OnEt2Sn" |
(3)检查是否打开
检查服务端口
1 | $ netstat -tln | grep -E '9090|789.' |
检查环境变量:
1 | $ env | grep -E 'http_proxy|https_proxy' |
如果上述信息正常,表示启动成功。
(4)停止程序
1 | $ cd clash-for-linux |
然后关闭系统代理:
1 | $ proxy_off |
再次检查程序端口、进程以及环境变量,都没有的话表示服务正常关闭。
ssh
ssh远程转发(反向代理)
(105条消息) 利用阿里云虚拟机作为跳板机实现内网穿透_阿里云跳板机_coderduck的博客-CSDN博客
使用ipad通过云主机huiweiyun跳转连接到办公室主机deepin上;
云主机上的操作:
如果需要用20022端口做转发,则需要把改端口开放
以下操作在办公室电脑上完成:
(1)ssh使用密匙登录云主机(实现免密登录)
1 | ### 1. 生成ssh密匙 |
(2)设置办公室主机ssh监视端口,以允许任意端口可以监视ssh端口
1 | ### 1.修改配置文件 |
(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 | ### 修改一个开机执行的脚本,将启动命令加进去 |
进行访问:
在任何一台支持ssh的主机上输入命令:
1 | $ ssh <实验室主机用户名>@<huaweiyun_ip> -p 20023 |
注意连接密码是实验室主机上的用户密码。
配置无响应断连的时长
方案1,修改ssgd_config
1 | $ vim /etc/ssh/sshd_config |
重启: #重启ssh服务,或用service sshd restart
方案2,修改profile,设置TMOUT
1 | $ vim /etc/profile |
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 | [zhai_workspace] # 用win连接时会显示的远程文件目录名称 |
- 在windows文件管理器–网络中输入ip地址
\\192.168.1.123
,即可看到共享的文件夹,点击输入用户名和密码即可(第一次连接即使用户名密码输入正确也会报输入错误,此时重新打开文件管理器即可);
windows
chocolately包管理器
1 | choco install <name> |
linux
##关机
1 | # 关机 |
ctrl+z
将程序切换到后台
1 | # 输入ctrl+z可以将程序暂停并放到后台,运行后会有如下提示: |
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 | $ ln /root/cangls /tmp |
软连接
类似快捷方式,删除软链接并不影响源文件
1 | #建立软链接文件 |
注:这里需要注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。这是初学者非常容易犯的错误。
软硬链接的区别
参考文献: Linux ln软硬链接原理详解
“一般使用软链接”;
硬链接的特点
不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变。
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 262147 的文件)都可以被访问。
- 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
- 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
- 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。
硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。
软链接的特点(软链接的特点和 Windows 中的快捷方式完全一致)
- 不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。
- 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
- 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。
- 软链接可以链接目录。
- 软链接可以跨分区。
gcc
一些编译选项
1 | # 打印日志 |
gdb
1 | > layout next //显示源程序 |
(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 - |
- 其中
|&
是将 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 | 江河 超过警戒水位 当地防汛机构 |
需要改写为:
1 | (江河:地点{name:'江河'}), |
当然上述是两种格式,分两个匹配格式:
1 | ### 两种为: |
界定符 “< >”
对于文本内容:“these the they the”,如果直接匹配the,会匹配到 4 个结果。如果想只匹配the,加上界定符即可:/\v<the>
使用括号匹配
1 | # 例如有如下文件格式:test.txt |
其中:
\w+
表示匹配一个或多个字母或数字,如果是汉字,需要使用\S+
(\w+)
表示将匹配的值加入缓存,使用\数字
来使用它\_s
表示匹配空格或换行\r
表示换行
vimc常用命令
1 | #vim |
安装
⭐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 | sudo apt purge vim vim-* |
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 | ./configure --prefix=/opt/vim \ |
安装neovim
1、下载源码
1 | git clone -b v0.9.0 https://github.com/neovim/neovim.git ~/Downloads/neovim9 |
2、编译与安装
1 | make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=/opt/neovim" |
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 | zhai@zhai-PC:~/.config$ cat nvim/init.vim |
插件放置(离线安装)
在github下载相应的插件源码后,直接将必要的源码复制到nvim/
下即可;
目录内容如下:
1 | zhai@zhai-PC:~/.config$ ls nvim/ |
在多行开头和结尾添加
1 | :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 | VERSION := 1.2 |
路径:
1 | zhai@zhai-PC:~/linux_workspace/c_webserver$ tree |
正点原子模板
参考正点原子,路径:F:\scm_source_workspace\IMX6Umini\01、例程源码\01、裸机例程\05_ledc_bsp\
1 | CROSS_COMPILE ?= arm-linux-gnueabihf- |
对应路径:
1 | # win10下tree |
报错.deps是一个文件
报错:make: *** .deps: Is a directory. Stop.
原因:.deps
赋值时后面有空格
git
远程仓库
1 | # 1 clone仓库(clone之后一般自动关联) |
本地仓库关联远程分支
1 | # 初始化仓库 |
将本地文件git push到远程新建仓库
1 | # 初始化本地仓库 |
撤销git add的文件
1 | git reset <filename> |
gitigonre不起作用的问题
1 | .gitigorne |
注意其中路径要用斜杠/
,反斜杠不起作用
sed
#正则
sed中特殊符号
需要转义的:
1 | . * [ ] $ { } \ + ? | ( ) |
提取标签并计算不重复标签数
文件内容格式:
1 | 你|+-+|B-NAM |
目的:过去出B-*并计算不重复标签数
使用#grep 和#sed :
1 | # uniq只能去除相邻的相同行,所以需要先排序 |
注意字符串中其它相同字符的影响,(有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 | { |
#uboot
uboot查看mmc(SD)是否正常
1 | Normal Boot |
tree
windows10下列出所有目录下文件
1 | tree . \f |
linux常用工具命令速查