Linux实用基础3 find grep awk sed xargs

主要学习自Linux操作与生物信息_哔哩哔哩_bilibili


生信入门 linux实用基础1 2 3

生信入门 R实用基础1 2


1 文件搜索 find

参考
linux 根据文件大小查找文件 - 朝阳的向日葵 - 博客园 (cnblogs.com)
linux通配符和正则表达式_疯狂的程序员11的博客-CSDN博客_mv 正则表达式

find ./ -name  '*.fna'                                搜索当前目录下以.fna结尾的文件
find ./ -amin 5                                         搜索当前目录下最近5分钟生成的文件
find ./ -size  +1k                                      搜索当前目录下大于1k的文件
find ./ -name '*.fna' -exec rm '{}' /;                  搜索当前目录下以.fna结尾的文件并执行删除
find ./ -size +10M  -mtime -2                          查找当前路径下,文件大小大于100M,并且2天内更 新过的文件,显示出来
find ./ -size  +10M  -size -20M                        查找当前路径下,文件大小大于10M小于20M的文件
find ./ -type f -mtime -1 -size +100k -size-400k       -type f表示只查找文件,过滤掉文件夹,块文件
  • 通配符与正则表达式:
    通配符用于匹配文件名,由shell解析的,比如find,ls,cp,mv等命令支持通配符查找文件名。
    正则表达式元字符有字符匹配、匹配次数、位置锚定、分组。主要是处理文本里的内容,用来匹配文本里的字符串,针对文件内容的文本过滤工具里,大都用到正则表达式,如grep,sed,awk,vim, less,nginx,varnish等命令支持正则表达式。

    更多正则表达式学习可看这个:你是如何学会正则表达式的? - 知乎 (zhihu.com)


2 文本筛选 grep

参考grep命令详解;单引号和双引号区别 - 刷子丶 - 博客园 (cnblogs.com)

单、双引号区别

  • 单引号:可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。
  • 双引号:把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
  • 不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
  • 使用规则:一般常量用单引号''括起即可,如果含有变量则用双引号""括起,无变量无空格无特殊字符的连续字符串可不加引号
  • 最大不同:单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字符,而不会有特殊符号,

常用命令示例

grep ">" a.txt | wc -l                    搜索文件中含有'>'的行,并统计行数
grep -c ">" a.txt                           统计有'>'的行数, 等价于同上
grep -w "chr1" a.txt                     搜索全词精确匹配'chr1'的行,-w表示整个word都匹配上
grep -n "chr1" a.txt                      搜索含有字符'chr1'的行并列出行号

grep -vc "chr" a.txt                    统计不含'chr'的行数的个数
grep 'chr' a.txt | grep -v 'chrX'       搜索文本中含有Chromosome的行并排除有Annotation 行       
grep -e "chrX" -e "chrY" a.txt           参数-e进行多项操作(指定多个匹配模式,只要符合一个都会被输出)

grep -w "chr1" a.txt -A 2                 搜索全词精确匹配'chr1'的行行并列出下面两行。 -A表示after
grep -w "chr1" a.txt -B 2                 使用grep的-B选项,显示匹配内容及其前n行。-B表示before。
grep -w "chr1" a.txt -C 2                 使用grep的-C选项,显示匹配内容及其前n行和后n行。

ls /usr/bin/ | grep "/.py"                      搜索特定目录下名字包含'.py'的文件('.'需要转义'./')
ls /usr/bin/ | grep "/.py/b"  或  "/.py$"        搜索特定目录中以'.py'结尾的文件( '/b'或'$'表示结尾)
ls /usr/bin/ | grep "^ht"                        搜索特定目录中以'ht'开头的文件

grep 1[1-9]  a.txt                             应用正则表达式搜索包含'11'-'19'的行 
grep -vP "^/s*$" 1.txt                         去除空白行 
grep -P "^/d{11}$" 1.txt                      匹配含11位数字的行

