shell常实用命令

文章目录

查看系统信息

查看cpu信息

cat /proc/cpuinfo
64位系统开辟的虚拟存储一般在256TB(2^48)。

address sizes : 39 bits physical, 48 bits virtual

查看系统信息

查看kernel版本:
uname -r
查看系统信息:
uname -v
查看处理器型号:
uname -m
uname -i

查看系统log信息

journalctl

查看最近的日志信息:journalctl -xe
查看指定进程的日志信息:journalctl _SYSTEMD_UNIT=unit_name
查看以前引导的所有日志:journalctl --list-boots
查看上一次系统引导的日志:journalctl -b -1

内核

开机内核信息查看
dmesg 只能打印当前开机之后的log
dmesg -T 按日期显示信息

串口信息查看
dmesg|grep ttyS*

查看内核版本
uname -r

内核模块存放地址: /lib/modules/

depmod命令会扫描系统中的内核模块,并写入modules.dep文件
depmod [opts]

-a:扫描所有模块;
-A:扫描新模块,只有有新模块时,才会更新modules.dep文件;
-n:把扫描结果不写入modules.dep文件,而是输出到屏幕上;

查看系统安装的内核模块
lsmod
查看模块信息
modinfo [modname]
内核模块的添加与删除
modprobe [opts] [modname]

-I:列出所有模块的文件名,依赖 modules.dep 文件;
-f:强制加载模块;
-r:删除模块;

加载模块
insmod只能加载编译好的.ko文件;modprobe可以自动解析模块依赖加载
insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]

-f  不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k  将模块设置为自动卸除。
-m  输出模块的载入信息。
-o<模块名称>  指定模块的名称,可使用模块文件的文件名。
-p  测试模块是否能正确地载入kernel。
-s  将所有信息记录在系统记录文件中。
-v  执行时显示详细的信息。
-x  不要汇出模块的外部符号。
-X  汇出模块所有的外部符号,此为预设置。

压力测试

测试cpu及内存。stress & stress-ng
sudo apt install stress-ng

可通过lscpu ls /sys/devices/system/cpu来查看cpu个数

对8个cpu进行压力测试,时间60s

stress-ng --cpu 8 -t 60

内存测试,启动虚拟内存负载,分配并保持2GB的内存,并运行60秒。

sudo stress-ng --vm 1 --vm-bytes 2G --vm-keep -t 60s

设备

ubuntu 显卡镜像源
1.打开终端添加镜像源
sudo add-apt-repository ppa:graphics-drivers/ppa
2.更新库
sudo apt-get update
3.更新安装包
sudo apt upgrade
4.查看drives
ubuntu-drivers devices

重新加载usb设备
sudo udevadm control --reload-rules && udevadm trigger

环境变量设置

添加可执行文件路径到环境变量
export PATH=$PATH:/要添加的路径

man查看命令及函数用法

1 用于查系统命令:eg. man 1 ls,
2 查系统调用:eg. man 2 open
3 标准函数:eg. man 3 sleep,
默认1:不输入数字默认执行man 1:eg. man sleep

编译环境变量设置

清除环境变量
unset ROS_PACKAGE_PATH
gcc找到头文件的路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/MyLib
g++找到头文件的路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/MyLib
添加共享库路径到环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_lib_path
也可以在 /etc/ld.so.conf 或者 /etc/ld.so.conf.d/文件中添加库的搜索路径,然后执行ldconfig

注意:LD_LIBRARY_PATH程序运行时 动态链接器(ld.so)用于查找共享库(.so)的环境变量,它只影响已经编译好的程序在运行时如何找到依赖库。

ldconfig <ld_lib_path>可以加载该ld_lib_path路径到库链接路径,即执行该命令后,ld_lib_path路径下得库文件可以被找到并链接。

# 添加新库路径并更新动态库缓存
sudo sh -c "echo /usr/lib/x86_64-linux-gnu > /etc/ld.so.conf.d/kdl.conf"
sudo ldconfig

ldconfig 扫描默认库路径(/lib/usr/lib)和配置文件 /etc/ld.so.conf 中列出的目录,生成动态链接库的缓存文件 /etc/ld.so.cache。该缓存供运行时链接器(ld.so)快速定位共享库,避免每次加载程序时全盘搜索库文件。

找到静态库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/MyLib

g++使用库

在 C/C++ 编译链接过程中,是否需要用 -l 显式指定库文件,主要由编译器的默认行为和运行时库的依赖机制决定。
根据编译器的处理逻辑,库可分为以下两类:

