《算法工程师常用Linux命令总结》
做 CV 两年了,整理一些在做训练或其他任务的时候常用的 shell 操作,什么事都用 python 来做有时候还是挺麻烦的,比如有一次在做一个目标检测任务的时候,报错了原因是voc格式中的图像的height和width和实际不符,而我们又恰好知道实际的height和width,那么直接一行shell,for循环 + sed就解决了,类似这样的事情不胜枚举,所以牢记这写linux常用操作还是很有用的。
Key Words:
Beijing, 2019
作者:RaySue
Code:
文章目录
作为算法工程师,很多时候需要对数据进行处理,比如批量改名,把所有的数据名放在一个文本文件中,以及对data文件名和target文件名进行配对,或替换文件中所有的PReLU为ReLU的操作,包括各种查找命令,awk的常用命令,sed的简单命令。还有时候为了方便训练或测试需要些简单的shell脚本,
当然也会面对一些环境问题,比如查看某个动态库的依赖,文件的属性是x86还是arm等等。
这些经常会忘,所以持续整理一个常用的Linux命令笔记。
1. 批量操作文件
1.0 循环读取文件
cat xxx.txt |while read line; do echo $line;done;
# 逐行替换操作
cat xxx.txt|while read line;do sed -i 's/ori/des/g' $line;done
find -type f |while read line;do sed -i 's/ori/des/g' $line;done
1.1 生成 train list
# 得到用于caffe训练的trainval.txt用到,%.jpg是省略后面的.jpg
for name in `ls JPEGImages`; do echo ${name%.jpg};done > trainval.txt
# 字符截取用法
name="www.jd.com"
# 省略前面的www.
${name#www.} or ${name#*w.}
# 省略前面的www.和后面的.com
${${name#www.}%.com}
# 省略.及后的字符(.jpg或.JPG或.png ...)
${name%.*}
# 拼接两个同样行数的文件,比如分割使用的trainval.txt
paste -d" " image.txt target.txt > trainval.txt
1.2 字符串变量的删除和替换
${var#pattern} 从变量头部开始匹配模式,将符合的最短数据删除
${var##pattern} 从变量头部开始匹配模式,将符合的最长数据删除
${var%pattern} 从变量尾部开始匹配模式,将符合的最短数据删除
${var%%pattern} 从变量尾部开始匹配模式,将符合的最长数据删除
${var/oldPattern/newPattern} 将第一个符合旧模式的数据替换为新模式
${var//oldPattern/newPattern} 将全部符合旧模式的数据替换为新模式
1.3 文件内容查找
# 查找当前目前及其子目录,文件名中带有target的 “某文件”
find ./ -type f -name "*target*"
# 查找当前目前及其子目录,目录名中带有target的 “某文件夹”
find ./ -type d -name "*target*"
# 查找所有的.hpp文件,打印出来
find ./ -type f -name "*.hpp"|while read line;do echo $line;done
# 打印当前目录及其子目录下所有包含read_csv的文件 -n 行号,及目标上下两行(A2 B2)
grep -n -r -A2 -B2 --color=always "read_csv" ./
# 组合 find & grep 使用查找功能
find ./ -type f -name "*.c[h]pp" | xargs grep -n -A2 -B2 "target" --color=always |less -r
### 查找一个文件包含某个字符串多少次
grep -c "xxx" file_path
1.4 文件内容替换
# 替换某文件中的PReLU为ReLU
sed -i 's/PReLU/ReLU/g' xxxfile
# 对文件逐行read并替换打印出来,不会保存
cat label_fast.py|while read line;do sed 's/self/include/g' ;done
# 替换find到的所有文件中ori内容为aim,直接对文件内容进行替换和保存,谨慎操作!
find ./ -type f |while read line;do sed -i 's/ori/aim/g' $line;done
1.5 awk 常用切分
# awk的用法,得到用:分开的第一个域
awk '{split($0, a, ":");print a[1]}' aim_file
# 例子
time = "12:34:56"
# the first index of variable a is 1
echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'
1.6 文件分块
-l 表示对行分
-b 表示对字节分
-d 表示用数字区分不同的文件块
后面的名字是分块后的文件名的前缀
# 对文本行进行分块 例:对 test.txt 每 500 行分成一个子文件
split -l 500 -d test.txt test_sub.txt
# 对文件通过存储大小进行分块 例:对 big.zip 每 1024M 分成一个子文件
split -b 1024M -d big.zip xxx.zip
2. 查看文件属性
# 查看动态库的依赖
ldd xxx.so
# mac下查看动态库依赖
otool -L xxx.dylib
# mac 下修改库依赖到的第三方库的路径:
install_name_tool -change oldPath newPath xxx.dylib
# 查看文件类型
file main.o
# 用于反编译,可以显示文件头信息
objdump -p main.o
# 从静态库和动态库中获取到函数名称
nm xxx.a
readelf
readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,
动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。
选项 -s,symbols 显示符号表段中的项(如果有数据的话)readelf -s hello.so
选项 -e,headers 显示全部头信息,等价于: -h -l -S
# 查看文件是64位或32位, 第5个数如果是02就是64,01就是32位
readelf -h xxx.a
dig
测试域名系统(DNS)是否正常
dig www.baidu.com
解决 argument list too long: mv
有时候移动大量文件的时候会出现这个问题,所以我们需要遍历挨个执行删除,这就需要使用 find 命令了,组合 for 循环即可
for name in `find ./ -name '._*'`;do rm $name;done
4. 参考
字符截取
https://www.cnblogs.com/fetty/p/4857158.html
shellcheck用法
https://www.cnblogs.com/zqb-all/p/10054594.html
linux变量内容的删除和替换
https://blog.csdn.net/qq_31567335/article/details/88985071