grep应用正则表达式的常用示例

  • . 替换某个字符(换行符除外),如 grep "e.t" 1.txt
    / 转义,如 .不能替代自身,需用/.来转义
    *通配符可匹配前面的子表达式0或多次,如go*可匹配ggooo,经常和 .一起使用.*可匹配任意字符无限多次

  • ?+,{}|, [] 等使用需要用grep -E ,即扩展的正则表达式
    + 表示匹配1次及以上
    ?表示匹配0或1次
    {1,10}表示重复1到10次
    |表示或者,择意匹配,如grep -E "eat|cat" 1.txt,匹配eat或cat
    [] 匹配括号内任意字符,如 grep -E "[ec]at" 1.txt

  • grep不支持以下字符集简写,需要用grep -P

    ^/s*$表示行首与尾都是空白(即空白行)
    去除空白行 :grep -vP "^/s*$" 1.txt
    匹配11位电话号码:grep -P "^/d{11}$" 1.txt


3 sed (stream editor,流编辑器) (以每行为单位编辑)

注意sed结果默认为屏幕输出,并不改变原来文件内容,常用>重定向保存修改文件

sed
-e 默认模式,一般用于多项修改,之后常用>重定向保存修改文件
-i 在原文件上直接进行修改
-n 安静模式,仅显示处理后的结果,常与p连用,只输出发生更改的特定行
-f 接脚本文件

  • 各种替换操作:
sed 's/NC/nc/g'   1.txt >2.txt      对文件中的NC替换成nc并另存为,s表示替换,g表示全局,命令一般用  ' '括起来
sed 's/A/a/2'     1.txt               对文件中的每行第2个A替换成a
sed 's/b/B/g;s/a/A/g'  1.txt         替换b和a为大写,同时进行多项操作可用`;`分隔开

sed '1,5s/:/?/g'  2.txt                只对文件的1至5行内容进行替换':'为'?'
sed '1,5!s/:/?/g'  2.txt               只对文件的1至5行内容不进行替换,!表示非

sed  '/>/!s/A/a/g'  gene.fasta       对含有>的行不进行操作,其他行进行替换
sed  '/beat/,/ggle/s/o/O/g' 1.txt    将含有'beat' 和'ggle'字符行的中间行的'o'替换成'O',选择条件之间用`/`和`,`隔开

# sed常用的应用:  将fastq格式转化为fasta格式
zcat A.1.fq.gz |sed '0~4d' |sed '0~3d' |sed 's/^@/>/1' |less

若想要同一时间逐个替换多项内容则需要用y选项,如ATCG分别替换为TAGC,(注意默认为全局替换,末尾不加g)

sed  '/>/!y/ATCG/TAGC/'  gene.fasta      (含有>的行不进行替换)

各种删除与输出操作:

sed  '/^/s*$/d'   1.txt                   删除文件中空白行,^/s*$表示行首与尾都是空白(即空白行),d表示删除
sed  '3,10d'   1.txt                      删除文件第3至10行
sed  '3,$d'  1.txt                        删除文件中第3行及之后所有行的内容

sed -n '3,10p'  1.txt                输出文件第3至10行
sed -n '3p;10p' 1.txt                输出文件第3行和10行,也可写成   sed -ne '3p' -e '10p'  1.txt      
sed -n  's/NC/nc/p'   1.txt      只输出发生'NC'/'nc'替换的行
sed -n '/Chromosome:/p'  gene.txt   输出含有Chromosome:的行
sed   's/:.*//g'  2.txt               删除文件中每行的:及之后的所有内容,即把:后的所有内容(用.*表示)替换为空

若想在sed使用多项命令,还可以在输入第一个 ' 后回车,即可在>后输入多命令

tr命令

tr命令可看做简化版本的sed ,类似于sed的y选项命令,常用于替换大小写等

tr [A-Z] [a-z] 

4 惊人的awk:强大的文本分析工具(以每列为单位编辑)

(一般常用gawk版本)
-f progfile 接脚本
-F file-separator 分隔符
-v var=var 变量

常用命令示例

awk '{print $1,$3}' 1.txt                                                输出文件第1和3列  ,命令用在'{ }'里写,$0表示输出整行
awk '{print $NF}' 1.txt                                                  输出文件最后一列(NF表示最后字段)

