Bash中用到的文件处理方法记录
引言
因要在服务器上进行数据分析,于是使用bash shell进行部分文件处理,以及相关程序调用,而收益匪浅。这里主要涉及的是一些操作中用到的文件批量处理,直观感觉非常好用。
批量解压并删除原解压文件
#!/bin/bash
cd 07
ls *.zip | xargs -n1 unzip -o -P infected
rm *.zip
这段脚本实现功能是在名为07/的目录下解压其中的所有zip文件,再解压完成后删除所有zip文件。
批量提交作业
这里说的提交作业是指把程序交给服务器后台跑。
#!/bin/bash
j=0
for i in Intput_absolute_path/*
do
rm job_${i}.sh
i="python ../example.py --input "${i}" --output ../Output/calib_"${j}".root"
echo $i >> job_${j}.sh
chmod 755 job_${j}.sh
hep_sub -g juno job_${j}.sh
printf "job ${j} has been submitted.\n"
j=`expr $j + 1`
done
上述代码的目的是批量产生job.sh文件并且上交给服务器。代码中对echo的输出重定向至文件job_i.sh中,然后使用chmod命令对该job_i.sh文件赋予权限,后面的hep_sub是我所在服务器的交作业命令,不同的服务器应该是不一样的吧。之所以要在开头删除job_i.sh,是因为echo的输出重定向至文件后会在原有部分后追加,如果原来的job文件没有删除的话会重复执行之前job中的工作。
从log文件中提取批量提取信息
因为在调试期间,程序的部分运行参数输出在了log文件中,如测试时的占用内存,部分运行时间等。所以需要从大量的log文件中提取相关参数进行统计拟合,以确定程序性能。
INFO: ---------------------------Exe. FreshData memory: 1458-------------------------
log文件中有这样一段输出,其中1458是所需要的,之后的bash脚本就是为了从log中提取1458这一数字。
#!/bin/bash
for i in log_path/*
do
size=$(grep "Exe. FreshData memory:" $i)
size=$(echo ${size##I* })
echo $size | sed 's/-------------------------//g' >> exe_fre_size.txt
done
使用for遍历了log_path目录下的所有log文件
for中do下面的第一个语句是取到了log文件中文本"Exe. FreshData memory:"所在的行,此句执行之后的size内容为
INFO: ---------------------------Exe. FreshData memory: 1458-------------------------
接着的
size=$(echo ${size##I* })
删去了字符串size中从最左边的“I”到1458前面的空格,语句中的“##”就是提取字符串从左边开始的最长的匹配,即从最早出现的“I”匹配到最后一个空格,如果换成“#”就是指最短的匹配了,从最早出现的“I”匹配到最早出现的空格。则此句之后的size内容为
1458-------------------------
最后的echo语句是使用sed命令
sed 's/-------------------------//g'
将size中“-------------------------”替换为空,然后重定向输出至txt文件中。
Summary
To be continued…