1、标注输出/标准错误/标准输入
>> echo "I don't always test my code." "But when I do I do it in production"
>> printf "Even if you test the code for %d times, it could still fail at the %d-th time.\n" 100 101
>> printf "the usage of cpu is %.2f%%\n" 33.3333
printf类似C里面的printf,只是不用加括号,用空格分隔参数。echo会末尾输出换行,printf不会。
区分标准输出和标准错误
>> ls 1> ls.stdout 2> ls.stderr
同时输出
>> ls &> ls.stdalll
同时输出到屏幕
./run.sh 2>&1 | tee lxg.log
标准输入
>> rev # rev可以把输入左右颠倒
yitutech # 这是人工输入,需要回车
hcetutiy # 这是程序输出
(人工按 ctrl-D,程序结束。ctrl-D 在标准输入中意味着输入终止。
2、多命令组合
管道 | ,前者的输出作为后者的输入
>> echo yitutech | rev
hcetutiy
逻辑组合&&,前者成功了才会进入后者,||类似,只不过是前者失败了才会进入后者
[16:25:18] xiaoguang.li@Res-Ubuntu218: ~/temp
>> mkdir good && cd good
[16:33:15] xiaoguang.li@Res-Ubuntu218: ~/temp
>> mkdir good || echo "failed to create folder good"
mkdir: cannot create directory ‘good’: File exists
failed to create folder good
$(command)可以把命令输出嵌入到另一个命令中
[16:28:55] xiaoguang.li@Res-Ubuntu218: ~/temp/good
>> touch $(seq 1 3)
[16:29:17] xiaoguang.li@Res-Ubuntu218: ~/temp/good
>> ls
1 2 3 good
seq是生成一个序列,比如1到3
$(command)可用`command`替代,反引号,键盘上1左边那个
括号()可以组合多条命令
[16:29:22] xiaoguang.li@Res-Ubuntu218: ~/temp/good
>> (echo "first line"; echo "second line") > output.txt
[16:31:36] xiaoguang.li@Res-Ubuntu218: ~/temp/good
>> cat output.txt
first line
second line
3、文件系统
只保留文件名
[16:34:44] xiaoguang.li@Res-Ubuntu218: ~/temp
>> basename `pwd`
temp
[16:36:42] xiaoguang.li@Res-Ubuntu218: ~/temp
>> basename ~/temp/ls.stderr
ls.stderr
[16:36:57] xiaoguang.li@Res-Ubuntu218: ~/temp
>> basename '/home/xiaoguang.li/temp/ls.stdout'
ls.stdout
文件夹和分区大小
ncdu后出现统计页面,可以上下左右移动,按d直接删除文件夹,q退出,用来看哪个文件夹占用空间大很方便
用于重命名时,mv和rename区别
mv只能单个文件重命名,rename功能更强大,支持多文件。
多文件重命名
rename 's/V130700300/V130720300/' *
linux下的文件操作——批量重命名
linux下的文件操作——批量重命名 - pangbangb - 博客园
4、读文件内容
head和tail
[17:00:23] xiaoguang.li@Res-Ubuntu218: ~/temp
>> head -n 1 ls.stdout
ls.stderr
[17:01:56] xiaoguang.li@Res-Ubuntu218: ~/temp
>> tail -n 1 ls.stdout
ls.stdout
[17:02:07] xiaoguang.li@Res-Ubuntu218: ~/temp
>> tail -f ls.stdout
ls.stderr
ls.stdout
^C
more和less,more是分页查看文件,less是升级版more,会进入类似vim的界面,支持搜索
diff和vimdiff,diff就是平铺查看两个文件区别,vimdiff有左右比较
:qa退出全部,就是vim命令后面加a
递归比较两个文件夹,-q是只列出不同的文件名,不列出内容,不带q就是列出内容;-r是递归;
diff -Nrq dir1/ dir2
wc统计行数、字符数,word count
wc -l 只统计行数
5、写文件内容
文本处理有个很齐全的教程
cut按列切割矩阵
按冒号分隔,取第一段
grep xxx | cut -d : -f 1
cut命令_Linux cut命令:剪切文件中的数据
sort排序行,按每行字典序,默认以空格作为分隔符,也有随机排序也就是打乱的功能
uniq相邻两行消除重复
uniq只会消除相邻两行,一般uniq前先sort,保证最后是不重复的
uniq -c,消除时统计行数,把行数放在前面
grep,-v反查,-i不区分大小写,-P正则表达式
grep -nr "\"ageMHA\" \: 4" output/rider.avi/trackItem/*.json | wc -l
sed对文件内容进行逐行修改
如字符串替换,s开头,用任意符号分割都可以,如图里的#、/、|,用后者替代前者
最后加g是全行替换,不加是替换第一个
后面接文件名,如果想要改变原文件,加参数-i
sed -i 's#xxx#yyy#' zzz.list
ls -l / > root.txt && sed '/total/d' -i root.txt
支持正则表达式,下图是把紧接着两个数字的单词与后面的数字对调,final fantasy 15
用/d可以删除包含字符串的行,如图删掉了C++ is difficult那一行
sed -i 's/130700300/130720300/g' ./V130720300/*.json
头尾加符号
在每行的头添加字符,比如"HEAD",命令如下:
sed 's/^/HEAD&/g' test.file
在每行的行尾添加字符,比如“TAIL”,命令如下:
sed 's/$/&TAIL/g' test.file
一起加
sed '/./{s/^/HEAD&/;s/$/&TAIL/}' test.file
linux shell 用sed命令在文本的行尾或行首添加字符
linux shell 用sed命令在文本的行尾或行首添加字符 - aaronwxb - 博客园
只删除纯空行
sed '/^\s*$/d' file
删除纯空行和由空格组成的空行
sed '/^[ ]*$/d' file
awk对文本处理
下图秀一些操作,打印第一列和第三列,第一列求和,用cut也能实现,第一列求平均
awk打印列比cut强大,cut默认按tab分割,awk默认按tab或若干空格分隔
去掉空行
awk 'NF' log1 > log2
shuf按行随机洗牌,-n 3指定输出3行,比shuf 4.tmp | head -n 3快
rev按字符反转,先倒过来,按/分割取第一列,再倒过去
tr字符替换
下图是创建每行1个数总共10个数的文本,再把换行符替换成加号,再把最后一个加号换成等号,喂给bc(计算器)进行求和
5、常用工具
wget下载Leo一篇论文,-O指定路径
xargs把从标准输入读到的每行或每若干行,都执行相同动作
比如之前常用的删除.o文件
>> find . -name "*.tmp" | xargs rm
>> ls
games.txt good leo_paper.pdf ls.stdall ls.stdout
jq可以用来解析json
cat *.json | jq '.key_face.body_feature.feature_data'
parallel用于并行执行多个相近的命令
convert图像处理工具
history查看历史命令
time统计一个命令运行的时间
随机数
➜ temp echo $((RANDOM))
27022
6、文件名通配符
可以用[]进行匹配
sed -i 's/\"highest\": [0-9].[0-9],/\"highest\": 4.0,/g' branch_[0-3]_[0-3].conf
linux文件名匹配——通配符使用