awk '$1>$2'  1.txt                                                        输出第1列数值大于第二列数值的行
awk '$4>300 && $4<800'  1.txt                                             输出第4列数值大于300小于800的行

awk -F "/"" '{print$4}'  1.txt                                           #以"为分隔符(/"转义),输出第4列
awk -F '"' '{print $2,"name:/n"$4}'   1.txt                        可以在print输出中添加字符内容 name:/n(换行符)

awk '{if ($1>=500 && $2>=1000) print $0}' x.txt                         对文本设置条件筛选进行输出
awk '{if ($1>200 && $2>500) print $0}' x.txt |sort -n -k1 |uniq |wc     统计符合筛选条件的数据
awk '{if ($1>1000) print "SoBig!!!:"$1 ;else print "Normal"}'  x.txt               利用if else 语句进行条件筛选输出

awk '$0~/chrmt/{print $0}'  1.txt                       输出文件中包含有'chrmt'的行
awk -F ':' '$2~/10/{print $0}'  1.txt                    以:为分隔符,输出第2列数值为10的行(若排除2列则为'$2!~')
  • 生成.txt文件列表,便于之后写程序批量化处理数据(注意当用/易混淆时可用#作为分隔符):
find ./ -name '*.txt' |sed 's#/.#/media/sf_s#1'  |awk -F '/' '{print $NF"="$0}'  |sed 's/.txt//1'

BEGIN与END

操作前后添加语句:

awk 'BEGIN{print "/nThe Work Begin!!!/n" } {if($1>200 && $2>500) print $0} END{print "/n THE WORK END!!!!!/n"}' x.txt  

5 参数传递xargs

参考xargs命令详解,xargs与管道的区别 - 薰衣草的旋律 - 博客园 (cnblogs.com)

  • xargs与管道的区别
    xargs传递的是命令行参数:xargs命令可以通过管道接受字符串,并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令,作为后面命令的命令行参数;管道符传递的是标准输入,字符串
    如:
    echo '--help' | cat 该命令输出的是echo的内容:'--help'
    echo '--help' | xargs cat 等价于 cat --help ,输出cat 帮助文档信息
    find ./ -name '*.txt' | rm 此操作无效
    find ./ -name '*.txt' |xargs rm 搜索文件名后进行删除
    find ./ -name '*.txt' |xargs tar -zcvf 10.tar.gz 搜索特定文件名后进行打包压缩

  • xargs常用应用:利用xargs终止特定进程:
    sleep 500 & 将进程sleep放入后台运行
    ps -u 'gu' | awk '/sleep/{print $1}' | xargs kill 列出用户gu下的进程,搜索sleep进程并列出第一列的pid号,kill程序

  • 参数:

最常用参数:
-d                  分隔符,默认为换行符/n 
-i              (不是所有linux都支持) 或者是-I,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-n             num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的(注意-I -L -n是排斥的)

其他:
-a                   接文件,从文件中读
-e           flag,注意有时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止
-L             -l 同 -L, num 从标准输入一次读取 num 行送给 command 命令。
-p              当每次执行一个argument的时候询问一次用户。 
-P              修改最大的进程数,默认是1,为0时候为as many as it can ,应该平时都用不到的吧
-r                no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s                num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数
-t                     表示先打印命令,然后再执行
-x                     exit的意思,主要是配合-s使用
  • 使用示例
cat test.txt  | xargs                            xargs  默认是echo的功能,打印内容并去除换行符
cat test.txt  | xargs   -n3                      每行打印3个单词为一行( 字符排成3列)
cat test.txt | xargs -d: -n3                     以:为分隔符, 每行输出3 列内容

搜索指定目录下的txt文件,将其复制到当前目录,并将其打包:

find ~/wk/ -name '*txt' | xargs -i cp {} ./  | tar -zcvf hhh.tar.gz  *.txt  

生信入门 linux实用基础1 2 3

生信入门 R实用基础1 2

版权声明:
作者:主机优惠
链接:https://www.techfm.club/p/47271.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>