Linux實(shí)用基礎(chǔ)3 find grep awk sed xargs

主要學(xué)習(xí)自Linux操作與生物信息_嗶哩嗶哩_bilibili


生信入門(mén) linux實(shí)用基礎(chǔ)1 2 3

生信入門(mén) R實(shí)用基礎(chǔ)1 2


1 文件搜索 find

參考
linux 根據(jù)文件大小查找文件 - 朝陽(yáng)的向日葵 - 博客園 (cnblogs.com)
linux通配符和正則表達(dá)式_瘋狂的程序員11的博客-CSDN博客_mv 正則表達(dá)式

find ./ -name  '*.fna'                                搜索當(dāng)前目錄下以.fna結(jié)尾的文件
find ./ -amin 5                                         搜索當(dāng)前目錄下最近5分鐘生成的文件
find ./ -size  +1k                                      搜索當(dāng)前目錄下大于1k的文件
find ./ -name '*.fna' -exec rm '{}' \;                  搜索當(dāng)前目錄下以.fna結(jié)尾的文件并執(zhí)行刪除
find ./ -size +10M  -mtime -2                          查找當(dāng)前路徑下,文件大小大于100M,并且2天內(nèi)更 新過(guò)的文件,顯示出來(lái)
find ./ -size  +10M  -size -20M                        查找當(dāng)前路徑下,文件大小大于10M小于20M的文件
find ./ -type f -mtime -1 -size +100k -size-400k       -type f表示只查找文件,過(guò)濾掉文件夾,塊文件
  • 通配符與正則表達(dá)式:
    通配符用于匹配文件名,由shell解析的,比如find,ls,cp,mv等命令支持通配符查找文件名。
    正則表達(dá)式元字符有字符匹配、匹配次數(shù)、位置錨定、分組。主要是處理文本里的內(nèi)容,用來(lái)匹配文本里的字符串,針對(duì)文件內(nèi)容的文本過(guò)濾工具里,大都用到正則表達(dá)式,如grep,sed,awk,vim, less,nginx,varnish等命令支持正則表達(dá)式。

    更多正則表達(dá)式學(xué)習(xí)可看這個(gè):你是如何學(xué)會(huì)正則表達(dá)式的? - 知乎 (zhihu.com)

2 文本篩選 grep

參考grep命令詳解;單引號(hào)和雙引號(hào)區(qū)別 - 刷子丶 - 博客園 (cnblogs.com)

單、雙引號(hào)區(qū)別

  • 單引號(hào):可以說(shuō)是所見(jiàn)即所得:即將單引號(hào)內(nèi)的內(nèi)容原樣輸出,或者描述為單引號(hào)里面看到的是什么就會(huì)輸出什么。單引號(hào)''是全引用,被單引號(hào)括起的內(nèi)容不管是常量還是變量者不會(huì)發(fā)生替換。
  • 雙引號(hào):把雙引號(hào)內(nèi)的內(nèi)容輸出出來(lái);如果內(nèi)容中有命令、變量等,會(huì)先把變量、命令解析出結(jié)果,然后在輸出最終內(nèi)容來(lái)。雙引號(hào)""是部分引用,被雙引號(hào)括起的內(nèi)容常量還是常量,變量則會(huì)發(fā)生替換,替換成變量?jī)?nèi)容。
  • 不加引號(hào):不會(huì)將含有空格的字符串視為一個(gè)整體輸出, 如果內(nèi)容中有命令、變量等,會(huì)先把變量、命令解析出結(jié)果,然后在輸出最終內(nèi)容來(lái),如果字符串中帶有空格等特殊字符,則不能完整的輸出,需要改加雙引號(hào),一般連續(xù)的字符串,數(shù)字,路徑等可以用。
  • 使用規(guī)則:一般常量用單引號(hào)''括起即可,如果含有變量則用雙引號(hào)""括起,無(wú)變量無(wú)空格無(wú)特殊字符的連續(xù)字符串可不加引號(hào)
  • 最大不同:?jiǎn)我?hào)與雙引號(hào)的最大不同在于雙引號(hào)仍然可以保有變數(shù)的內(nèi)容,但單引號(hào)內(nèi)僅能是一般字符,而不會(huì)有特殊符號(hào),

