算法工程师常用Linux命令总结

《算法工程师常用Linux命令总结》

  做 CV 两年了,整理一些在做训练或其他任务的时候常用的 shell 操作,什么事都用 python 来做有时候还是挺麻烦的,比如有一次在做一个目标检测任务的时候,报错了原因是voc格式中的图像的height和width和实际不符,而我们又恰好知道实际的height和width,那么直接一行shell,for循环 + sed就解决了,类似这样的事情不胜枚举,所以牢记这写linux常用操作还是很有用的。

Key Words:


Beijing, 2019

作者:RaySue

Code:

Agile Pioneer  

  作为算法工程师,很多时候需要对数据进行处理,比如批量改名,把所有的数据名放在一个文本文件中,以及对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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值