草庐IT

Linux实用基础3 find grep awk sed xargs

嘿嘿嘿嘿哈 2023-10-21 原文

主要学习自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] <a.txt                   全局替换大小写
tr [ATCG] [TAGC] <a.txt     将ATCG分别替换为TAGC
tr -d [chr] <a.txt               删除文件中的chr字符 d表示删除

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

有关Linux实用基础3 find grep awk sed xargs的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  3. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  4. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  5. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  6. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  7. Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理 - 2

    文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分

  8. ruby - 如何在 Ruby 中获取 linux 系统信息 - 2

    如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack

  9. ruby - rbenv:在 Linux Mint 上找不到 gem 命令 - 2

    我在LinuxMint17.2上。我最近使用apt-getpurgeruby​​删除了ruby​​。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,

  10. ruby - 在 Linux 上编译 Ruby 1.9.2 所需的先决条件? - 2

    我是Ruby和RoR的新手。我有一个带有Ubuntu镜像的干净Linode实例,我想从源代码编译Ruby而不是使用apt-get。我已经在谷歌上搜索了执行此操作的说明,但经过一些尝试后,当我尝试运行一些教程示例时,我不断收到有关缺少zlib和其他一些包的错误。任何人都可以给我详细的说明(或链接),教我如何在从源代码编译Ruby之前安装必要的必备包吗?我的目的是编译Ruby的最新稳定版本,然后安装Rubygems和Rails。提前感谢您的帮助!!! 最佳答案 Thisblogpost涵盖从源代码编译ruby​​所需的包和安装过程;它引

随机推荐