常用命令示例

grep ">" a.txt | wc -l                    搜索文件中含有'>'的行,并統(tǒng)計(jì)行數(shù)
grep -c ">" a.txt                           統(tǒng)計(jì)有'>'的行數(shù), 等價(jià)于同上
grep -w "chr1" a.txt                     搜索全詞精確匹配'chr1'的行,-w表示整個(gè)word都匹配上
grep -n "chr1" a.txt                      搜索含有字符'chr1'的行并列出行號(hào)

grep -vc "chr" a.txt                    統(tǒng)計(jì)不含'chr'的行數(shù)的個(gè)數(shù)
grep 'chr' a.txt | grep -v 'chrX'       搜索文本中含有Chromosome的行并排除有Annotation 行       
grep -e "chrX" -e "chrY" a.txt           參數(shù)-e進(jìn)行多項(xiàng)操作(指定多個(gè)匹配模式,只要符合一個(gè)都會(huì)被輸出)

grep -w "chr1" a.txt -A 2                 搜索全詞精確匹配'chr1'的行行并列出下面兩行。 -A表示after
grep -w "chr1" a.txt -B 2                 使用grep的-B選項(xiàng),顯示匹配內(nèi)容及其前n行。-B表示before。
grep -w "chr1" a.txt -C 2                 使用grep的-C選項(xiàng),顯示匹配內(nèi)容及其前n行和后n行。

ls /usr/bin/ | grep "\.py"                      搜索特定目錄下名字包含'.py'的文件('.'需要轉(zhuǎn)義'./')
ls /usr/bin/ | grep "\.py\b"  或  "\.py$"        搜索特定目錄中以'.py'結(jié)尾的文件( '\b'或'$'表示結(jié)尾)
ls /usr/bin/ | grep "^ht"                        搜索特定目錄中以'ht'開(kāi)頭的文件

grep 1[1-9]  a.txt                             應(yīng)用正則表達(dá)式搜索包含'11'-'19'的行 
grep -vP "^\s*$" 1.txt                         去除空白行 
grep -P "^\d{11}$" 1.txt                      匹配含11位數(shù)字的行

grep應(yīng)用正則表達(dá)式的常用示例

  • . 替換某個(gè)字符(換行符除外),如 grep "e.t" 1.txt
    \ 轉(zhuǎn)義,如 .不能替代自身,需用\.來(lái)轉(zhuǎn)義
    *通配符可匹配前面的子表達(dá)式0或多次,如go*可匹配ggooo,經(jīng)常和 .一起使用.*可匹配任意字符無(wú)限多次

  • ?+,{},|, [] 等使用需要用grep -E ,即擴(kuò)展的正則表達(dá)式
    + 表示匹配1次及以上
    ?表示匹配0或1次
    {1,10}表示重復(fù)1到10次
    |表示或者,擇意匹配,如grep -E "eat|cat" 1.txt,匹配eat或cat
    [] 匹配括號(hào)內(nèi)任意字符,如 grep -E "[ec]at" 1.txt

  • grep不支持以下字符集簡(jiǎn)寫(xiě),需要用grep -P



    ^\s*$表示行首與尾都是空白(即空白行)
    去除空白行 :grep -vP "^\s*$" 1.txt
    匹配11位電話(huà)號(hào)碼:grep -P "^\d{11}$" 1.txt


3 sed (stream editor,流編輯器) (以每行為單位編輯)

注意sed結(jié)果默認(rèn)為屏幕輸出,并不改變?cè)瓉?lái)文件內(nèi)容,常用>重定向保存修改文件

sed
-e 默認(rèn)模式,一般用于多項(xiàng)修改,之后常用>重定向保存修改文件
-i 在原文件上直接進(jìn)行修改
-n 安靜模式,僅顯示處理后的結(jié)果,常與p連用,只輸出發(fā)生更改的特定行
-f 接腳本文件

  • 各種替換操作:
sed 's/NC/nc/g'   1.txt >2.txt      對(duì)文件中的NC替換成nc并另存為,s表示替換,g表示全局,命令一般用  ' '括起來(lái)
sed 's/A/a/2'     1.txt               對(duì)文件中的每行第2個(gè)A替換成a
sed 's/b/B/g;s/a/A/g'  1.txt         替換b和a為大寫(xiě),同時(shí)進(jìn)行多項(xiàng)操作可用`;`分隔開(kāi)

