find /grep /xargs /sort /uniq /tr /cut /paste /sed /awk......待续......
1.find
名字查找: find . -name file #eg: find -name *txt 正则查找: find . -regex "pattern" #eg: find -regex ".*\.txt" -iregex:正则忽略大小写 反查找:
find . ! -name "*.txt"
按类型查找:
find . -type d
d: 目录
f:文件
按时间查找:
find . -atime 7 -type f
atime:访问时间(默认天d)
mtime:修改时间
ctime:变化时间
按大小查找:
find . -type f -size +2k #+号大于,-号小于
k,M,G
按权限查找:
find . -type f -perm 644
按用户查找:
find . -type f -user XX
搭配后续命令:
find . -type f -name ".swp" -delete #删除当前目录下所有的swp文件
find . -type f -mtime +10 -name "*.txt" -exec cp {} otherDir \
#exec执行动作,{}表查找匹配到的每一个对象,\续行符
#eg. -exec ./run.sh {} \
print:
find . -name "*.txt" -print0
#输出./2.txt./3.txt./1.txt => 加上 -print0 参数表示find输出的每条结果后面加上 '\0' 而不是换行
2.grep
grep 'pattern' file
-o:只输出匹配文本行
-v:只输出非匹配行
-c:统计包含文本次数
-n:打印匹配行号
-i:忽略大小写匹配
-r/R:递归匹配 #eg. grep -nr 'class' 当前目录所有匹配class的文件
-e:匹配多个模式 #eg. grep -e 'class' -e 'genus' file
匹配多个字符
任意字符:
egrep 'word|wore' file
grep -E 'word|wore' file
grep 'word\|wore' file
同时满足:
grep word1 file.txt | grep word2
-w:字符串精确匹配
grep -w '26' file #精确匹配26,不会匹配26a,262等,此法不能用于sed
grep '\<26\>' file #效果同上,可移植到sed中,sed 's/\<0\>/NA/g' file
(注意:0左右的.,;等符号仍会变为NA,如0.023替换为NA.023,最好加上边界符\b)
echo 0.023 |sed 's/\\b\<0\>\\b/NA/g'
ls -l |grep msms
3.xargs
传参命令(因为很多命令不支持管道来传参),xargs实现的是将管道传输过来的stdin进行处理然后传递到命令的参数位上。
echo '--help' | cat 等价于 --help echo '--help' | xargs cat 等价于 cat --help echo 'test.c test.cpp' | xargs cat 等价于 cat test.c test.cpp
xargs常与其他命令组合使用,如grep, find
eg:
find /sbin -perm +700 |ls -l 错误
find /sbin -perm +700 |xargs ls -l 正确 cat file.txt |xargs #将多行输出变为单行输出
cat single.txt |xargs -n 3 #将单行变为多行输出(每行3个字段)
xargs的作用不仅仅限于简单的stdin传递到命令的参数位,它更大的作用是可以将stdin或者文件stdin分割成批,每个批中有很多分割片段,然后将这些片段按批交给xargs后面的命令进行处理。
xargs处理的顺序:先分割,再分批,然后传递到参数位。
分割 -d:定义定界符(默认空格,多行定界符为\n)
echo '11@22@33' | xargs -d '@' echo #给echo传递了3个参数
-0:指定\0为输入定界符(一般与find连用)
find fir -type f -name "*.pl" -print0 |xargs -0 wc -l #统计程序行数
分批 -n:指定输出为多行(参数)
echo '11@22@33@44@55@66@77@88@99@00' | xargs -d '@' -n 3 echo
#分割为10个参数,每次传递3个参数(要执行4次才能传递完参数),等价于:
echo 11 22 33
echo 44 55 66
echo 77 88 99
echo 0
-E:不指定参数,注意只在不指定-d参数的时候有效
echo '11 22 33' | xargs -E '33' echo
#输出11 22
执行 -p:询问是否执行命令
echo '11@22@33' | xargs -p -d '@' echo
?...y #输入y执行
Ref: https://www.cnblogs.com/wangqiguo/p/6464234.html
4.sort
-n:按数字排序 -d:按字母排序 -r:逆序(大->小) -k:加数字,指定列排序 -b:忽略前导空白符(如空格) sort -nrk 2 data.txt sort -bd data.txt
5.uniq
消除重复行,常与sort连用 sort test.txt |uniq -c:统计各行次数 sort data.txt |uniq -c -d:打印重复行 sort data.txt |uniq -d
-u:打印非重复行
sort data.txt |uniq -u
6.tr
替换 cat file |tr '\t' ' ' 删除 -d cat file |tr -d '0-9' #删除所有数字 补集 -c cat file |tr -cd '0-9\n' #删除所有非数字
压缩 -s
cat file |tr -s ' ' #压缩空格(最常用),即多个空格只保留第一个
压缩制表符 '\t'
大小写转换:cat test.txt |tr '[:lower:]' '[:upper:]'
7.cut
--complement:取补集
cut -f3 --complement file #取除第三行外的所有列
-d:制定分隔符
cat -f2 -d";" file
分隔单位:
-f:以字段为单位
-b:以字节为单位
-c:以字符为单位
取值范围:
n-:n到结尾
-m:开始到m
n-m:n到m
eg:
cut -c-2 file #打印前2个字符
cut -c2- file #从第2个字符开始打印(包含第2个)
8.paste
-d:指定分隔符(默认为制表符) paste file1 file2 -d ","
9.sed
-g:全局替换 seg 's/text/replace_text/g' file -i:直接替换 seg -i 's/text/repalce_text/g' file -d:删除
sed 's/^$/d' file #删除空白行
替换换行符
sed ':label;N;s/\n/,/;t label' #将换行符替换为“,”
Ref:http://workingxiaolong.lofter.com/post/6b719_e32bc11
sed 's/Helicobacter.*//g;s/Sequence.*//g'
替换单词后面的全部内容(包括特殊符号),注意点号不可少
数字匹配替换
[0-9]\+ #至少1个,+要转义
[0-9]* #至少0个,*不需转义
字符串替换
[a-zA-Z]\+
[a-zA-Z]*
转义:
一般的特殊字符要转义 _ - -> +
各种括号视情况而定,表字符串本身时需要转义
打印行:
sed -n '1p;10p' file #打印第一行和第十行
sed -n '1,10p' file #打印1-10行
sed -n '1,5p;9p' test.txt #打印1-5行及第9行
删除行:
sed '/abc/d;/efg/d' file #删除含字符串"abc"或“efg"的行
sed '/^CON/d;/^REV/d' proteinGroups.txt
添加列:
sed 'N;2atest1 test2' file # 第2行后添加一行(即第3行为test1 test2)
sed 'N;2itest1 test2' file # 第1行前添加一行(即第1行为test1 test2),i前的数值至少为2
更易理解的方法:
sed '1 i\test1 test2' test.txt #在原第一行前添加一行
sed '1 a\test1 test2' test.txt #在原第一行后添加一行
10.awk
基本概念:
record:记录(行)
field:字段(列)
基本结构:
awk ' BEGIN{ statements1 } {statements2} END{ statements3 } '
工作方式:
执行begin 1,再一行行读入重复执行2,最后执行end 3。
awk ' {print NR}' file #打印每一行行号 awk ' END {print NR}' file #打印最后一行行号
特殊字符:
常用:
$0,$1,$2
-F:设置分隔符(默认空格),-F'\t' -F: NR:当前行号 NF:当前行的字段(列) FNR:多个文件时,每处理一个新文件都从1开始计起(而NR会累加)
其他:
RS:行分隔符(默认换行符\n)
ORS:输出当前行分隔符,与RS互为逆向/替换
FS:列分隔符
OFS:输出列分隔符(常用),与FS互为逆向/替换
awk 'BEGIN{ FS="----";OFS="\t" }{ print $1,$2,$3 }' filename
ref: https://www.cnblogs.com/fhefh/archive/2011/11/16/2251656.html
对行进行过滤:
awk 'NR<=5' file #打印前5行,同head awk 'NR==1,NR==4{print}' file #打印第1和4行 awk '/linux/' file #打印匹配行 awk '!/linux/' file #打印非匹配行
awk '/start_/, /end_/' file #打印两者(第一个)之间的行