shell常用命令行

2 篇文章 0 订阅

shell常用命令

-字母的运用

#filename为文件名
-e (exist)
-e filename, 判断文件是否存在
 
-d (directory)
-d filename,判断文件是否为目录
 
-f (file)
-f filename,判断文件是否为常规文件
 
-L (link)
-L filename,判断文件是否问链接文件
 
-r (read)
-r filename,判断文件是否可读
 
-w (write)
-w filename,判断文件是否可写
 
-x (exec)
-x filename,判断文件是否可执行
 
-s (size)
-s filename,判断文件长度是否为0
 
-h (hard link)
-h filename,判断文件是否为硬链接文件
 
-nt (newer than)
filename1 -nt filename2,判断文件1是否比文件2新
 
-ot (older than)
filename1 -ot filename2,判断文件1是否比文件2旧

打印

cat <<EOF
# 准备文件目录
# |--wav  所有的wav文件
# |--text 所有的txt文件
# |--AISHELL
# |--script  需要修改wav_scp.py的path为wav的绝对路径
# |----spk2utt.py 生成spk2utt
# |----utt2spk.py 生成u2spk
# |----wav_scp.py 生成wav_scp
# |----text.nosegment.py 生成t.nosegment
#
EOF
name=`basename $data_path` # 得到最后一级目录

输入输出流

命令1 1> 文件1 # 把命令1输出的内容放到并创建文件1里面去  1代表不报错
命令1 2> 文件1 # 把命令1报错的输出的内容放到并创建文件1里面去 2代表报错

# 是先把标准输出到黑洞中,再把标准错误输出到和黑洞中,即不显示任何错误信息
1>/dev/null 2>&1 
&1 表示重定向到1类别的输出

cmd &> output.txt
cmd >& output.txt  # 两个表达式效果一样哒~

cmd> xxx.txt 2>&1 # 命令 cmd> xxx.txt 会报错,但还会创建xxx.txt文件,所以第二个命令就会收到错误信息,并存放到xxx.txt文件中去

条件判断

-z 判断 变量的值,是否为空; zero = 0
变量的值,为空,返回0,为true
变量的值,非空,返回1,为false

-n 判断变量的值,是否为空 name = 名字
变量的值,为空,返回1,为false
变量的值,非空,返回0,为true

多个条件判断,[][[]] 的区别?
[[ ]] 双对中括号,是不能使用 -a 或者 -o的参数进行比较的
[[ ]] 条件判断 && 并且 ||[[ 5 -lt 3 || 3 -gt 6 ]]
[[ 5 -lt 3 ]] || [[3 -gt 6 ]] 

[ ] 可以使用 -a -o的参数,但是必须在 [ ] 中括号内
[ 5 -lt 3 -a 3 -gt 2 ] 或者条件成立
[ 5 -lt 3 -o 3 -gt 2 ] 
[ 5 -lt 3 ] || [ 3 -gt 2 ] 
[ 5 -gt 3 ] && [ 3 -gt 2 ] 

当判断某个变量的值是否满足正则表达式的时候,必须使用[[ ]] 双对中括号

for循环

