文章目录
- 查看系统信息
- 内核
- 压力测试
- 设备
- 环境变量设置
- 编译
- 脚本类
- 网络设置
- 查看端口占用信息
- 服务/进程管理
- linux进程信息
- 软件包管理
- 文件类
- rename 批量修改文件名
- ls 按指定顺序排布文件
- nautilus终端下指定路径打开文件管理器GUI
- xargs
- 取消patch
- 带单位显示文件大小
- 删除除指定文件(file1)以外文件
- unzip 解压中文乱码的问题:
- 挂载与卸载mount与umount:
- 添加开机自启动脚本
- du&df查看文件夹大小
- find
- grep
- ag查找文件及文字
- 修改文件权限及拥有者
- 修改可执行文件的执行权限
- cp
- dd
- mkdir
- 目录之间的切换cd\pushd\popd
- stat查看文件信息
- lsof
- fuser
- wc统计输出行数
- head & tail
- readelf查看二进制文件信息
- patchelf 更改二进制文件
- 查看二进制依赖库文件信息
- 分卷压缩及解压
- tr 字符转换和删除工具
- sed 指定文本内容替换
- awk
- md5sum校验文件
- 用户操作
- 后台命令
- Vim
- 调试类
- repo
- git
- svn
- 内存空间分布图
- 串口
- 其他
查看系统信息
查看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) 自定义库 | 非语言核心功能库,需用户显式声明依赖关系 |
-
编译器自动链接运行时库
- 语言核心库自动处理
g++
编译 C++ 代码时,自动添加-lstdc++
;gcc
编译 C 代码时,自动添加-lc
(C标准库)。- 原理:编译器(如
g++
)本质是“包装器”,调用底层链接器时自动传递语言标准库参数。
- 例外情况:若使用
gcc
编译 C++ 代码,需手动添加-lstdc++
(因gcc
默认按 C 语言处理)。
- 语言核心库自动处理
-
非核心库需显式指定
- 系统功能库(如
pthread
)
虽为系统库,但不属于语言核心,需显式指定-lpthread
(因为线程支持是可选的扩展功能)。 - 第三方/自定义库
所有非编译器默认处理的库(如数学库-lm
、压缩库-lz
或项目自定义库),均需通过-l
指定。
- 系统功能库(如
-
路径搜索规则的差异
- 默认路径:编译器自动在
/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.6
或libstdc++.so.6
,说明标准库已自动链接。
注意事项:动态库需确保运行时路径正确(通过
-Wl,-rpath
或LD_LIBRARY_PATH
设置)。
-Wl,-rpath
是编译时嵌入到二进制文件中的路径信息,优先级极高(仅次于LD_PRELOAD),属于"硬编码"方式,适合固定部署路径的场景。
LD_LIBRARY_PATH
是运行时环境变量,灵活性高但需要用户显式设置,优先级低于rpath但高于系统路径,适合临时调试或未固定安装路径的情况。
- 使用pkg-config,见pkg-config
- 直接使用-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`- 使用
-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 -X
或ssh 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 -rn
或route -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 系统中的服务管理相关的命令,它们用于启动、停止、重启或查看服务的状态。
-
service
命令:
service
命令用于启动、停止或重启系统中的服务。它是较旧的服务管理工具,适用于一些基于SysVinit
的系统(例如 CentOS 6 或 Ubuntu 14.04 之前的版本)。它简化了服务的管理操作,使用起来比较直观。常用命令:
- 启动服务:
service <service_name> start
- 停止服务:
service <service_name> stop
- 重启服务:
service <service_name> restart
- 查看服务状态:
service <service_name> status
- 启动服务:
-
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
阿里云 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
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下
sudo fdisk -l
: 查看分区情况,找到U盘对应的设备名(对应大小和文件系统FAT32),这里为/dev/sda1sudo mount -rw /dev/sda1 /mnt/tmp
挂载- 可再/mnt/tmp下查看U盘内容
Linux系统挂载存储只读改成读写
- 用于查看哪个模块输入只读,一般显示为:
[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)
- ro是只读,rw是可读写
- umount /dev/dm-3
如果发现有提示“device is busy”,找到是什么进程使得他busy
fuser -m /mnt/data 将会显示使用这个模块的pid
fuser -mk /mnt/data 将会直接kill那个pid
然后重新mount即可。 - 还有一种方法是直接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依赖
- 使用ldd查看二进制文件依赖的库文件信息
ldd libindemind_module.so
- 使用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]
- 字符替换(一对一映射)
# 将小写字母转换为大写
echo "hello world" | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD
# 替换特定字符
echo "abc" | tr 'abc' '123'
# 输出:123
- 字符删除
# 删除所有数字
echo "phone: 123-4567" | tr -d '0-9'
# 输出:phone: -
# 删除所有元音字母
echo "ubuntu" | tr -d 'aeiou'
# 输出:bnt
- 字符压缩(删除连续重复字符)
# 压缩连续空格
echo "too many spaces" | tr -s ' '
# 输出:too many spaces
# 压缩连续相同字符
echo "coooooool" | tr -s 'o'
# 输出:cool
- 字符补集操作
# 删除所有非数字字符
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 | 制表符 |
注意
-
区分大小写:
tr
严格区分大小写 -
集合长度匹配:
# SET1 比 SET2 长时,多出字符映射到 SET2 最后一个字符 echo "abcdef" | tr 'abcde' '12' # 输出:122222(e映射到2)
-
字符顺序:操作基于字符顺序而非单词
echo "banana" | tr 'na' 'xy' # 输出:bxyxyx(不是单词替换)
-
不支持正则表达式:
tr
只能处理单个字符,不能处理模式匹配(使用sed
处理复杂模式)
使用建议:对于简单的字符级转换(特别是删除或压缩字符),tr
是最简洁高效的选择;对于更复杂的文本操作,建议使用 sed
或 awk
。
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
- 基本语法
awk '条件 {动作}' 文件
条件
:指定处理的行。动作
:对满足条件的行执行的操作。
- 选择特定列
通过$
符号来选择特定列。
awk '{print $1, $3}' 文件 # 打印第一列和第三列
- 进行条件判断
可以使用if
语句进行条件判断。
awk '{if ($1 > 10) print $0}' 文件 # 打印第一列大于10的整行
- 使用内置变量
awk
提供了许多内置变量,例如:
NR
:当前记录的行号。NF
:当前行的字段数量。
awk '{print NR, NF}' 文件 # 打印每行的行号和字段数
- 字符串操作
awk
可以轻松处理字符串。
awk '{print toupper($1)}' 文件 # 将第一列转换为大写
- 进行数学运算
可以进行算术运算。
awk '{sum += $1} END {print sum}' 文件 # 计算第一列的总和
- 使用分隔符
可以指定字段分隔符。
awk -F ',' '{print $1}' 文件 # 使用逗号作为分隔符
- 处理多个条件
可以使用逻辑运算符处理多个条件。
awk '$1 > 10 && $2 < 5' 文件 # 同时满足两个条件的行
- 输出格式化
使用printf
进行格式化输出。
awk '{printf "Name: %s, Age: %d\n", $1, $2}' 文件 # 格式化输出
- 管道和重定向
awk
可以与其他命令结合使用,处理管道数据。
cat 文件 | awk '{print $1}' # 通过管道读取数据
- 处理特定行
可以使用NR
来处理特定的行。
awk 'NR==1 {print $0}' 文件 # 打印第一行
- 读取多个文件
awk
可以同时处理多个文件。
awk '{print FILENAME, $0}' 文件1 文件2 # 输出文件名和行内容
示例
假设有一个文件 data.txt
内容如下:
Alice 25
Bob 30
Charlie 35
-
打印第二列:
awk '{print $2}' data.txt
-
打印年龄大于30的行:
awk '$2 > 30' data.txt
-
计算年龄的总和:
awk '{sum += $2} END {print sum}' data.txt
-
将姓名转换为大写并打印:
awk '{print toupper($1)}' data.txt
-
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权限
- 修改配置文件
vim /etc/sudoers
修改文件如下:
# User privilege specification
root ALL=(ALL) ALL
username ALL=(ALL) ALL
- 将用户添加到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/g
将sin(r[x/y/z])
替换为sr[x/y/z]
。其中x/y/z表示满足三者之一即替换
- 假设文本在Vim的缓冲区中,进入命令模式(按下
- 在Vim的替换命令中,
visual模式对选中文本进行替换
命令模式下,摁v键进入visual模式,选中文本;
输入:下边出现:
:'<,'>
在其后输入s/old/new/g,则可将选中文本中的old都替换成new。
不加g仅替换选中文本每一行的第一个old为new。
使用vi记录功能记录功能用于频繁的相同操作,
如:
- esc下嗯q+<a-z任意字母>,进入记录模式。
- 嗯i开始编辑,编辑完成后,嗯esc,并将光标移动到想要重复操作的行首
- 嗯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.
- 圆括号:
i=1
:初始化计数器为1g/^/
:全局匹配所有行首\='['.i.'] '
:动态拼接编号格式(此处为方括号+空格)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转串口使用
- 接线方式: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 中所有改动的文件备份
-
查看改动的文件:
首先,可以使用以下命令查看当前的修改文件:git status
-
将改动的文件复制到备份目录:
假设你要将这些文件备份到一个名为backup
的目录中。可以使用以下命令:mkdir backup # 创建备份目录 cp -r $(git diff --name-only) backup/ # 复制改动的文件到备份目录
-
备份已暂存的文件:
如果你还想备份已经暂存的文件,可以使用以下命令:cp -r $(git diff --cached --name-only) backup/
-
备份全部改动的文件:
如果想备份所有修改的(包括未暂存和已暂存的),可以结合使用这两个命令: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
封存当前的改动。
使用步骤:
git add [文件]
git stash save "描述"
git stash list
查看封存记录,生成对应的封存号,此时,本地文件恢复到最新提交(commit)状态,
此时可切换分支,当工作完成后,可以使用git stash pop
或git stash apply [封存号]
来恢复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
- 可以将多个提交合并为一个
git rebase -i [startpoint] [endpoint]
-i表示使用交互式编辑界面,使用户完成合并 - 将某一段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
查看串口数据
cat /dev/ttyS0
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:
- minicom配置及启动
- sx filename
显示Give your local XMODEM receive command now. - ctrl+a R 选择xmodem,输入filename,看到传送进度,默认放在当前目录
从PC端发送文件到开发板:
- minicom配置及启动
- rx filename
显示rx: ready to receive main.c - 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的核心功能如下:
- 会话解绑
tmux 将终端窗口与会话分离,关闭窗口或断开 SSH 后会话仍后台运行,任务不中断。- 典型场景:SSH 断连后重新登录,使用tmux a`可恢复之前tmux的任务状态。
- 多任务管理
- 单窗口同时操作多个会话、窗口或窗格。
- 支持垂直/水平拆分窗格,并行执行命令。
- 会话共享
多人可实时连接同一会话,协作操作。
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. 高效技巧
- 文本操作
- 进入复制模式:
Ctrl+b [
,支持搜索和复制文本。 - 同步窗格:
Ctrl+b :setw synchronize-panes
,向同一窗口所有窗格发送相同命令。
- 进入复制模式:
- 会话持久化
- 插件推荐:
Tmux Resurrect
备份会话状态(需手动启动任务)。
- 插件推荐:
- 会话共享
多人协作时,通过共享会话实现实时同步操作。
tmux常用命令速查
# 查看所有快捷键
Ctrl+b ?
# 列出会话
tmux ls
# 重命名窗口
Ctrl+b ,
# 窗格布局切换
Ctrl+b 空格键 # 循环切换布局
提示:所有操作默认以
Ctrl+b
为前缀键,可根据习惯修改配置文件~/.tmux.conf
(如改为Ctrl+a
)。
窗口页面滚动:
-
临时启用(仅当前会话有效)
- 在 Tmux 界面中按下前缀键
Ctrl+B
- 输入冒号进入命令模式:
:
- 输入命令并回车:
set -g mouse on
- 在 Tmux 界面中按下前缀键
-
永久启用(推荐)
- 编辑 Tmux 配置文件:
nano ~/.tmux.conf
- 添加配置项:
set -g mouse on
- 保存文件并重新加载配置:
tmux source-file ~/.tmux.conf
- 编辑 Tmux 配置文件:
-
键盘滚动(无需鼠标)
- 进入 复制模式:
- 按下
Ctrl+B
→[
- 使用键盘滚动:
- 向上滚动:
Fn + ↑
(Mac)或PageUp
- 向下滚动:
Fn + ↓
(Mac)或PageDown
- 退出复制模式:按
q
键
窗口恢复
在tmux中使用Ctrl+b d
分离会话后,可通过以下方法恢复窗口操作:
-
恢复最近会话
tmux attach # 或简写 tmux a
默认恢复最后一次分离的会话。
-
恢复指定会话
先查看会话列表: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 指定会话名
-
可视化会话选择
在tmux环境中按Ctrl+b s
,通过方向键选择目标会话回车进入。注意事项:
- 恢复后窗口尺寸异常时,按
Ctrl+b :
输入resize-window -A
回车自适应调整 - 使用
tmux kill-session -t 会话名
可彻底关闭会话释放资源
- 恢复后窗口尺寸异常时,按
其他
alias
-
创建临时别名
语法:alias 别名='原始命令'
示例:alias ll='ls -alF' # 输入ll等价于ls -alF alias grep='grep --color=auto' # 高亮关键词
-
查看所有别名
alias # 列出当前会话所有别名 alias ll # 查看特定别名定义
-
删除临时别名
unalias ll # 删除指定别名 unalias -a # 删除所有别名
-
永久生效配置
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