sed '1,5s/:/?/g'  2.txt                只對(duì)文件的1至5行內(nèi)容進(jìn)行替換':'為'?'
sed '1,5!s/:/?/g'  2.txt               只對(duì)文件的1至5行內(nèi)容不進(jìn)行替換,!表示非

sed  '/>/!s/A/a/g'  gene.fasta       對(duì)含有>的行不進(jìn)行操作,其他行進(jìn)行替換
sed  '/beat/,/ggle/s/o/O/g' 1.txt    將含有'beat' 和'ggle'字符行的中間行的'o'替換成'O',選擇條件之間用`/`和`,`隔開(kāi)

# sed常用的應(yīng)用:  將fastq格式轉(zhuǎn)化為fasta格式
zcat A.1.fq.gz |sed '0~4d' |sed '0~3d' |sed 's/^@/>/1' |less

若想要同一時(shí)間逐個(gè)替換多項(xiàng)內(nèi)容則需要用y選項(xiàng),如ATCG分別替換為TAGC,(注意默認(rèn)為全局替換,末尾不加g)

sed  '/>/!y/ATCG/TAGC/'  gene.fasta      (含有>的行不進(jìn)行替換)

各種刪除與輸出操作:

sed  '/^\s*$/d'   1.txt                   刪除文件中空白行,^\s*$表示行首與尾都是空白(即空白行),d表示刪除
sed  '3,10d'   1.txt                      刪除文件第3至10行
sed  '3,$d'  1.txt                        刪除文件中第3行及之后所有行的內(nèi)容

sed -n '3,10p'  1.txt                輸出文件第3至10行
sed -n '3p;10p' 1.txt                輸出文件第3行和10行,也可寫(xiě)成   sed -ne '3p' -e '10p'  1.txt      
sed -n  's/NC/nc/p'   1.txt      只輸出發(fā)生'NC'/'nc'替換的行
sed -n '/Chromosome:/p'  gene.txt   輸出含有Chromosome:的行
sed   's/:.*//g'  2.txt               刪除文件中每行的:及之后的所有內(nèi)容,即把:后的所有內(nèi)容(用.*表示)替換為空

若想在sed使用多項(xiàng)命令,還可以在輸入第一個(gè) ' 后回車(chē),即可在>后輸入多命令

tr命令

tr命令可看做簡(jiǎn)化版本的sed ,類(lèi)似于sed的y選項(xiàng)命令,常用于替換大小寫(xiě)等

tr [A-Z] [a-z] <a.txt                   全局替換大小寫(xiě)
tr [ATCG] [TAGC] <a.txt     將ATCG分別替換為T(mén)AGC
tr -d [chr] <a.txt               刪除文件中的chr字符 d表示刪除

4 驚人的awk:強(qiáng)大的文本分析工具(以每列為單位編輯)

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

常用命令示例

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

awk '$1>$2'  1.txt                                                        輸出第1列數(shù)值大于第二列數(shù)值的行
awk '$4>300 && $4<800'  1.txt                                             輸出第4列數(shù)值大于300小于800的行

awk -F "\"" '{print$4}'  1.txt                                           #以"為分隔符(\"轉(zhuǎn)義),輸出第4列
awk -F '"' '{print $2,"name:\n"$4}'   1.txt                        可以在print輸出中添加字符內(nèi)容 name:\n(換行符)

awk '{if ($1>=500 && $2>=1000) print $0}' x.txt                         對(duì)文本設(shè)置條件篩選進(jìn)行輸出
awk '{if ($1>200 && $2>500) print $0}' x.txt |sort -n -k1 |uniq |wc     統(tǒng)計(jì)符合篩選條件的數(shù)據(jù)
awk '{if ($1>1000) print "SoBig!!!:"$1 ;else print "Normal"}'  x.txt               利用if else 語(yǔ)句進(jìn)行條件篩選輸出