for file in $script_path*;do
  tmp=${file##*/}
  # echo $tmp
  filename=${tmp%.*}
  python3 $file > ${data_path}${filename}
done
script_path="script/"
$script_path*  得到该文件加下的所有文件路径
tmp=${file##*/} 得到文件 # '##*/' 返回最后一个/右边的字符 
filename=${tmp%.*} 得到文件名称 # ‘&.*’ 返回字符串.左边的字符

截取字符串

url="c.biancheng.net"
echo ${url:0-13}  #省略 length,直接截取到字符串末尾

${string#*chars} 
string 表示要截取的字符,
chars 是指定的字符(或者子字符串),
*是通配符的一种,表示任意长度的字符串。
*chars:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。

url="http://c.biancheng.net/index.html"
echo ${url#*:}  # 结果为://c.biancheng.net/index.html 
一个#号 遇到第一个: 就匹配结束了。

${string##*chars}
如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用## 

${string%chars*} 
使用%号可以截取指定字符(或者子字符串)左边的所有字符
请注意*的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*应该位于 chars 的右侧。其他方面%和#的用法相同

去重

: sort   //可以直接排序,这个太好用了
:g/^\(.*\)$\n\1$/d                      //去除重复行
:g/\%(^\1$\n\)\@<=\(.*\)$/d     //功能同上,也是去除重复行
:g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d  //功能同上,也是去除重复行  
删除<feff> 
grep -I -r -l $'\xEF\xBB\xBF' file ||xargs sed -i 's/\xEF\xBB\xBF//'

操作系统问题window文件和linux文件的问题
yum install dos2unix
dos2unix lm_participle.txt

其它命令

#!/usr/bin/env bash  使用bash环境

# 修改shelllocalhost样式 https://zhuanlan.zhihu.com/p/60709716
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h:\[\e[36;40m\]-/\W\[\e[0m\]]\\$ "

cd xxx # 打开xxx文件夹
cd .. # 返回上一级目录
ls # 查看当前目录所有的文件
pwd #查看当前所在位置
mkdir xxx # 创建文件夹xxx
rmdir xxx # 删除文件夹xxx
rm -rf xxx # 删除xxx
    
# 文件操作
vi xxx # 创建文件xxx(没有该文件)/打开文件xxx
i # 输入模式
esc + :q # 退出
esc + :q! # 强制退出
esc + :wq #写入并推出
dd # 删除一行
cp -r path1/* path2/   # 把路径1下的所有东西复制到路径2中 *表示所有东西 
ls | wc -l # 统计当前文件夹下有多少文件
ll # 显示文件夹的所有文件,包括详细信息
ls -sh # 显示文件以及文件大小
ls -a # 查看隐藏文件
ll -sh # 显示详细信息及文件个数
du # 显示所有文件夹及子文件夹 以及文件夹总个数
du -sh # 当前文件夹的大小
du -sh * | sort -n # 当前文件夹每个文件的大小 并排序
du -h --max-depth=1 ./ # 当前文件夹每个文件的大小
df -h 查看磁盘可用空间大小
mv 文件1 文件2 # 移动文件

file path #  打开文件
head -n 2 text.txt #  查看前2行 -n 2
file # 查看文件信息
 file /root/data/01_data/wav/BAC009S0150W0009.wav
# vim下
set number # 显示行数

# 解决dos乱码
dos2unix -q 文件路径 # 如果没有dos2unix 就去yum install dos2unix

# 编译

命令1 | 命令2   # 管道操作 命令1作为输入,命令2作为输出 

vimdiff 文件1 文件2 # 对比两个文件是否相同


条件判断

shell脚本中if的“-e,-d,-f” - 虚生 - 博客园 (cnblogs.com)

解决编码问题

[root@192 script]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.utf-8"
LC_NUMERIC="en_US.utf-8"
LC_TIME="en_US.utf-8"
LC_COLLATE="en_US.utf-8"
LC_MONETARY="en_US.utf-8"
LC_MESSAGES="en_US.utf-8"
LC_PAPER="en_US.utf-8"
LC_NAME="en_US.utf-8"
LC_ADDRESS="en_US.utf-8"
LC_TELEPHONE="en_US.utf-8"
LC_MEASUREMENT="en_US.utf-8"
LC_IDENTIFICATION="en_US.utf-8"
LC_ALL=en_US.utf-8

执行命令
LC_ALL="en_US.utf-8"

ark

Kaldi 查看不同文件用到的命令 - 知乎 (zhihu.com)

ark文件与txt文件互相转换

这个很简单,也只需要用到copy-feats命令

copy-feats ark:train.ark ark,t:/train.txt ark转化为txt

copy-feats ark,t:train.txt ark:train.ark txt转化为ark

./copy-feats scp:/home/yyf17/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.scp ark,t: | head

总结:主要的文件转化是通过copy-feats这个命令,它的主要功能是将文件变成数据流,这样方便对数据进行处理。

比如你想查看kaldi中提取的mfcc特征到底是什么样子,同样可以用copy-feats,如:

copy-feats ark:train.ark ark,t:- | less

通过一个管道用less来查看ark里面的内容。

其他的和特征有关的命令还可以再src/featbin/中自己查看,还有很多很有用的命令。比如copy-matrix可以把矩阵的特征转化成ark格式。

less

图床_shell命令less - MineGi - 博客园 (cnblogs.com)


vim中搜索

/搜索的内容

音频转换工具包

sox # 音频转换工具包


-b, --bits BITS	每个编码样本占用的数据位数
-c, --channels CHANNELS	音频文件包含的通道数
-e, --encoding ENCODING	音频文件的编码类型
-r, --rate RATE	音频文件的采样率
-t, --type FILE-TYPE	音频文件的文件类型

# 查看音频信息
soxi 001.wav

Input File     : '001.wav'
Channels       : 1
Sample Rate    : 16000
Precision      : 16-bit
Duration       : 00:00:00.61 = 9835 samples ~ 46.1016 CDDA sectors
File Size      : 19.7k
Bit Rate       : 257k
Sample Encoding: 16-bit Signed Integer PCM

awk常用命令

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

安装gun awk,命令是sudo apt-get install gawk

基本格式:

awk   [options]   'pattern + action'   filename
options : -F : 指明输入时用到的字段分隔符 
		  -v var=VALUE : 自定义变量
pattern: 正则表达式
action:某些计算操作
filename:文件名称

awk命令会默认用 空格 或者 [tab]键 来分割一条记录,然后将记录按照指定的域分隔符划分域填充域。

输入文件 | 输出文件 
last -n 5 | awk -F ' ' 'BEGIN{ print "标题"} {print $1"..”$3} END {print"end"}'

last -n 5 输入文件
| 管道操作
awk awk命令开始
-F ' ' 分隔符
'代码内容' 
BEGIN{ print "标题" } # 第一条语句
{print $1"..”$3 } # 中间语句:$1 第i条句子分割的第1个字段 和第3个字段 
# $0则代表所有域,$1表示第一个域,$n表示第n个域
END {print "end" } 最后一条语句

先执行BEGING,

然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,

最后执行END操作。

awk内置变量:

ARGC              命令行参数个数
ARGV              命令行参数排列
ENVIRON        支持队列中系统环境变量的使用
FILENAME       awk浏览的文件名
FNR                 浏览文件的记录数
FS                   设置输入域分隔符,等价于命令行 -F选项
NF                   浏览记录的域的个数
NR                  已读的记录数
OFS                输出域分隔符
ORS               输出记录分隔符
RS                  控制记录分隔符
awk '{ 
		for(i=2;i<=NF;i++) printf $i" ";print "" 
	}' lexicon.txt 
# 读取文件 utt2num_frames ,并计算第二列之和
# BEGIN{ 这里面放的是执行前的语句 }
# END {这里面放的是处理完所有的行后要执行的语句 }
# {这里面放的是处理每一行时要执行的语句}
awk 'BEGIN{sum=0} {sum+=$2} END{print sum} '  utt2num_frames 
awk '{print $NF}' # awk命令
# shell命令
gmm-info --print-args=false $dir/0.mdl | grep gaussians | awk '{print $NF}'

grep gaussians 查找带有gaussians的内容
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

语音不识别

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值