库类型是否需要 -l典型示例原因
编译器隐式链接的库不需要libc (C标准库)
libstdc++ (C++标准库)
编译器自动识别语言特性并链接,无需手动指定(如用 g++ 编译时自动链接 libstdc++.so
需显式指定的库需要pthread
z (zlib)
自定义库
非语言核心功能库,需用户显式声明依赖关系
  1. 编译器自动链接运行时库

    • 语言核心库自动处理
      • g++ 编译 C++ 代码时,自动添加 -lstdc++gcc 编译 C 代码时,自动添加 -lc(C标准库)。
      • 原理:编译器(如 g++)本质是“包装器”,调用底层链接器时自动传递语言标准库参数。
    • 例外情况:若使用 gcc 编译 C++ 代码,需手动添加 -lstdc++(因 gcc 默认按 C 语言处理)。
  2. 非核心库需显式指定

    • 系统功能库(如 pthread
      虽为系统库,但不属于语言核心,需显式指定 -lpthread(因为线程支持是可选的扩展功能)。
    • 第三方/自定义库
      所有非编译器默认处理的库(如数学库 -lm、压缩库 -lz 或项目自定义库),均需通过 -l 指定。
  3. 路径搜索规则的差异

    • 默认路径:编译器自动在 /lib/usr/lib 等目录搜索隐式库,无需 -L 指定。
    • 自定义路径:若库文件不在默认路径,必须通过 -L 指定目录 + -l 指定库名。
      gcc main.c -o app -L./mylib -lmylib  # 链接 ./mylib/libmylib.so
      
  • 检查已链接库
    ldd ./your_program     # 查看动态库依赖
    readelf -d ./your_program | grep NEEDED  # 查看所有依赖库
    
  • 确认隐式库
    若输出包含 libc.so.6libstdc++.so.6,说明标准库已自动链接。

注意事项:动态库需确保运行时路径正确(通过 -Wl,-rpathLD_LIBRARY_PATH 设置)。
-Wl,-rpath是‌编译时‌嵌入到二进制文件中的路径信息,优先级极高(仅次于LD_PRELOAD),属于"硬编码"方式,适合固定部署路径的场景。
LD_LIBRARY_PATH是‌运行时‌环境变量,灵活性高但需要用户显式设置,优先级低于rpath但高于系统路径,适合临时调试或未固定安装路径的情况。

  1. 使用pkg-config,见pkg-config
  2. 直接使用-L指定位置
    eg:Sophus使用:
    指定目录:
    g++ Sophus.cpp -L /home/xxx/Sophus/build/ -lSophus -o xxx
    eg:多个库:
    g++ zhijiefa.cpp -lSophus `pkg-config eigen3 --libs --cflags` `pkg-config --libs --cflags opencv`
    g++ zhijiefa.cpp -L ~/Download/softpackages/Sophus/build -I ~/Download/softpackages/Sophus `pkg-config eigen3 --libs --cflags`
  3. 使用-Wl,-rpath= 将库路径直接写入二进制文件(可执行文件/库)
    gcc -o myapp main.c -L/path/to/libs -lmylib -Wl,-rpath=/path/to/libs
  • -L/path/to/libs:确保编译时链接器找到 libmylib.so
  • -Wl,-rpath=/path/to/libs:确保运行时程序从该路径加载库。

‌优先级规则‌:运行时搜索顺序为:-rpath指定路径 → LD_LIBRARY_PATH环境变量 → 系统默认路径(如/usr/lib)。

选项作用阶段是否必须典型用途
-L链接阶段✅(库在非标准路径时必需)指引编译器找到 -lxxx 指定的库
-rpath运行阶段✅(避免运行时加载失败)嵌入库路径到二进制文件,提升可移植性
LD_LIBRARY_PATH运行阶段❌(临时替代方案)通过环境变量指定运行时路径,但依赖用户配置
ubuntu ctrl + Alt +F(1~6)会进入终端模式, ctrl + Alt +F7退出终端模式
锁定终端

ctrl+s 可以锁定终端,不能继续操作,ctrl+q解锁终端

linux 固定usb设备挂在节点名

linux下多个usb设备固定名称方法
在/etc/udev/rules.d/创建xxx.rules文件
对应填入:以下内容,将KERNELS参数替换成设备号,SYMLINK参数设置为你想定义的节点名称。

ACTION=="add",KERNELS=="1-2:1.0",SUBSYSTEMS=="usb",MODE:="0777",SYMLINK+="name"

设备编号:通过lls /sys/class/tty/ttyUSB* -l来查看。以下红色部分为设备编号。

lrwxrwxrwx root root 2017-08-01 13:40 ttyUSB0 -> …/…/devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0

编译

cmake

查看cmake可配置项:
cmake . -LA
cmakelist.txt中的变量,在命令行配置时,前加‘-D’
如:

CMAKE_BUILD_TYPE 设置模式是Debug还是Release模式

SET(CMAKE_BUILD_TYPE "Debug”)
or
SET(CMAKE_BUILD_TYPE "Release")
也可以在执行cmake命令式在外部执行:

cmake -DCMAKE_BUILD_TYPE=Release .. 

脚本类

执行命令时自动输入‘y’
echo y | cmd

ssh

利用ssh远程执行服务器命令

fuction expect_server()
{
	expect <<EOF
	set timeout 1000
	spawn $@
	expect {
		"(yes/no)?" {send "yes\r"; exp_continue}
		"*asswor*" {send "${SERVER_PASSWD}\r"; exp_continue}
		eof
	}
EOF
}
expect_server ssh server@xxx.xxx.xxx.xxx [cmd]

来判断$arg有没有被赋值,条件成立则没有被赋值。**

shell if[X$arg = X];then

打开ssh服务:
问题:ssh: connect to host xxx port 22: Connection refused解决

问题原因可能是:ssh-server未安装或者未启动。
ubuntu 11.10 默认安装openssh-client,但是木有安装server。

运行 ps -e | grep ssh,查看是否有sshd进程。
如果没有,说明server没启动,通过 service sshd start (或 /etc/init.d/ssh -start)启动server进程,如果提示ssh不存在 那么就是没安装server。
通过 sudo apt-get install openssh-server命令安装即可。

远程命令行需要运行图形类程序

以下命令会启用当前环境的图像软件。即需要当前的ssh所处的系统下图形桌面环境配置
ssh hostname@ip -Xssh hostname@hostname -X

指定端口号登录及scp

ssh -p 2200 [user_name]@[user_ip]

从远程机拷贝文件
scp -P 2200 [user_name]@[user_ip]:file_path destination_path

网络设置

命令行修改ip
ifconfig eth0 192.168.1.23
查看路由网关信息
netstat -rnroute -n
查看是否能够连接外网
ping 114.114.114.114
ping 1.2.4.8

命令行连接WiFi
1、使用wpa_supplicant配置文件连接wifi

#查看是否已经正确安装无线网卡
iwconfig
#启动无线网卡, 如果网卡是wlan0
# 方式1
ifconfig wlan0 up
# 或者方式2
ip link set wlan0 up
#扫描可用的WiFi
# 不加less可能会产生太多输出
iw dev wlan0 scan |less
 
# 或者
iwlist wlan0 scanning
#创建口令文件, 并连接

# 建立配置文件
wpa_passphrase ESSID PWD > xxx.conf
# 使用配置文件连接
wpa_supplicant -B -i wlan0 -Dwext -c ./xxx.conf
# 查看连接结果
iwconfig wlan0
# 设置为dhcp client, 获取IP
dhclient wlan0

2、使用nmcli命令连接wifi

ifconfig检查wifi网口节点,假设wifi网口名为:wlp3s0
iwlist命令去扫描当前环境中的wifi名
sudo iwlist [wifi网口设备名] scanning | grep -i ssid
eg: sudo iwlist wlp3s0 scanning | grep -i ssid
使用nmcli 连接wifi
nmcli device wifi connect [essid] password [password] (ifname wlp3s0)
eg: nmcli device wifi connect TPLINK-WIFI password 8888
nmcli d wifi c TPLINK-WIFI password 8888
会在/etc/NetworkManager/system-connections/下创建配置文件,重复执行则创建多个文件。

3、使用nmcli

打开并指定连接wifi
nmcli connection up [ssid]
eg: nmcli c up TPLINK-wifi
打开wifi
nmcli device con [ssid]
关闭wifi
nmcli connection down [ssid]
eg: nmcli c down TPLINK-wifi

nmcli device dis [ssid]
可以使用nmcli c up TPLINK-wifi连接TPLINK-wifi,使用nmcli c down TPLINK-wifi断开连接TPLINK-wifi,恢复之前连接。

路由查看及配置

查看路由表:路由表的目的是告诉网关,包到达目标地址的下一站。
以下命令都可打印路由表

1.netstat -rn
2.route -n
3.ip route

路由原理-https://www.jb51.net/network/59230.html

静态路由表:
192.168.1.0   255.255.255.0    192.168.2.0
默认路由表:
目的地址         网关			掩码
0.0.0.0         172.18.47.254   0.0.0.0

路由表主要有:目的地址、送出接口/下一跳地址、目标地址局域网掩码
目的地址:要连接的目标主机的ip地址
下一跳地址:目标地址的网关所用的ip,这个ip是该网关所连接它的路由器的lan口ip,不是自定义的xxx.1

0.0.0.0 表示对应所有目的地址,都通过访问172.18.47.254来解析地址并中转;此为默认路由,默认路由也是静态路由的一种。
https://blog.51cto.com/zhaoyuqiang/1177924

添加路由
ip router [目的ip] [目的掩码] [目的ip连接路由器ip]

关于集线器,交换机,路由器的区别
https://www.bilibili.com/video/BV1LC4y187Ew?t=398
集线器:广播消息到所有连接到集线器上的设备,使用场景小,耗流量,占带宽
交换机:工作用链路层,能够解析协议第二层mac地址,查找对应连接设备mac地址表,实现对点转发消息,效率高,常和路由器连用。只能转发连接到交换机的设备。
路由器:智能设备,工作在ip层,解析网络第三层ip地址及路由表,实现消息的智能转发。能够实现跨网转发包

查看端口占用信息

netstat -tunlp 查看端口号的占用信息,可以打印出占用程序及程序ID
以下来自https://blog.youkuaiyun.com/tjzhuorui/article/details/70641922
netstat [options]

-a 显示所有项
-n 将能显示成数字的显示成数字,比如 Local Address,若不使用-n,有可能显示的是你的机器名;但使用-n,则显示的是127.0.0.1
-t 显示所有tcp的
-u 显示所有udp的
-p 显示程序名以及pid

ps -ejHf | grep 441 查看进程执行信息
lsof -i [端口号]
查看ssh端口开放状态
netstat -anp |grep 22
netstat -anp |grep ssh
lsof -i :22
抓取报文
**tcpdump可抓取tcp/udp包,也可查看端口的绑定(bind)情况。
eg: tcpdump -i any -nn 'port 9002' -vv -X

-i interface,网卡的名称,后面可以跟具体的网卡名称(ifconfig后者tcpdump -D)获取,any似乎是指所有的网卡
-nn 监听host或者port名,ip地址为127.0.0.1,端口为9002的服务器的数据包,那么命令可以写成-nn ‘src host 127.0.0.1 and port 9002’,有端口就可以。
-vv 详细信息
-X 以16进制的格式输出

服务/进程管理

kill命令不止用来结束进程,也可以给指定进程发送对应的信号
kill -l 可查看系统的信号的缩写及对应号,如11) SIGSEGV
ps未显示进程被报仍在运行进程,可能是/var/run下还有对应的xxx.pid文件,删除即可
kill 给process传信号,可以是TERM, STOP等,传的是PID
pkill 功能和kill差不多,只不过传的是process的名字或者是属性,而且支持grep格式
eg.pkill -kill -u [username]
或者:pkill -u [username]
skill 其实和snice是一样的,改变process的nice值,也可以传TERM, STOP等信号。
killall 传的是名字,处理同样名字的所有进程。

linux进程信息

/var/run下存放xxx.pid是关于进程的pid信息
/var/log下存放xxx.log是关于进程的log信息

service & systemctl
service命令其实是去/etc/init.d目录下,去执行相关程序
usage:
service --status-all 列出管理应用
service name option
option: [start\stop\restart]
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl
usage:
systemctl [options] name.service

option: [start\stop\restart\status]

列出服务:systemctl list-units

“service” 和 “systemctl” 都是与 Linux 系统中的服务管理相关的命令,它们用于启动、停止、重启或查看服务的状态。

  1. service 命令
    service 命令用于启动、停止或重启系统中的服务。它是较旧的服务管理工具,适用于一些基于 SysVinit 的系统(例如 CentOS 6 或 Ubuntu 14.04 之前的版本)。它简化了服务的管理操作,使用起来比较直观。

    常用命令

    • 启动服务:service <service_name> start
    • 停止服务:service <service_name> stop
    • 重启服务:service <service_name> restart
    • 查看服务状态:service <service_name> status
  2. systemctl 命令
    systemctl 是较新的服务管理工具,适用于 systemd 系统初始化和管理工具(如 CentOS 7+,Ubuntu 16.04+)。systemd 替代了较旧的 SysVinit 和 Upstart 系统,并且提供了更强大的功能和更细粒度的控制。

    常用命令

    • 启动服务:systemctl start <service_name>
    • 停止服务:systemctl stop <service_name>
    • 重启服务:systemctl restart <service_name>
    • 查看服务状态:systemctl status <service_name>
    • 启动服务并开机自启:systemctl enable <service_name>
    • 禁止服务开机自启:systemctl disable <service_name>
    • 查看所有服务状态:systemctl list-units --type=service

总结:

  • service 适用于较老的系统,或者是兼容旧式 init 系统的服务管理工具。
  • systemctl 是现代 Linux 发行版中使用的工具,基于 systemd,更加强大且功能丰富。

软件包管理

更换pip源到国内镜像

pip

阿里云 https://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

临时使用镜像源:
eg:pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

永久修改:
linux:
修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
opencv

opencv版本号查看
pkg-config opencv --modversion

opencv常用cmake配置

cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
\
-DWITH_CUDA=OFF \
\
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
..
dpkg

dpkg -i packagename 安装软件包
dpkg -r packagename 移除软件包
dpkg -S packagename 查看插件属于哪个软件包
dpkg -l packagename 查看软件包信息

如果是apt install的软件,可直接用命令
dpkg -S softwarename 显示包含此软件包的所有位置
dpkg -L softwarename 显示安装路径,包括库,头文件,cmake文件等,也可查看apt install的包的安装路径。

apt

查看已安装得软件包版本,也可使用dpkg -l packagename
sudo apt-get install apt-show-versions
apt-show-versions 查看所有安装包版本
apt-show-versions –p <package> 查看指定安装包的版本
apt-show-versions –u 查看可更新包

apt-cache madison pacname查询仓库中软件的所有版本
apt-cache show pacname | grep -i version 查看版本信息
apt-cache show depends paname 查看包依赖。apt show pacname也可打印出包依赖关系
apt-get -y install pacname 免去回答yes安装pacname
apt-get -y install pacname=version 安装指定版本
apt-get install -s pacname 模拟安装软件

apt-cache search packagename 搜索软件包

apt install packagename 安装软件包
apt install --reinstall packagename 重新安装软件包

apt remove packagename 卸载软件包
apt list pacname 列出软件清单
apt show pacname 显示软件包信息
apt search pacname 搜索相关软件包

apt list|gerp pacname 查看pacname相关的安装情况

apt autoremove 卸载所有自动安装且不再使用的软件包
apt purge pacname 卸载并清除软件包的配置

查看安装包文件

whereis <pacname>
locate <pacname>
查看可执行文件位置
which <exe_name>

pkg-config 使用

Ubuntu 16.04 下pkg-config的安装与简介
pkg-config提供相应库的路径、版本号等信息的程序

pkg-config  查看gcc的CFLAGS参数
pkg-config --libs --cflags opencv
#查看版本
pkg-config opencv --version
#使用pkg-config添加编译参数
g++ `pkg-config --libs --cflags opencv` -ldl xx.cpp
g++ `pkg-config eigen3 --libs --cflags` xx.cpp
g++ $(pkg-config --libs --cflags opencv) xxx.cpp -o xxx
g++ `pkg-config opencv --cflags` xxx.cpp  -o xxx `pkg-config opencv --libs

缺省情况下,pkg-config首 先在prefix/lib/pkgconfig/中查找相关包(譬如opencv)对应的相应的文件(opencv.pc)

在linux上上述路径名为 /usr/lib/pkconfig/
若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。
查找软件版本号
pkg-config --modversion <pacname>

查看所有软件包安装情况
pkg-config --list-all

查看linux安装的镜像

dpkg --get-selections |grep linux-image
dpkg -l |grep linux-image

update-alternatives安装包版本切换

update-alternatives命令的几个主要选项为:display、install、remove、config、list。

以python为例:
安装多版本python

#查看python文件位置
whereis python

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /home/lxp3/anaconda36/bin/python python /home/lxp3/anaconda36/bin/python3.6 2
sudo update-alternatives --install /home/lxp3/anaconda3/bin/python python /home/lxp3/anaconda3/bin/python3.5 3
#查看当前python安装表:
update-alternatives --list python
#切换当前python:
sudo update-alternatives --config python

删除指定包:
sudo update-alternatives --remove python /usr/bin/python2.7 1

关键安装问题解决

/var/lib/dpkg下的文件存放所有安装包信息,info下存放包的校验值等,status存放安装信息,请不要暴力删除,会出现整体安装的刷新及重新配置

Q1:files list file for package ‘xxx’ missing; assuming package has no files currently installed
R1:sudo apt install --reinstall pcname, 根据情况添加-f,–fix-missing。
Q2:以上重装不行,报trying to overwrite ‘xxx’, which is also in package xxx
R2:
sudo dpkg-i --force-overwrite /var/cache/apt/archives/sysvinit_2.88dsf-41+deb7u1_amd64.deb #手动在缓存里面安装 sysvinit_2.88dsf-41+deb7u1_amd64.deb
sudo apt full-upgrade

文件类

rename 批量修改文件名

rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

-v (verbose)打印被成功重命名的文件
-n (no-act)只是显示将被重命名的文件,而不重命名(重命名之前可以用-n确认
需要重命名的文件)
-f (force)覆盖已经存在的文件
perlexprPerl语言格式的正则表达式
files需要被替换的文件(比如*.c、*.h, *所有文件),如果没给出文件名,将从标准输入读

eg:
rename -v 's/$/.txt/' * 将当前路径下的所有文件加上.txt后缀
将当前路径下的所有txt文件名中的str1替换成str2:
rename -n 's/str1/str2/' *.txt  /确认需要重命名的文件/
rename -v 's/str1/str2/' *.txt  /执行修改,并列出已重命名的文件/
rename 's/str1/str2/' *.txt   /执行修改,不列出信息/
rename 'tr/abcd/edf/' asbycz.txt /指定替换字符规则/ a->e b->d c->f d->f

asbycdz.txt renamed as esdyddz.txt

rename参考博文

find&rename联用
将所有含有str1的文件/目录,改名为含str2,即将str1替换为str2
find -type [f/d/*] | grep 'str1' | xargs rename 's/str1/str2/'
f: 文件
d: 目录
*:所有文件(文件及目录)

find -name *str* | xargs rename 's/str1/str2/'

examples:
文件改名
foo1, foo2, foo3 =>bar1, bar2, bar3
$ find -type f | grep 'foo' | xargs rename 's/foo/bar/'
文件夹改名
foo1, foo2, foo3 =>bar1, bar2, bar3
$ find -type d | grep 'foo' | xargs rename 's/foo/bar/'
递归重命名全部:
$ find -type * | grep ‘foo’ | xargs rename ‘s/foo/bar/’
如果文件夹有多层子目录的话,也需要手动执行多次。

来自:http://www.360doc.com/content/13/0307/17/8065943_270000799.shtml

ls 按指定顺序排布文件

ls -alt # 按修改时间排序
ls -alc # 按创建时间排序
ls -alu # 按访问时间排序
find . -name *.php|xargs ls -alt# 查找指定类型的文件,指定按时间排序

nautilus终端下指定路径打开文件管理器GUI

nautilus $PWD使用文件管理器打开当前目录
nautilus是GNOME桌面下的一个文件管理工具。 通过这个命令我们可以在终端下非常方便的打开指定目录的文件。

xargs

xargs命令的作用,是将标准输入转为命令行参数。
$ echo "hello world" | xargs echo
hello world
$ echo "one two three" | xargs mkdir

取消patch

patch -R 是反打patch,就是将打完patch的文件恢复到打patch之前。
eg:设剥离一层目录。
patch -Rp1 > xxx.patch
打patch
patch -p1 > xxx.patch

带单位显示文件大小

ls -lh 以K、M、G显示文件大小

删除除指定文件(file1)以外文件

rm -fr !(file1)

unzip 解压中文乱码的问题:

#指定GBK GB18030编码也是可以的
unzip -O GBK 资料.zip

挂载与卸载mount与umount:

mount -rw /dev/xxx path :将/dev/xxx 挂载到path下
umount path :卸载path对应的设备
举例:将U盘挂载到/mnt/tmp下

  1. sudo fdisk -l: 查看分区情况,找到U盘对应的设备名(对应大小和文件系统FAT32),这里为/dev/sda1
  2. sudo mount -rw /dev/sda1 /mnt/tmp 挂载
  3. 可再/mnt/tmp下查看U盘内容

Linux系统挂载存储只读改成读写

  1. 用于查看哪个模块输入只读,一般显示为:
    [root@ubuntu ~]# mount

/dev/cciss/c0d0p2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/dm-0 on /home/book/upload/BookFile1 type ext3 (rw)
/dev/dm-1 on /home/book/upload/BookFile2 type ext3 (rw)
/dev/dm-2 on /backup type ext3 (rw)
/dev/dm-3 on /home/book/upload/BookFile3 type ext3 (ro)

  1. ro是只读,rw是可读写
  2. umount /dev/dm-3
    如果发现有提示“device is busy”,找到是什么进程使得他busy
    fuser -m /mnt/data 将会显示使用这个模块的pid
    fuser -mk /mnt/data 将会直接kill那个pid
    然后重新mount即可。
  3. 还有一种方法是直接remount,命令为mount -o rw,remount /mnt/data。
    注意’,'号。
    可读写文件系统修改为只读的,方法类似,只不过mount时候的rw改为ro就好了。
添加开机自启动脚本
sudo mv test.sh /etc/init.d/
#给文件增加权限
chmod +750 test.sh
#设置开机自动启动
sudo update-rc.d test.sh defaults
#开机自动化脚本就完成
du&df查看文件夹大小

df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。

du可以查看文件及文件夹的大小。

du
max-depth参数表示指定深入目录的层数,很重要,不指定的话,会显示所有层次目录

du -h --max-depth=1 /usr   
1.8G    /usr/share   
614M    /usr/lib   
8.0K    /usr/etc   
2.1M    /usr/kerberos   
24K     /usr/X11R6   
14G     /usr/local   
37M     /usr/libexec   
35M     /usr/sbin   
224M    /usr/include   
    [root@localhost /]# du -h --max-depth=1 /usr   

rsync
https://blog.youkuaiyun.com/jiangyu1013/article/details/79754060
rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

Local:  rsync [OPTION...] SRC... [DEST]
 
Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
 
Access via rsync daemon:
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

由此语法可知,rsync有三种工作方式:
(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
(2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
(3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。
前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。
(1).将/etc/fstab拷贝到/tmp目录下。

[root@xuexi ~]# rsync /etc/fstab /tmp

(2).将/etc/cron.d目录拷贝到/tmp下。

[root@xuexi ~]# rsync -r /etc/cron.d /tmp

"–existing"选项使得只更新目标端已存在的文件。
"–remove-source-files"删除源端文件。
"–exclude"选项指定排除规则,排除那些不需要传输的文件。
“–delete"选项后,接收端的rsync会先删除目标目录下已经存在,但源端目录不存在的文件。也就是"多则删之,少则补之”。

find

find -name [filename],根据文件名查找文件
which [exec_tool],查看命令工具(python)使用的绝对路径
locate [filename],等同于find -name [filename],直接搜寻数据库,速度更快。

find忽略查找路径
find -path "./mnt" -prune -o -name "*eigin*"
""可以不加, -o不能省略

find -path pathname -prune 用来指定忽略查找路径。

如果要忽略两个以上的路径如何处理?

find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune …加上寻找条件
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune -o -name filename
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune -o -type f -name “*.conf” -print
注意/( 和/) 前后都有空格。

查找文件并删除
find / -name "*.mp3" |xargs rm -rf

grep

Usage:grep opts 待搜索字符 文件名
eg: grep -n str main.cpp 查找main.cpp 中的str字符,列出对应行号
grep -rn str 在当前文件夹下以及子文件夹下的文件中递归查找str
grep -ln str * 在当前文件夹下查找str字符串,并输出对应文件及行号
-l 输出文件名
-n输出包含查找字符串的行号
-r表示递归查找当前文件夹及子文件夹下的所有文件

grep ‘^…$’ 是指, 匹配整个这个行中, 以什么开头, 以什么结尾. 指的是整行, 不是某个单词.
grep -w (word) 指的是匹配整个单词, 而不能是单词的一部分
grep -rn “xxx” --exclude-dir=dirname,在dirname之外的目录查找
grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行
grep -B 5 foo file 显示foo及前5行
grep -A 5 foo file 显示foo及后5行

与sed 或者mv等命令结合使用
mv `grep -l Eigen *` eigen/移动包含Eigen字符的当前文件夹下的所有文件到eigen目录下

sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /dir`

替换dir下所有文件中的zhangsan为lisi,详见sed使用。

ag查找文件及文字

使用ag 命令来查找文件和字符:

sudo apt-get install silversearcher-ag

常用:
在file文件中查找text字符相关行:

ag 'text' file

查找文件:
ag -g <File Name> 类似于 find . -name <File Name>

忽略某些文件目录进行搜索:

ag --ignore-dir <Dir Name>
修改文件权限及拥有者

修改文件夹及子文件拥有者及用户组
chown -Rh owner:owner dir 修改拥有者及组
chown -Rh owner dir
chgrp -Rh group dir
-R 递进操作(recursive),使操作生效于子目录及文件。
-h 使操作生效于链接文件。

修改可执行文件的执行权限

chmod命令+s参数解释如下:
chmod +s 就是给某个程序或者脚本以suid权限
“为了方便普通用户执行一些特权命zd令,SUID/SGID程序回允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。”
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
原来只有某用户可以执行httpd这条命令, u+s后其他用户都可以使用httpd这个命令,都可享有指定+s的文件属主的权限。
chmod u+s file 就是给file程序的所有者以suid权限,可以像root用户一样操作。

cp

拷贝目录使用 -r

(星号* 配合 -r)
cp -r /tmp/src/* /tmp/dest 星号(*)对隐藏文件无效

需要隐藏文件时:(点号.配合-r)
cp -r /tmp/src/. /tmp/dest

cp的时候有重复的文件需要覆盖时会让不停的输入yes来确认,可以使用yes|
yes|cp -r /x y

想使用CP拷贝一个大目录(/home/study/test),但又不想拷贝其中的一个子目录(/home/study/test/test1),应该如何写命令行
cd /home/study/test
rsync -av --exclude test1/ --exlclude test2/ ../test/ /home/copydir

dd

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

eg. 将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
将image恢复到指定盘,烧写image
dd if=/root/image of=/dev/hdb
将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
Linux dd命令

SD卡镜像备份
在linux系统下用读卡器读取sd卡
df -h命令看分区的路径,一般都是/dev/sdb1或者/dev/sdc2之类的
备份命令为:
sudo dd if=/dev/sdb of=/home/Rpi_backup.img
也有:sudo dd if=SD卡路径 | gzip>镜像文件保存路径
这里根据自己的实际情况修改命令,sdb即为整个sd卡,后面不带数字

SD卡镜像恢复
在Windows系统下用Win32DiskImager烧写sd卡
在Linux系统下用命令恢复:
sudo dd if=/home/Ppi_backup.img of=/dev/sdb
对应也有sudo dd if=SD卡路径 | gzip>镜像文件保存路径

SD卡格式化
fdisk /dev/sxx
输入 d 进行删除分区,分区全部删除后,输入 w 保存并退出。`

mkdir

mkdir -p t/t1/t2
-p 会创建路径中的所有尚不存在的目录。若所有目录都存在,不报错,不创建。

目录之间的切换cd\pushd\popd

需要在两个或多个不同目录频繁切换:
cd -可以直接返回上一个目录
pushd 后加<path>:在目录栈中指定<path>目录,并切换到<path>下:
pushd \<path\>
pushd 单独使用,能够调换栈顶目录和下一目录:
pushd

pushd使用介绍:push +2 返回栈顶下两层的目录;用于3个目录相互跳转;当前目录永远是栈顶目录。
pushd [-n] [+N | -N | 目录]

popd 将当前目录推出目录栈:
popd
演示:
在这里插入图片描述

stat查看文件信息

stat [File] 查看File的编辑信息(创建事件等)

lsof

lsof查看文件占用情况
经常会遇到删除文件或者弹出U盘等设备时,提示设备占用,使用lsof可查看文件或设备(linux系统中设备即文件)占用情况(程序名,pid等信息)。
lsof [filename]
以下参考https://www.jianshu.com/p/a3aa6b01b2e1

lsof abc.txt 显示开启文件abc.txt的进程
lsof -c abc 显示abc进程现在打开的文件
lsof -c -p 1234 列出进程号为1234的进程所打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
              --> IPv4 or IPv6
              protocol --> TCP or UDP
              hostname --> Internet host name
              hostaddr --> IPv4地址
              service --> /etc/service中的 service name (也可以是port id)

lsof -iTCP 显示TCP连接(同理可获得UDP连接)
lsof -i -sTCP:LISTEN找出监听端口
lsof -i@172.16.12.5:22 使用@host:port显示基于主机与端口的连接

fuser

用来显示所有正在使用着指定的file, file system 或者 sockets的进程信息。
c:current directory. 指示进程的工作目录。
e:executable being run. 指示该文件为进程的可执行文件(即进程由该文件拉起)。
f:open file. 指示该文件被进程打开,默认情况下f字符不显示。
F:open file for writing. 指示该文件被进程打开进行写入,默认情况下F字符不显示。
r:root directory. 指示该目录为进程的根目录。
m:mmap’ed file or shared library. 指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。

fuser(opts)(pram)

opts
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。
pram:文件名、文件系统或TCP、UDP端口号

eg: 列出占用/mnt/tmp的用户名及进程
fuser -mu /mnt/tmp/

wc统计输出行数

ls -l |wc

head & tail

head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录。
使用-n可指定显示几行。
head -25 file 显示file前25行。
tail -25 file 显示file后25行。tail +25 file 从25行开始显示到结尾。

通过组合head和tail组合显示文本对应的行。如:
head -408 xxx.cpp | tail -8 显示xxx.cpp的400到408行
tail +400 xxx.cpp |head -8 同样显示xxx.cpp的400到408行。

其中,$1表示第一列

readelf查看二进制文件信息

readelf可以查看二进制文件
readelf -h filename 查看二进制文件头,包括适用的系统版本及平台
readelf -d xxx.so 查看so共享库的依赖信息。
在这里插入图片描述

patchelf 更改二进制文件

更改依赖:
patchelf --replace-needed libm.so.6 libm.so libcholmod.so 将libcholmod.so对 libm.so.6的依赖变为lib.so
更改soname:
patchelf --set-soname libnewname.so path/to/libmylibrary.so
参考:修改so库中的依赖名

查看二进制依赖库文件信息

共享库so依赖

  1. 使用ldd查看二进制文件依赖的库文件信息
    ldd libindemind_module.so
  2. 使用readelf 查看
    readelf -d xxx.so

静态库查看:
2. 查看文件:ar -t *.a
3. 查看函数、变量:nm *.a

符号表打印:
nm -D 7z.so
objdump -tT 7z.so

分卷压缩及解压

https://blog.youkuaiyun.com/baggio1006/article/details/17503113
分卷压缩:

tar cvzf - name | split -b 500m -d - name.tar.gz #分卷压缩name目录,并保持每个压缩包的大小不超过500m字节。命令执行后,会生成name.tar.gz00、name.tar.gz01等文件,注意此处name及name.tar.gz中的name要保持一致。

-表示默认处理。
关于split:
split -n 2 name.tar.gz name1.tar.gz可以将name.tar.gz拆分成两个name1.tar.gz00及name1.tar.gz01,但是此命令不能用于还为生成的文件(不能使用管道tar cvzf - name | split -n 2 -d - name.tar.gz不能执行)。

分卷解压:
cat name.tar.gz* | tar -zxvf - #将各个分卷压缩包解压到当前目录
cat name.tar.gz* > name.tar.gz #将各个分卷压缩包合成为一个name.tar.gz文件

tr 字符转换和删除工具

tr(translate 或 transliterate 的缩写)是 Linux/Unix 系统中一个强大的字符转换和删除工具,用于处理文本流中的字符替换、删除和压缩操作。

当对环境变量等进行操作:

#列出环境变量
echo $LD_LIBRARY_PATH | tr ':' '\n'
tr [选项] SET1 [SET2]
  1. 字符替换(一对一映射)
# 将小写字母转换为大写
echo "hello world" | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD

# 替换特定字符
echo "abc" | tr 'abc' '123'
# 输出:123
  1. 字符删除
# 删除所有数字
echo "phone: 123-4567" | tr -d '0-9'
# 输出:phone: -

# 删除所有元音字母
echo "ubuntu" | tr -d 'aeiou'
# 输出:bnt
  1. 字符压缩(删除连续重复字符)
# 压缩连续空格
echo "too    many    spaces" | tr -s ' '
# 输出:too many spaces

# 压缩连续相同字符
echo "coooooool" | tr -s 'o'
# 输出:cool
  1. 字符补集操作
# 删除所有非数字字符
echo "ID: A123B456" | tr -cd '[:digit:]'
# 输出:123456

# 保留字母和空格
echo "Hello! How are you? 123" | tr -c '[:alpha:] \n' ' '
# 输出:Hello  How are you

常用选项详解

选项功能示例
-d删除 SET1 中的字符tr -d 'aeiou'
-s压缩 SET1 中的重复字符tr -s ' '
-c使用 SET1 的补集tr -cd '0-9'
-t截断 SET1 使其长度与 SET2 匹配tr -t 'abc' '12'
字符集描述等效表示
[:alnum:]字母和数字a-zA-Z0-9
[:alpha:]字母a-zA-Z
[:digit:]数字0-9
[:lower:]小写字母a-z
[:upper:]大写字母A-Z
[:space:]空白字符(空格、制表符、换行等)
[:punct:]标点符号
\n换行符
\t制表符

注意

  1. 区分大小写tr 严格区分大小写

  2. 集合长度匹配

    # SET1 比 SET2 长时,多出字符映射到 SET2 最后一个字符
    echo "abcdef" | tr 'abcde' '12'
    # 输出:122222(e映射到2)
    
  3. 字符顺序:操作基于字符顺序而非单词

    echo "banana" | tr 'na' 'xy'
    # 输出:bxyxyx(不是单词替换)
    
  4. 不支持正则表达式tr 只能处理单个字符,不能处理模式匹配(使用 sed 处理复杂模式)

使用建议:对于简单的字符级转换(特别是删除或压缩字符),tr 是最简洁高效的选择;对于更复杂的文本操作,建议使用 sedawk

sed 指定文本内容替换

sed -i 's/ori_str/new_str/' file 将file中每行第一个ori_str替换 为 new_str
sed -i 's/ori_str/new_str/g' file 将file中所有ori_str替换 为 new_str
sed -i 's/ori_str/new_str/2' file 将file中第二个ori_str替换 为 new_str
sed -i 's/ori_str/new_str/2g' file 将file中第二个到最后的ori_str替换 为 new_str
sed -i '1i 1111' file file中第一行插入1111
sed -i '$i 1111' file file中最后一行前插入1111
sed -i '$a 1111' file file中最后一行插入1111

sed -i '$a 1111';'$a 1111' file 连用

多文件替换
https://blog.51cto.com/tangming/6025745

sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /dir`

解释一下:
替换dir下所有文件中的zhangsan为lisi

-i 表示inplace edit,就地修改文件
-r 表示搜索子目录
-l 表示输出匹配的文件名

删除:
sed '2d' file-----删除file文件的第二行。
sed '2,$d' file-----删除file文件的第二行到末尾所有行。
sed '$d' file-----删除file文件的最后一行。
sed '/test/'d file-----删除file文件所有包含test的行。

数据处理

awk

awk 是一个强大的文本处理工具,广泛用于 Unix 和 Linux 系统中。它能够根据模式匹配和条件处理文本文件。以下是一些常用的 awk 使用技巧:
awk 首索引是1 不是0

  1. 基本语法
awk '条件 {动作}' 文件
  • 条件:指定处理的行。
  • 动作:对满足条件的行执行的操作。
  1. 选择特定列
    通过 $ 符号来选择特定列。
awk '{print $1, $3}' 文件   # 打印第一列和第三列
  1. 进行条件判断
    可以使用 if 语句进行条件判断。
awk '{if ($1 > 10) print $0}' 文件  # 打印第一列大于10的整行
  1. 使用内置变量
    awk 提供了许多内置变量,例如:
  • NR:当前记录的行号。
  • NF:当前行的字段数量。
awk '{print NR, NF}' 文件  # 打印每行的行号和字段数
  1. 字符串操作
    awk 可以轻松处理字符串。
awk '{print toupper($1)}' 文件  # 将第一列转换为大写
  1. 进行数学运算
    可以进行算术运算。
awk '{sum += $1} END {print sum}' 文件  # 计算第一列的总和
  1. 使用分隔符
    可以指定字段分隔符。
awk -F ',' '{print $1}' 文件  # 使用逗号作为分隔符
  1. 处理多个条件
    可以使用逻辑运算符处理多个条件。
awk '$1 > 10 && $2 < 5' 文件  # 同时满足两个条件的行
  1. 输出格式化
    使用 printf 进行格式化输出。
awk '{printf "Name: %s, Age: %d\n", $1, $2}' 文件  # 格式化输出
  1. 管道和重定向
    awk 可以与其他命令结合使用,处理管道数据。
cat 文件 | awk '{print $1}'  # 通过管道读取数据
  1. 处理特定行
    可以使用 NR 来处理特定的行。
awk 'NR==1 {print $0}' 文件  # 打印第一行
  1. 读取多个文件
    awk 可以同时处理多个文件。
awk '{print FILENAME, $0}' 文件1 文件2  # 输出文件名和行内容

示例
假设有一个文件 data.txt 内容如下:

Alice 25
Bob 30
Charlie 35
  1. 打印第二列

    awk '{print $2}' data.txt
    
  2. 打印年龄大于30的行

    awk '$2 > 30' data.txt
    
  3. 计算年龄的总和

    awk '{sum += $2} END {print sum}' data.txt
    
  4. 将姓名转换为大写并打印

    awk '{print toupper($1)}' data.txt
    
  5. awk 计算均值

使用 awk:awk 是一种强大的文本处理工具,能够轻松计算第二列的均值。

计算data文件第一列的均值:

cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}' 

计算data.txt第二列均值

awk '{ sum += $2; count++ } END { if (count > 0) print sum / count }' data.txt

加入低通

awk '$2 <= 1.0 { sum += $2; count++ } END { if (count > 0) print sum / count }' data.txt

代码解释
sum += $2:累加第二列的值。
count++:计数每行。
END { if (count > 0) print sum / count }:在处理完成后,输出均值。

使用 paste 和 bc计算均值:先提取第二列再计算均值,使用 cut 和 bc:

cut -d ' ' -f 2 data.txt | paste -sd+ - | bc | awk '{print $1/NR}'

代码解释
cut -d ' ' -f 2 data.txt:提取第二列。
paste -sd+ -:将第二列的所有值用 + 连接成一个字符串。
bc:计算总和。
awk '{print $1/NR}':使用 NR(行数)计算均值。

md5sum校验文件

md5sum filename可读取filename生成哈希值。
校验两个文本是否一致,可以对比哈希值是否一致。

用户操作

查看组及组成员
groups 查看当前登录用户的组内成员
groups gliethttp 查看gliethttp用户所在的组,以及组内成员
whoami 查看当前登录用户名
/etc/group文件包含所有组

注销用户
pkill -kill 指定发送kill信号,-u指定uid
pkill -kill -u [username]

gnome-session-quit --logout --no-prompt

切换root用户
sudo su 和 sudo -s都是切换到root用户,不同的是:
sudo su 环境用的是目标用户(root)的环境
sudo -s 环境用的是当前用户本身的环境
查看用户登录情况
who可查看目前登录情况
last命令查看最近登录情况
lastlog命令查看各个用户登录情况
cat /var/log/auth.log文件,分析用户登录及行为。
cat /home/{username}/.bash_history查看用户的操作记录

创建新用户并添加root权限
sudo adduser username
注意区分adduser与useradd
添加用户root权限

  1. 修改配置文件
    vim /etc/sudoers
    修改文件如下:

# User privilege specification
root ALL=(ALL) ALL
username ALL=(ALL) ALL

  1. 将用户添加到sudo组
    usermod -a -G sudo suveng //注意改成你自己的用户名
    列出所有用户
    cat /etc/passwd |cut -f 1 -d :
    注意:useradd adduser 都能用,useradd没有在home下生成用户对应的目录。adduser可以用来将用户添加到指定组。
    添加用户:useradd -m 用户名 然后设置密码 passwd 用户名
    删除用户:userdel -r 用户名

** adduser与useradd区别**
useradd:
“useradd +用户名” 不会在/home目录下创建同名文件夹,也没有创建密码;因此不能使用该用户登录。
使用 “useradd -m +用户名” 方式创建,可在/home目录下创建同名文件夹,然后利用 " passwd + 用户名" 为指定的用户名设置密码。
adduser:
“adduser +用户名” 直接在/home目录下会自动创建同名文件夹。

删除用户,只需使用一个简单的命令“userdel 用户名”即可。不过最好将它留在系统上的文件也删除掉,你可以使用“userdel -r 用户名”来实现这一目的。

sudo 免密用于脚本需使用sudo
https://blog.youkuaiyun.com/u011596455/article/details/76944065
sudo visudo
修改这一样,让所有sudo指令免密

xxx ALL=(ALL:ALL) NOPASSWD: ALL

[解决:Jenkins sudo:抱歉,您必须拥有一个终端来执行 sudo]
https://blog.youkuaiyun.com/fst438060684/article/details/80984233
那么第一个思路就是免密使用sudo了,假设我使用jenkins的账户是xdq,那么我用root账户 修改/etc/sudoers(或sudo visudo)的配置,添加如下两项:
xdq ALL=(ALL) NOPASSWD: ALL
Defalults:xdq requiretty

后台命令

将任务放至后台运行
命令后加&
$ ./test.sh &

将已执行程序暂停/运行在后台
ctrl+z快捷键可直接将当前程序暂停在后台。
vi t.txt
ctrl+z后将vi暂停在后台,终端输入fg命令可直接重新调起。

jobs

jobs命令可以查看后台任务运行情况;
jobs -l 命令可显示执行任务的pid;
使用 fg 任务序号 可直接重新调起对应的后台任务;
使用bg 任务序号 可将后台暂停程序在后台运行。

linux后台执行命令

command > out.file 2>&1 &

command > out.file &
将command输出重定向到out.file中   将错误信息输出到屏幕   &符号可将命令放于后台执行
使用nohup使进程执行时不被hup信号中断(在服务器上运行模型时用,放置ssh断开连接后,程序被退出)。
nohup command >out.file 2>&1 &

bash终端log重定向

将所有输出都重定向到文件中,标准输出和错误都重定向到文件中:

[cmd] > log.txt 2>&1

解释:

本来1----->屏幕 (1指向屏幕)
执行>log后, 1----->log (1指向log)
执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)

此外不挂断的运行指令(后台运行指令),并将输出全部重定向到文件 nohup 和&的联合应用

nohup [Cmd] > log.txt 2>&1 &

可使用jobs查看后台运行的程序。

输出到文件logfile中,log信息不在屏幕显示
cmd > logfile
输出到文件logfile中,并在屏幕上显示:
cmd | tee logfile
cmd >&1 | tee logfile 将cmd的输出到终端,且将终端输出打印到log文件
追加输出到文件logfile中,并在屏幕上显示:
cmd >&1 | tee -a logfile
>后边加&表示后边跟的文件描述符,不是文件名,如>&1 重定向到标准输出(屏幕)
将命令正确执行和错误的输出结果都保存到文件log.log:
cmd 2>&1 | tee log.log -a

tee命令用于读取标准输入的数据,并将其内容输出成文件。

将终端的输出信息保存到log中:
sudo script screen.log
之后你在终端输入的相关命令,及终端的所有输出信息都被保存到screen.log文件中,然后执行以下命令,停止保存:
exit

Vim

在命令界面(esc不能编辑文本),在当前行任意位置,摁o键直接进入编辑页面并回车。

命令

直接输入Q 进入Ex模式,输入:vi恢复到vi模式。Ex模式下用来指定行进行操作。
vim底层实现基于ex,是可视化的ex。

vim查找字符串忽略大小写:
1)查找时使用\c参数。进入底行模式,输入命令“/string\c ” 或 “/\cstring”,将会忽略大小写查找string字符串。
注意:\c与字符串之间不要有空格,因为该空格也会被认为是查询的字符串
2)通过设置vim配置来忽略大小写查找。
set ignorecase 或 set ic 忽略大小写查找
set noignorecase 或set noic 严格大小写查找

:set nu 显示行号
:set hlsearch 高亮显示搜索结果

:vs xxx 竖栏显示xxx文件
ctrl+w x 交换左右栏显示,先同时嗯ctrl及w,然后放手,再摁下x,下同
:sp xxx 横栏显示xxx文件
使用ctrl+w 上下左右键切换文件栏目

q:可以显示vi的历史记录(注意无冒号)
:f 可以显示当前文件名
:pwd 可以看当前的详细路径,这个用ctrl+z也可以将vi放后台查看。
:Ex 横排打开栏,当前文件所在的目录
:Ve 竖排打开栏,当前文件所在的目录

:se list 显示文件的空格。
:set encoding = utf-8 只改变 Vim 内部的文本处理编码,不保存。
:set fileencoding=gbk 修改并保存文件编码

正则表达式

https://www.cnblogs.com/PegasusWang/p/3153300.html

删除指定行操作

指定行号删除:
:[start],[end]d删除从start到end行。d表示删除。
eg:删除从3到5的行:3,5d

代指符号:
.(点)代表当前行。
$代表最后一行。
%表示所有行。
[^]为反向匹配,用来匹配 不包含括号内字符 的内容。即匹配 不在方括号内列出的字符

使用举例:
:.,$d 删除从当前行到文件末尾。
:.,1d 删除从当前行到文件开头。
10,$d删除第十行到文件末尾。
%d 删除所有行 也可以是:1,$d

在这里插入图片描述
https://blog.youkuaiyun.com/weixin_46932303/article/details/107090796

行末:$
行首:^
空格:\s
行末空格:\s+$
行首空格:^+\s
数字:\d
字符:\c
非数字:\D
.点 是元字符 匹配除换行符以外的任意字符
*星号 是标识重复的意思(重复零次或更多次)

runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次或1次)

:g/str/d删除包含指定字符str的行
:g!/str/d删除不包含指定字符str的行

其他示例:
:g/^#/d删除以#为开头的注释行
:g/^$/d删除空白行
:g/^\s*$/d删除只有空格的空白行
:g/\d\s\d/d删除数字后跟空格再跟数字[222 333]的行
:g/\s*\d\s*\d\s/d删除具有多个空格和数字(矩阵式)[222 333 444]形式的行

使用替换/删除指定字符串

删除指定内容
:%s/\s\+$//:%s/ $//g 删除所有行末空格
:%s/ *$//g%s/\s*$//g删除所有行末的所有空格
:%s/^\s*//g:%s/^ *//g删除所有行首所有空格

删除所有行指定字符后的内容::%s/指定字符.*//g
如删除(后的所有内容::%s/(.*//g
.*用于匹配所有内容:

.点 是元字符 匹配除换行符以外的任意字符
*星号 是标识重复的意思(重复零次或更多次)

:%s/\t/ /g将tab替换成4个空格

:%s/^.\{n\}//删除每行前n个字符
:%s/.\{n\}$//删除每行后n个字符

:%s/指定字符串:.*$//删除每行指定字符后的所有内容
eg: 删除冒号:后的所有内容%s/\:.*$//g

:%s/^M//g去掉代码中的“^M”,注意命令中的^M是使用“CTRL+V CTRL+M”生成,而不是直接键入“^M”。

:s/str1/str2/ 替换当前行第一个 str1 为 str2
:s/str1/str2/g 替换当前行所有 str1 为 str2
:n,\$s/str1/str2/ 替换第 n 行开始到最后一行中每一行的第一个 str1 为 str2
:n,$s/str1/str2/g 替换第 n 行开始到最后一行中每一行所有 str1 为 str2
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/str1/str2/(等同于 :g/str1/s//str2/) 替换每一行的第一个 str1 为 str2
:%s/str1/str2/g(等同于 :g/str1/s//str2/g) 替换每一行中所有 str1 为 str2
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#str1/#str2/# 替换当前行第一个 str1/ 为 str2/

:%s+/str1/str10/+/str2/str20+ (使用+ 来 替换 / ): /str1/str10/替换成/str2/str20/

反向排除替换

  • 使用分组和反向引用
    • 在Vim的替换命令中,s命令用于替换。可以使用\(\)来创建分组,然后通过\1\2等形式进行反向引用。
    • 例如,如果你有一个字符串abcde,想要将abc替换为xyz,但不想替换de,可以这样操作:
      • 假设文本在Vim的缓冲区中,进入命令模式(按下:),输入%s/abc\(de\)/xyz\1/g
      • 这里%表示对整个文件进行操作,s是替换命令,abc\(de\)是匹配模式,其中\(de\)de部分作为一个分组,xyz\1是替换内容,\1引用了前面匹配到的de分组,g表示全局替换(如果有多个匹配的地方都会替换)。
      • 例如%s/sin(r\([xyz]\))/sr\1/gsin(r[x/y/z])替换为sr[x/y/z]。其中x/y/z表示满足三者之一即替换

visual模式对选中文本进行替换
命令模式下,摁v键进入visual模式,选中文本;
输入:下边出现:
:'<,'>
在其后输入s/old/new/g,则可将选中文本中的old都替换成new。
不加g仅替换选中文本每一行的第一个old为new。

使用vi记录功能记录功能用于频繁的相同操作,
如:
在这里插入图片描述
在这里插入图片描述

  1. esc下嗯q+<a-z任意字母>,进入记录模式。
  2. 嗯i开始编辑,编辑完成后,嗯esc,并将光标移动到想要重复操作的行首
  3. 嗯q,退出记录模式,嗯<num>@<a-z刚才嗯的字母>,
    num是要重复几行此操作,@后嗯刚才进入记录模式时输入的字母。
    参考
快捷键

dw 删除一个word
D 删除光标所在到行结束。

可用Esc-v-上下左右键选中字符
~可将选中区域变换大小写
gu 转换选中为小写
gU 转换选中为大写
使用visual模式下选中文字,按U/u切换文字大小写
也可以Esc-gu/U-上下键会将选中变为小/大写

=可以去掉该行缩进/或自动对齐
gg=G对齐所有代码
命令模式下按v键进入visual模式选中代码,按=键可对齐选中代码

定位括号
"{"上按%,即可定位到对应的 “}”
自动补全
插入模式下, ctrl+n或者ctrl+p, 上下键切换,使用空格/回车补全单词, 退出模式
跳跃到上一次光标处
命令模式下嗯两个``可以跳转到上一次光标所在处

条目编号

比如当word粘贴参考文献等,标号消失,可以使用如下方法进行编号:
在 Vim 中自定义行号格式(如 [1](2) 等)可通过以下方法实现:
**方法一:**基于 :let 变量与全局命令
1. 2.

:%s/^/\=printf("%d. ", line('.'))/

[1] [2]

:%s/^/\=printf("[%d] ", line('.'))/

**方法二:**基于 :let 变量与全局命令

:let i=1 | g/^/s//\='['.i.'] '/ | let i+=1
  • 自定义格式:修改单引号内符号即可调整样式,例如:
    • 圆括号:\='('.i.') '(1) (2)
    • 无括号:\=i.'. '1. 2.
  1. i=1:初始化计数器为1
  2. g/^/:全局匹配所有行首
  3. \='['.i.'] ':动态拼接编号格式(此处为方括号+空格)
  4. i+=1:每处理一行后计数器递增
  • 若需跳过空行,改用 g/\S/ 代替 g/^/
ctags c/c++代码调用关系查看
#生成代码tag信息,用来追踪调用关系,-R表示文件夹下的代码进行递归创建tags,这样在存放tags的目录下的vi打开的代码文件可以在所有代码文件间跳转
ctags –R 
#变量名定义查找,直接用vi打开tagname定义代码处
vi –t tagname (请把tag替换为您欲查找的变量或函数名)

#####################以下是在vi中的tag相关使用,“:”开头的命令为VI中命令行模式命令
:ts(ts助记字:tagslist)
:tp(tp助记字:tagspreview)
:tn(tn助记字:tagsnext)
#直接跳到光标所在函数或参数的默认定义处
Ctrl+ ]:注意是按一下ctrl,再按]
#显示tag(光标所在函数/参数)所有定义的列表
g + ] :注意是按一下g,再按]
#跳转返回到上一个定义处查找,即Ctrl+ ]的反跳转
Ctrl+ T

解决关于ctags只能追踪本层目录下的代码

解决办法是在在vim的配置文件 ~/vimrc 添加如下内容:

set tags=tags
set autochdir

使如果源文件在当前文件夹下没有找到tags,可以到它的上层目录下继续寻找。
ctags使用参考

要使用更多tags文件,可以通过改变’tags’选项的设置来引入更多的tags文件。如:
vim下,(ex command) :set tags=./tags, ./…/tags, ./*/tags

调试类

gdb调试C/C++程序

gdb --args /exefile arg1 args2

truss、strace或ltrace
三个调试工具的基本使用方法大体相同,下面仅介绍三者共有,而且是最常用的三个命令行参数:

-f :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
-p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。

使用上述三个参数基本上就可以完成大多数调试任务了,下面举几个命令行例子:
truss -o ls.truss ls -al: 跟踪ls -al的运行,将输出信息写到文件/tmp/ls.truss中。
strace -f -o vim.strace vim: 跟踪vim及其子进程的运行,将输出信息写到文件vim.strace。
ltrace -p 234: 跟踪一个pid为234的已经在运行的进程。

链接:https://www.cnblogs.com/chanix/p/12743848.html

python有调试器pdg,即python debug

当我们使用strace 调试程序发现程序在使用mmap/brk时发生段错误,此时很可能是堆栈溢出,堆栈不够用导致的,可以尝试使用ulimit查看和修改堆栈大小。

ulimit

语  法: ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]

补充说明: ulimit为shell内建指令,可用来控制shell执行程序的资源。

参  数:
-a  显示目前资源限制的设定。
-c <core文件上限>  设定core文件的最大值,单位为区块。
-d <数据节区大小>  程序数据节区的最大值,单位为KB。
-f <文件大小>  shell所能建立的最大文件,单位为区块。
-H  设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小>  指定可使用内存的上限,单位为KB。
-n <文件数目>  指定同一时间最多可开启的文件数。
-p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
-s <堆叠大小>  指定堆叠的上限,单位为KB。
-S  设定资源的弹性限制。
-t <CPU时间>  指定CPU使用时间的上限,单位为秒。
-u <程序数目>  用户最多可开启的程序数目。
-v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。
https://dude6.com/article/284743.html

查看及修改堆栈大小
默认是8182大小。
1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 32767, 即修改为32M
ulimit -s unlimited 设置临时堆栈无限制。
3、可以在/etc/rc.local 内 加入 ulimit -s 32767 则可以开机就设置栈空间大小
4、在/etc/security/limits.conf 中也可以改变栈空间大小
https://zhuanlan.zhihu.com/p/616941834

c代码中:

#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);

https://www.cnblogs.com/lidabo/p/17340999.html

adb 安卓调试
查看系统服务相关信息
adb shell dumpsys -l
adb shell service list
adb shell dumpsys media.camera |head 查看摄像头设备信息

usb转串口使用

  1. 接线方式:GND 对 GND,TX 对 RX,RX 对 TX

minicom使用
安装:
sudo apt install minicom

使用:
sudo minicom

打开波特率端口配置界面
sudo minicom -s
配置好后保存退到首界面,便可以看到log信息。

默认的usb串口节点是/dev/ttyUSB0
ctrl+a z 打开主配置
ctrl+a o 打开串口配置
ctrl+a x 退出

screen
screen 连接串口
screen /dev/ttyACM0 115200
退出终端:
Ctrl+A k

repo

repo stage 用于添加文件到暂存区
使用方法
repo stage -i 可以一步步与用户交替选择要添加到暂存区的文件。–interactive 交互式
repo sync -c 只下载当前分支的代码.

git

将Git 中所有改动的文件备份

  1. 查看改动的文件
    首先,可以使用以下命令查看当前的修改文件:

    git status
    
  2. 将改动的文件复制到备份目录
    假设你要将这些文件备份到一个名为 backup 的目录中。可以使用以下命令:

    mkdir backup  # 创建备份目录
    cp -r $(git diff --name-only) backup/  # 复制改动的文件到备份目录
    
  3. 备份已暂存的文件
    如果你还想备份已经暂存的文件,可以使用以下命令:

    cp -r $(git diff --cached --name-only) backup/
    
  4. 备份全部改动的文件
    如果想备份所有修改的(包括未暂存和已暂存的),可以结合使用这两个命令:

    cp -r $(git diff --name-only) backup/
    cp -r $(git diff --cached --name-only) backup/
    

git add
添加所有文件
git add -A
仅添加修改文件
git add -u

要将所有 .cpp 文件(包括子文件夹中的)添加到 Git 中,可以使用以下命令:

git add '**/*.cpp'

**/:表示递归地匹配当前目录以及所有子目录。
*.cpp:匹配所有以 .cpp 结尾的文件。

*. 如果你使用的是 Bash 或类似的 shell,可以确保 globstar 选项已启用,这样 ** 会递归地匹配子目录:

shopt -s globstar
git add **/*.cpp

*. 使用 find 命令(适用于 Unix 系统):

find . -name '*.cpp' -exec git add {} \;

这将递归查找当前目录及其所有子目录中的 .cpp 文件,并将它们添加到 Git 暂存区。

git stash 存储当前分支下的改动(不提交)
当工作了一半,需要切换分支或者恢复commit时,可以使用git stash封存当前的改动。
使用步骤:

  1. git add [文件]
  2. git stash save "描述"
  3. git stash list查看封存记录,生成对应的封存号,此时,本地文件恢复到最新提交(commit)状态,
    此时可切换分支,当工作完成后,可以使用git stash popgit stash apply [封存号]来恢复
  4. git stash pop推出最新(后)的stash;git stash apply [n]恢复指定的stash,n为封存号,可用git stash list查看

https://blog.youkuaiyun.com/jxwBlog/article/details/124449207

git reset
撤回本地提交,并将本地文件与某个commit保持一致
git reset --hard [commit-id]
只撤回本地提交,但保留本地文件的更改
git reset --soft [commit-id]

git push
git push -u的用法,用于将当前分支推送到远程库,并将本地分支和远程分支对应,如果远程分支不存在,则为远程库建立相同的分支。"-u"一般用来推送没有设置“upstream”的分支的提交,多用于仓库初始化的第一次提交。
git push -u origin master

分支改名
git branch -m old_branch new_branch
设置分支对应的远程分支
git branch --set-upstream-to=origin/<远程分支名> <本地分支名>

修改本地分支名:

git branch -m new_branch_name

这里的 new_branch_name 是你要设定的新分支名。

修改非当前所在的分支名:

git branch -m old_branch_name new_branch_name

删除远程旧分支

git push origin --delete old_branch_name

将新命名的本地分支推送到远程仓库

git push origin new_branch_name

设定新分支追踪远程分支

git branch --set-upstream-to=origin/new_branch_name new_branch_name

只下拉最新代码包,下拉速度快
git clone git仓库地址 --depth=1

清理修改或新增的文件:
如果没有add,则:
还原修改的文件:
git checkout .
删除单个文件/文件夹:
$ rm filename / rm dir -rf
还原所有文件/文件夹:
$ git clean -xdf
删除更改:
git clean -df
切换到xxx tag,不加tags也可以,可以自动识别,但是此时是给分离分支。
git checkout tags/xxx
git checkout tag名
git checkout -b branch_name tag_name
查看tag commit id
git tag:
git tag -d
git show tagname
查看commit id 对应的修改
git show commit-id
本地切换到一个远程分支,远程分支名不加origin一类的。
git check 远程分支名

查看远程tag
git ls-remote --tags origin
将tag推到远程:
git push origin [tagname] #将tagname标签提交到服务器
git push origin --tags #将本地标签一次性提交到服务器

git merge合并分支
master上合并dev分支
在master下执行git merge dev,将dev合并到master,有分叉。

git cherry-pick 从别的分支上摘取commit到当前分支
git cherry-pick [commit-id] [commit-id] [commit-id]
摘取指定的两个commit之间的所有commit
git cherry-pick [commit-id]..[commit-id]

git patch应用
生成patch文件
git format-patch 将commit达成patch
将指定的两个commit之间的所有commit打成patch文件
git format-patch [commit-id]..[commit-id]
git format-patch [commit-id]此命令是将 [commit-id]后的所有提交生成patch文件。
示例:

某两次提交之间的所有patch:
git format-patch 365a…4e16 --365a和4e16分别对应两次提交的名称
某次提交(含)之前的几次提交:
git format-patch –n 07fe --n指patch数,07fe对应提交的名称
故,单次提交即为:
git format-patch -1 07fe

应用patch
先检查patch文件:
git apply --stat newpatch.patch
检查能否应用成功:
git apply --check newpatch.patch
打补丁:
git am --signoff < newpatch.patch
(使用-s或–signoff选项,可以commit信息中加入Signed-off-by信息)

git submodule
添加子模组:
添加本地子模组仓库:
git submodule add [本地git项目地址] [子模组名称]
eg:git submodule add ./src/t1 src/t1
添加远程子模组仓库:
git submodule add [url] [子模组名称]
git submodule add https://github.com/xxx
在使用git submodule add之后,回到主仓库根目录下,使用git status查看,会看到类似以下内容:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   .gitmodules
	new file:   src/t1

使用git commit提交该内容后,则可以使用git submodule status查看子模组情况。

更新子模组:
在主仓库的根目录下使用
git submodule update --init --recursive命令来更新及克隆主仓库下包含的所有子模组,相当于各个子模组下执行一次git pull

git rebase

  1. 可以将多个提交合并为一个
    git rebase -i [startpoint] [endpoint] -i表示使用交互式编辑界面,使用户完成合并
  2. 将某一段commit粘贴到另一个分支上
    git rebase [startpoint] [endpoint] --onto [branchName]
    用来合并分支以及手动修改提交
    git rebase -i HEAD~2 ->它会打开编辑器,在每条commit前输入需要处理的指令(p/d等),来进行处理。
    git rebase branch_name用来合并提交

与merge不同的是,merge会将两个分支commit进行三方合并,并生成新的commit,如下所示:
在这里插入图片描述
rebase 命令将提交到某一分支上的所有修改都移至另一分支上,如下
在这里插入图片描述
以上图片来自https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA

添加多个remote库,并开源部分分支
没有远程库的操作。

# 添加远程仓库,这里的public private均为远程库对应的本地名,可按自己喜好取名
git remote add private git@github.com:yourname/private-repo.git
git remote add public git@github.com:yourname/public-repo.git

# 推送开源分支到开源仓库
git push public public-branch1 public-branch2

# 推送所有分支到闭源仓库
git push private --all

若要在已有闭源远程仓库的基础上添加一个新的公开远程仓库,并将部分代码开源,可按如下步骤操作:

# 添加公开远程仓库
git remote add public https://github.com/yourusername/your-public-repo.git

# 推送并关联开源分支到公开仓库
git push -u public public-branch1 public-branch2

svn

下拉代码svn checkout
svn co http://localhost/test/testapp--username xxx之后输入密码,也可以通过–password直接给定密码
添加到暂存svn add
svn add filename
svn add *添加全部修改到暂存
撤回暂存svn revert
svn revert filename
svn revert *撤销所有修改
提交代码并上传到服务器svn commit
svn commit -m“xxx”

maven用来解决依赖关系的,通过pom.xml 来表明以来关系。

内存空间分布图

在这里插入图片描述
cat /proc/${PID}/maps可查看内存分配信息

串口

串口状态查看

stty查看串口参数,查看串口1(/dev/ttyS0)当前的参数,包括波特率、数据位等。
stty -F /dev/ttyS0 -a

stty设置串口参数
stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8
查看串口数据

  1. cat /dev/ttyS0
  2. socat file:/dev/ttyS0,b115200,inlcr=1 stdout
minicom

安装:
sudo apt install minicom
启动:
sudo minicom
配置:
minicom -s
Minicom下的命令可以通过先按Ctrl+A ,再按Z查看。下面是命令的说明,可以在minicom下使用"Ctrl+A "即进入相应功能的界面。按 ESC 键返回主界面。
主要常用的命令有:
Z :帮助,上面已经使用过。
O(cOnfigure):minicom的相关配置,功能非常强大。
S(Send files):发送文件
R(Receive files):接收文件

使用xmodem收发文件

从开发板发送文件到PC:

  1. minicom配置及启动
  2. sx filename
    显示Give your local XMODEM receive command now.
  3. ctrl+a R 选择xmodem,输入filename,看到传送进度,默认放在当前目录

从PC端发送文件到开发板:

  1. minicom配置及启动
  2. rx filename
    显示rx: ready to receive main.c
  3. ctrl+a S 选择xmodem,选择文件,看到传送进度

或者使用zmodem选择文件传送

终端会话及分割tmux

安装方法:sudo apt-get install tmux
使用方法:
1.打开终端,输入 tmux
2.如果要上下分割:先按 ctrl + b 再按 shift + “(左引号)
3.如果要左右分割:先按 ctrl + b 再按 shift + %
4.切换窗口:先按 ctrl + b 再按 上 / 下 / 左 / 右 键
5.将会话分离:Ctrl+b 再按d

tmux的核心功能如下:

  1. 会话解绑
    tmux 将终端窗口与会话分离,关闭窗口或断开 SSH 后会话仍后台运行,任务不中断。
    • 典型场景:SSH 断连后重新登录,使用tmux a`可恢复之前tmux的任务状态。
  2. 多任务管理
    • 单窗口同时操作多个会话、窗口或窗格。
    • 支持垂直/水平拆分窗格,并行执行命令。
  3. 会话共享
    多人可实时连接同一会话,协作操作。

tmux使用:
1. 安装

sudo apt-get update && sudo apt-get install tmux

安装后验证:tmux -V

2. 会话管理

操作命令/快捷键说明
新建会话tmux new -s <会话名>创建命名会话
分离会话Ctrl+b d会话后台运行
查看会话列表tmux ls显示所有会话
恢复会话tmux attach -t <会话名>
tmux attach -d -t session-name
重新接入会话
-d 参数强制分离其他客户端
重命名会话Ctrl+b $修改当前会话名称
关闭会话tmux kill-session -t <会话名>终止指定会话

3. 窗口管理

操作快捷键说明
新建窗口Ctrl+b c创建新窗口
切换窗口Ctrl+b w可视化选择窗口
重命名窗口Ctrl+b ,修改当前窗口名称
关闭窗口Ctrl+b &终止当前窗口

4. 窗格管理

操作快捷键说明
水平分割窗格Ctrl+b "上下分屏
垂直分割窗格Ctrl+b %左右分屏
切换窗格焦点Ctrl+b ↑↓←→按方向切换
调整窗格尺寸Ctrl+b 方向键按住调整大小
关闭当前窗格Ctrl+d逐级退出窗格/窗口
最大化窗格Ctrl+b z全屏切换当前窗格

5. 高效技巧

  1. 文本操作
    • 进入复制模式:Ctrl+b [,支持搜索和复制文本。
    • 同步窗格:Ctrl+b :setw synchronize-panes,向同一窗口所有窗格发送相同命令。
  2. 会话持久化
    • 插件推荐:Tmux Resurrect 备份会话状态(需手动启动任务)。
  3. 会话共享
    多人协作时,通过共享会话实现实时同步操作。

tmux常用命令速查

# 查看所有快捷键
Ctrl+b ?
# 列出会话
tmux ls
# 重命名窗口
Ctrl+b ,
# 窗格布局切换
Ctrl+b 空格键  # 循环切换布局

提示:所有操作默认以 Ctrl+b 为前缀键,可根据习惯修改配置文件~/.tmux.conf(如改为 Ctrl+a)。

窗口页面滚动

  1. 临时启用(仅当前会话有效)

    1. 在 Tmux 界面中按下前缀键 Ctrl+B
    2. 输入冒号进入命令模式::
    3. 输入命令并回车: set -g mouse on
  2. 永久启用(推荐)

    1. 编辑 Tmux 配置文件: nano ~/.tmux.conf
    2. 添加配置项:set -g mouse on
    3. 保存文件并重新加载配置:
     tmux source-file ~/.tmux.conf
    
  3. 键盘滚动(无需鼠标)

    1. 进入 复制模式
    • 按下 Ctrl+B[
    1. 使用键盘滚动:
    • 向上滚动Fn + ↑(Mac)或 PageUp
    • 向下滚动Fn + ↓(Mac)或 PageDown
    1. 退出复制模式:按 q

窗口恢复
在tmux中使用Ctrl+b d分离会话后,可通过以下方法恢复窗口操作:

  1. 恢复最近会话

    tmux attach  # 或简写 tmux a
    

    默认恢复最后一次分离的会话。

  2. 恢复指定会话
    先查看会话列表:

    tmux ls
    

    输出示例:

    check_tmux: 1 windows (created Tue Jun 29 16:21:05 2025)
    debug: 2 windows (created Tue Jun 29 17:30:10 2025)
    

    按名称恢复目标会话:

    tmux attach -t debug  # -t 指定会话名
    
  3. 可视化会话选择
    在tmux环境中按Ctrl+b s,通过方向键选择目标会话回车进入。

    注意事项:

    • 恢复后窗口尺寸异常时,按Ctrl+b :输入resize-window -A回车自适应调整
    • 使用tmux kill-session -t 会话名可彻底关闭会话释放资源

其他

alias
  1. 创建临时别名
    语法:alias 别名='原始命令'
    示例:

    alias ll='ls -alF'  # 输入ll等价于ls -alF 
    alias grep='grep --color=auto'  # 高亮关键词 
    
  2. 查看所有别名

    alias  # 列出当前会话所有别名 
    alias ll  # 查看特定别名定义 
    
  3. 删除临时别名

    unalias ll  # 删除指定别名 
    unalias -a  # 删除所有别名 
    
  4. 永久生效配置

    vi ~/.bashrc  # 用户级配置(推荐) 
    # 或 vi nano /etc/bash.bashrc  # 系统级配置 
    

    在文件末尾添加别名定义:

    alias ll='ls -alF'
    alias la='ls -A' 
    

    生效配置

    source ~/.bashrc  # 立即加载修改 
    

波特率、比特率、码元、位bits
波特率:1s传送多少码元
码元:1s中可产生多少电平波动
比特率:1s传送多少bit

1字节=8位=8比特
码元:在数字通信中常常用时间间隔相同的符号来表示一位二进制数字.
码元也可以表示多进制数字信号,二进制时是1比特,n进制时,是n/2比特
即:
1码元 = n/2比特
波特率 = 比特率/(n/2)

ubuntu设置开机自启动
https://blog.youkuaiyun.com/castlehe/article/details/107905761

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值