awk '$0~/chrmt/{print $0}'  1.txt                       輸出文件中包含有'chrmt'的行
awk -F ':' '$2~/10/{print $0}'  1.txt                    以:為分隔符,輸出第2列數(shù)值為10的行(若排除2列則為'$2!~')
  • 生成.txt文件列表,便于之后寫(xiě)程序批量化處理數(shù)據(jù)(注意當(dāng)用\易混淆時(shí)可用#作為分隔符):
find ./ -name '*.txt' |sed 's#\.#/media/sf_s#1'  |awk -F '/' '{print $NF"="$0}'  |sed 's/.txt//1'

BEGIN與END


操作前后添加語(yǔ)句:

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

5 參數(shù)傳遞xargs

參考xargs命令詳解,xargs與管道的區(qū)別 - 薰衣草的旋律 - 博客園 (cnblogs.com)

  • xargs與管道的區(qū)別
    xargs傳遞的是命令行參數(shù):xargs命令可以通過(guò)管道接受字符串,并將接收到的字符串通過(guò)空格分割成許多參數(shù)(默認(rèn)情況下是通過(guò)空格分割) 然后將參數(shù)傳遞給其后面的命令,作為后面命令的命令行參數(shù);管道符傳遞的是標(biāo)準(zhǔn)輸入,字符串
    如:
    echo '--help' | cat 該命令輸出的是echo的內(nèi)容:'--help'
    echo '--help' | xargs cat 等價(jià)于 cat --help ,輸出cat 幫助文檔信息
    find ./ -name '*.txt' | rm 此操作無(wú)效
    find ./ -name '*.txt' |xargs rm 搜索文件名后進(jìn)行刪除
    find ./ -name '*.txt' |xargs tar -zcvf 10.tar.gz 搜索特定文件名后進(jìn)行打包壓縮

  • xargs常用應(yīng)用:利用xargs終止特定進(jìn)程:
    sleep 500 & 將進(jìn)程sleep放入后臺(tái)運(yùn)行
    ps -u 'gu' | awk '/sleep/{print $1}' | xargs kill 列出用戶(hù)gu下的進(jìn)程,搜索sleep進(jìn)程并列出第一列的pid號(hào),kill程序

  • 參數(shù):

最常用參數(shù):
-d                  分隔符,默認(rèn)為換行符/n 
-i              (不是所有l(wèi)inux都支持) 或者是-I,將xargs的每項(xiàng)名稱(chēng),一般是一行一行賦值給 {},可以用 {} 代替。
-n             num 后面加次數(shù),表示命令在執(zhí)行的時(shí)候一次用的argument的個(gè)數(shù),默認(rèn)是用所有的(注意-I -L -n是排斥的)

其他:
-a                   接文件,從文件中讀
-e           flag,注意有時(shí)候可能會(huì)是-E,flag必須是一個(gè)以空格分隔的標(biāo)志,當(dāng)xargs分析到含有flag這個(gè)標(biāo)志的時(shí)候就停止
-L             -l 同 -L, num 從標(biāo)準(zhǔn)輸入一次讀取 num 行送給 command 命令。
-p              當(dāng)每次執(zhí)行一個(gè)argument的時(shí)候詢(xún)問(wèn)一次用戶(hù)。 
-P              修改最大的進(jìn)程數(shù),默認(rèn)是1,為0時(shí)候?yàn)閍s many as it can ,應(yīng)該平時(shí)都用不到的吧
-r                no-run-if-empty 當(dāng)xargs的輸入為空的時(shí)候則停止xargs,不用再去執(zhí)行了。
-s                num 命令行的最大字符數(shù),指的是 xargs 后面那個(gè)命令的最大命令行字符數(shù)
-t                     表示先打印命令,然后再執(zhí)行
-x                     exit的意思,主要是配合-s使用
  • 使用示例
cat test.txt  | xargs                            xargs  默認(rèn)是echo的功能,打印內(nèi)容并去除換行符
cat test.txt  | xargs   -n3                      每行打印3個(gè)單詞為一行( 字符排成3列)
cat test.txt | xargs -d: -n3                     以:為分隔符, 每行輸出3 列內(nèi)容

搜索指定目錄下的txt文件,將其復(fù)制到當(dāng)前目錄,并將其打包:

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

生信入門(mén) linux實(shí)用基礎(chǔ)1 2 3

生信入門(mén) R實(shí)用基礎(chǔ)1 2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容