bash常用命令

bash常用命令

  1. 查找wav.scp中的非数字、非字母、非空格、非.非_的字符,即特殊字符 全角字符或者汉语 sed实例,grep空行实例 awk substr实例

cat wyr | sed ‘s#[a-zA-Z0-9_/. -]##g’ | grep -v “^$” | sort | uniq | awk ‘BEGIN{ char=“”} {print $1;char=char substr($1,0,4)} END{print char}’

结果:
男男
那那
AA
BB
CC
DD
男那ABCD

思路:找到特殊字符,去掉空行,排序,去重复,截取,拼接

  1. 记录一下bash脚本的坑

set -e: 脚本遇到错误不在继续执行,退出脚本。
set -u:遇到使用未定义变量报错。
set -o pipefail:不设置该选项默认情况下命令执行结果会返回最后一个管道命令的返回值。设置该选项之后,会从右往左遍历管道的返回值,并返回第一个非零值。

$?是上一个命令的执行结果。可以打印查看 echo ? 可以通过 e c h o “ ? 可以通过echo “ ?可以通过echo{PIPESTATUS[0]}” / 1 / 2 …分别查看每个管道的状态码

备注:
grep结果为空时,返回状态码为1.

 所以20210609遇到了一个特别奇葩的问题:在外面界面输入命令,并不会报错;但是在bash脚本中会报错。原因是:脚本中设置了set -o pipefail, 同时该命令包含grep,且grep返回结果为空。因此执行该命令时停止不继续执行。调试了大概一个下午加一个晚上。
  1. 筛选语音长度超过10s,文本超过100的wav名字 awk length函数实例

     cat data/train/text | awk '{if (length($2)/3 > 100) print length($2)/3, $2}'| head
     cat data/train/utt2dur | awk '{if ($2 > 10) print $1}' | head
     注意:汉字在某些情况下占用三个字符,和linux系统是否识别汉字有关系
      tail -n +4 file : 去掉前三行
    

4.数据处理例子 paste cut sed实例

for x in train dev; do
    cp ${feat_dir}/${x}/text ${feat_dir}/${x}/text.org
# 删除文本中的空格
    paste -d " " <(cut -f 1 -d" " ${feat_dir}/${x}/text.org) <(cut -f 2- -d" " ${feat_dir}/${x}/text.org \
# 小写改为大写,英文单词之间的空格改为▁
        | tr 'a-z' 'A-Z' | sed 's/\([A-Z]\) \([A-Z]\)/\1▁\2/g' | tr -d " " 
        > ${feat_dir}/${x}/text
 # 去掉\xEF\xBB\xBF
    sed -i 's/\xEF\xBB\xBF//' ${feat_dir}/${x}/text
 # 去掉所有的标点符号
    sed -i 's/[。,;:!,?、!?「」『』《》]//g' ${feat_dir}/${x}/text
done
  1. 计算时长,awk split和gsub函数

    cat data/filtered/${filter_dir}/wav.scp|awk '{print $2}'| xargs ls -l|awk '{ str=split($NF, a, "/");b=a[str];gsub(/.wav/, "", b);print b, $5}' | awk '{print $1 " "($2-44)/32000}'> data/filtered/${filter_dir}/utt2dur
    
    cat utt2dur | awk 'BEGIN{len=0}{len+=$2}END{print len/3600}'
    

split切分函数,切分出来放到a中,切分符号为/
gsub为替换函数,.wav替换为空

  1. 统计训练Batch的loss和
    grep “CV info” | awk ‘{print $9 }’ | uniq

for epoch in {0…65}; do cat finetune_2022-01-07.log | grep “Batch $epoch/” | grep -v “inf” | awk ‘BEGIN{tatal=0}{total+=$8}END{print total}’;done

  1. 杀掉含关键字的进程

kill -9 $(ps -ef | grep train.py | grep -v grep | awk ‘{print $2}’)
kill -9 $(ps -ef | grep finetune.py | grep -v grep | awk ‘{print $2}’)
kill -9 $(ps -ef | grep decoder_main | grep -v grep | awk ‘{print $2}’)

  1. awk for循环写法
    cat content.log | sed ‘s#\u003ceos\u003e# #g’ | sed ‘s#\u0001# #g’ | awk ‘{for(i=1;i<NF;i++)print $i}’ | grep “wav” | sort | uniq | wc -l

  2. split实例,切分文件

total_num=‘cat wyr| wc -l’
split_num=1
sub_num=`expr $total_num / $split_num + 1
split -l $sub_num wyr -d -a 1 wyr.

-l 按照行数切分; -d 按照数字命名小文件; -a 后缀位数

  1. 判断程序是否结束的while循环

while true; do
num=ps -ef | grep run.sh | wc -l
if [ n u m − g t 1 ] ; t h e n e c h o " num -gt 1 ]; then echo " numgt1];thenecho"num"
sleep 1800
else
break
fi
done

  1. 获取时间

date=date +%Y-%m-%d-%H-%M-%S
2023-06-06-03-36-26

  1. 开头几行和结尾几行

head -n 2 wyr 获取前两行
head -n -2 wyr 获取截止到倒数第二行的所有数据(不包括倒数第二行)
tail -n 2 wyr 获取最后两行数据
tail -n +2 wyr 获取从第二行开始的所有数据(包括第二行)

  1. 拷贝除了一个目录之外的其他所有
    apt-get install rsync
    rsync -av --exclude dev_quanliang_20211220/shards dev_quanliang_20211220 /home/work/wangyaru05/scp/temp/

切记:shards后面不能有左斜杠,dev_quanliang_20211220后面也不能有左斜杠,这样拷贝完之后,temp下面会有一个完整的
dev_quanliang_20211220文件夹

  1. awk 获取倒数第二个数据实例
    awk -F_ ‘{print $(NF-1)}’ | sort | uniq

猜你喜欢

转载自blog.csdn.net/weixin_43870390/article/details/131063316