实用命令与文本处理
实用命令
ll dirname | grep jpg | wc –l //count the num of jpg file in dirname
find //同locate,只不过直接从硬盘中查找数据,更慢但更准确
du –h //读取文件夹大小
tree -d //查看当前文本夹中所有文件夹的树状分布
!keyword //用于执行keyword 相关的历史命令
which commond //查找shell命令所在的位置
变量处理
conf_name=$(basename -- "$conf_path") //只要文件名不要路径
${conf_base%.xxx} // 只要文件名前面,不要.jpg或者其它.xxx后缀
文件采样
awk '{if(NR%5==0) print $0}' input.list > out.list //每隔5行取其中一行
判断目录是否存在并删除或者创建
if [ ! -d $dir_name ]; then
mkdir -p $dir_path
else
rm $dst_path
文本处理
echo string | cut -d 'c' -f1 //将string第一个字符'c'之前的substring取出
echo string | awk -F 'c' '{print $1 $2}' //以'c'为分隔符,将string分为substr
// 1.awk功能类似于cut,但处理表格形式的文本更方便
// 2.若不指定'c',则默认以空格来分割string
echo string | sed "s/sub1/sub2/g"
// 1.将string中所有substring1替换为substring2,如果不加‘g’,则只替换第一个
// 2.如何是在文本最后添加字符,可用sed "s/$/sub/",因为文本在每行最后都会有一个不可见的'$',行首 ^
// 3.当被替换或被替换字符为变量时,如果变量里面含有/,则会报错: sed -e express #1, unkown option to s,必须把/转义或去掉
// 4.当被替换变量中含有/时,也可以将改分隔符来解决如
sed -i "s!$url!$1!g" datasource.properties
$(basename -- "${data_path}") //将绝对data_path中的文件名作为变量取出来
${filename%.*} //将xxx.ext的后缀取掉
`` //是tab上方的`,用这个符号将命令包起来,可以把命令执行的结果作为变量保存
[ref](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html)
文件重定向
-
xxcommand > output 2&1
//将xxcommand的命令的所有输出信息导入到output文件中
//如果不加2&1 参数的话,仅会把xxcommand的正确结果保存下来,而不会保存过程信息
//1: stdout 2: stderr
- nohup xxcomand & && tail -f nohup.out
递归寻找一个文件夹里面含有特定串的文件
-
grep -n -H -R "main", Note: “main”里面不加”*”,否则任务字符串都找不到
-
find . -name "*.cpp" -print | xargs -I{} grep -Hn "main" {}
“|” 之前表示寻找文件夹中所有.cpp为后缀的文件并打印,
“|” 之后表示以“{}”代表打印出的每一行,并在每一行里抓取”main”字符。
-H 表示显示找到的文件名,-n表示打印行号
shell编程示例
实现将DATA文件夹中所有*.jpg的文件名字写入train.txt,同时写入其实标签
#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt
done
注意:如果要对变量进行+-操作,必须两层括号,如:$(( i-2 ))