<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          超全的 Linux Shell 文本處理工具集錦,快收藏

          共 4997字,需瀏覽 10分鐘

           ·

          2020-09-21 11:11

          點(diǎn)擊上方藍(lán)色“程序猿DD”,選擇“設(shè)為星標(biāo)”
          回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!
          作者 |?大CC
          來源 |?www.cnblogs.com/me15/p/3427319.html


          本文將介紹Linux下使用Shell處理文本時(shí)最常用的工具:
          find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;
          提供的例子和參數(shù)都是最常用和最為實(shí)用的;
          對shell腳本使用的原則是命令單行書寫,盡量不要超過2行;
          如果有更為復(fù)雜的任務(wù)需求,還是考慮python吧;

          01 find 文件查找

          1 查找txt和pdf文件
          1. find . ( -name "*.txt"-o -name "*.pdf") -print

          2 正則方式查找.txt和pdf
          1. find . -regex ".*(.txt|.pdf)$"

          -iregex:忽略大小寫的正則
          3 否定參數(shù)
          查找所有非txt文本
          1. find . ! -name "*.txt"-print

          4 指定搜索深度
          打印出當(dāng)前目錄的文件(深度為1)
          1. find . -maxdepth 1-type f

          5 定制搜索
          按類型搜索:
          1. find . -type d -print //只列出所有目錄

          2. -type f 文件 / l 符號鏈接

          按時(shí)間搜索:
          1. -atime 訪問時(shí)間 (單位是天,分鐘單位則是-amin,以下類似)


          2. -mtime 修改時(shí)間 (內(nèi)容被修改)


          3. -ctime 變化時(shí)間 (元數(shù)據(jù)或權(quán)限變化)

          最近7天被訪問過的所有文件:
          1. find . -atime 7-type f -print

          按大小搜索:
          w字 k M G
          尋找大于2k的文件
          1. find . -type f -size +2k

          按權(quán)限查找:
          1. find . -type f -perm 644-print //找具有可執(zhí)行權(quán)限的所有文件

          按用戶查找:
          1. find . -type f -user weber -print// 找用戶weber所擁有的文件

          6 找到后的后續(xù)動(dòng)作
          刪除:
          刪除當(dāng)前目錄下所有的swp文件:
          1. find . -type f -name "*.swp"-delete

          執(zhí)行動(dòng)作(強(qiáng)大的exec)
          1. find . -type f -user root -exec chown weber {} ; //將當(dāng)前目錄下的所有權(quán)變更為weber

          注:{}是一個(gè)特殊的字符串,對于每一個(gè)匹配的文件,{}會被替換成相應(yīng)的文件名;
          eg:將找到的文件全都copy到另一個(gè)目錄:
          1. find . -type f -mtime +10-name "*.txt"-exec cp {} OLD ;

          7 結(jié)合多個(gè)命令
          tips: 如果需要后續(xù)執(zhí)行多個(gè)命令,可以將多個(gè)命令寫成一個(gè)腳本。然后 -exec 調(diào)用時(shí)執(zhí)行腳本即可;
          1. -exec ./commands.sh {} ;

          -print的定界符
          默認(rèn)使用' '作為文件的定界符;
          -print0 使用''作為文件的定界符,這樣就可以搜索包含空格的文件;

          02 grep 文本搜索

          1. grep match_patten file // 默認(rèn)訪問匹配行

          常用參數(shù):
          • -o 只輸出匹配的文本行 VS -v 只輸出沒有匹配的文本行

          • -c 統(tǒng)計(jì)文件中包含文本的次數(shù)


          1. grep -c "text" filename

          • -n 打印匹配的行號

          • -i 搜索時(shí)忽略大小寫

          • -l 只打印文件名

          1 在多級目錄中對文本遞歸搜索(程序員搜代碼的最愛):
          1. grep "class". -R -n

          2 匹配多個(gè)模式
          1. grep -e "class"-e "vitural" file

          3 grep輸出以作為結(jié)尾符的文件名:(-z)
          1. grep "test" file* -lZ| xargs -0 rm

          4 xargs 命令行參數(shù)轉(zhuǎn)換
          xargs 能夠?qū)⑤斎霐?shù)據(jù)轉(zhuǎn)化為特定命令的命令行參數(shù);這樣,可以配合很多命令來組合使用。比如grep,比如find;
          將多行輸出轉(zhuǎn)化為單行輸出
          1. cat file.txt| xargs

          是多行文本間的定界符
          將單行轉(zhuǎn)化為多行輸出
          1. cat single.txt | xargs -n 3

          -n:指定每行顯示的字段數(shù)
          xargs參數(shù)說明
          • -d 定義定界符 (默認(rèn)為空格 多行的定界符為 )

          • -n 指定輸出為多行

          • -I {} 指定替換字符串,這個(gè)字符串在xargs擴(kuò)展時(shí)會被替換掉,用于待執(zhí)行的命令需要多個(gè)參數(shù)時(shí)

          eg:
          1. cat file.txt | xargs -I {} ./command.sh -p {} -1

          -0:指定為輸入定界符
          eg:統(tǒng)計(jì)程序行數(shù)
          1. find source_dir/ -type f -name "*.cpp"-print0 |xargs -0 wc -l

          03 sort 排序

          字段說明:
          • -n 按數(shù)字進(jìn)行排序 VS -d 按字典序進(jìn)行排序

          • -r 逆序排序

          • -k N 指定按第N列排序

          eg:
          1. sort -nrk 1 data.txt

          2. sort -bd data // 忽略像空格之類的前導(dǎo)空白字符

          04 uniq 消除重復(fù)行

          消除重復(fù)行
          1. sort unsort.txt | uniq

          統(tǒng)計(jì)各行在文件中出現(xiàn)的次數(shù)
          1. sort unsort.txt | uniq -c

          找出重復(fù)行
          1. sort unsort.txt | uniq -d

          可指定每行中需要比較的重復(fù)內(nèi)容:-s 開始位置 -w 比較字符數(shù)

          05 用 tr 進(jìn)行轉(zhuǎn)換

          通用用法
          1. echo 12345| tr '0-9''9876543210'//加解密轉(zhuǎn)換,替換對應(yīng)字符

          2. cat text| tr ' '' '//制表符轉(zhuǎn)空格

          tr刪除字符
          1. cat file | tr -d '0-9'// 刪除所有數(shù)字

          -c 求補(bǔ)集
          1. cat file | tr -c '0-9'//獲取文件中所有數(shù)字

          2. cat file | tr -d -c '0-9 '//刪除非數(shù)字?jǐn)?shù)據(jù)

          tr壓縮字符
          tr -s 壓縮文本中出現(xiàn)的重復(fù)字符;最常用于壓縮多余的空格
          1. cat file | tr -s ' '

          字符類
          tr中可用各種字符類:
          • alnum:字母和數(shù)字

          • alpha:字母

          • digit:數(shù)字

          • space:空白字符

          • lower:小寫

          • upper:大寫

          • cntrl:控制(非可打?。┳址?/span>

          print:可打印字符
          使用方法:tr [:class:] [:class:]
          1. eg: tr '[:lower:]''[:upper:]'

          06 cut 按列切分文本

          截取文件的第2列和第4列:
          1. cut -f2,4 filename

          去文件除第3列的所有列:
          1. cut -f3 --complement filename

          -d 指定定界符:
          1. cat -f2 -d";" filename

          cut 取的范圍
          • N- 第N個(gè)字段到結(jié)尾

          • -M 第1個(gè)字段為M

          • N-M N到M個(gè)字段

          cut 取的單位
          • -b 以字節(jié)為單位

          • -c 以字符為單位

          • -f 以字段為單位(使用定界符)

          eg:
          1. cut -c1-5 file //打印第一到5個(gè)字符

          2. cut -c-2 file //打印前2個(gè)字符

          07 paste 按列拼接文本

          將兩個(gè)文本按列拼接到一起;
          1. cat file1


          2. 1

          3. 2


          4. cat file2


          5. colin

          6. book


          7. paste file1 file2


          8. 1 colin

          9. 2 book

          默認(rèn)的定界符是制表符,可以用-d指明定界符
          1. paste file1 file2 -d ","


          2. 1,colin

          3. 2,book

          08 wc 統(tǒng)計(jì)行和字符的工具

          1. wc -l file // 統(tǒng)計(jì)行數(shù)

          2. wc -w file // 統(tǒng)計(jì)單詞數(shù)

          3. wc -c file // 統(tǒng)計(jì)字符數(shù)

          09 sed 文本替換利器

          首處替換
          1. seg 's/text/replace_text/' file //替換每一行的第一處匹配的text

          全局替換
          1. seg 's/text/replace_text/g' file

          默認(rèn)替換后,輸出替換后的內(nèi)容,如果需要直接替換原文件,使用-i:
          1. seg -i 's/text/repalce_text/g' file

          移除空白行:
          1. sed '/^$/d' file

          變量轉(zhuǎn)換
          已匹配的字符串通過標(biāo)記&來引用.
          1. echo this is en example | seg 's/w+/[&]/g'


          2. $>[this] [is] [en] [example]

          子串匹配標(biāo)記
          第一個(gè)匹配的括號內(nèi)容使用標(biāo)記 來引用
          1. sed 's/hello([0-9])//'

          雙引號求值
          sed通常用單引號來引用;也可使用雙引號,使用雙引號后,雙引號會對表達(dá)式求值:
          1. sed 's/$var/HLLOE/'

          當(dāng)使用雙引號時(shí),我們可以在sed樣式和替換字符串中指定變量;
          1. eg:

          2. p=patten

          3. r=replaced

          4. echo "line con a patten"| sed "s/$p/$r/g"

          5. $>line con a replaced

          其它示例
          字符串插入字符:將文本中每行內(nèi)容(PEKSHA) 轉(zhuǎn)換為 PEK/SHA
          1. sed 's/^.{3}/&//g' file

          10 awk 數(shù)據(jù)流處理工具

          awk腳本結(jié)構(gòu)
          1. awk ' BEGIN{ statements } statements2 END{ statements } '

          工作方式
          1.執(zhí)行begin中語句塊;
          2.從文件或stdin中讀入一行,然后執(zhí)行statements2,重復(fù)這個(gè)過程,直到文件全部被讀取完畢;
          3.執(zhí)行end語句塊;
          print 打印當(dāng)前行
          使用不帶參數(shù)的print時(shí),會打印當(dāng)前行;
          1. echo -e "line1 line2"| awk 'BEGIN{print "start"} {print } END{ print "End" }'

          print?以逗號分割時(shí),參數(shù)以空格定界;
          1. echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3";

          2. print var1, var2 , var3; }'

          3. $>v1 V2 v3

          使用-拼接符的方式(""作為拼接符);
          1. echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3";

          2. print var1"-"var2"-"var3; }'

          3. $>v1-V2-v3

          特殊變量:NR NF $0 $1 $2
          • NR:表示記錄數(shù)量,在執(zhí)行過程中對應(yīng)當(dāng)前行號;

          • NF:表示字段數(shù)量,在執(zhí)行過程總對應(yīng)當(dāng)前行的字段數(shù);

            • $0:這個(gè)變量包含執(zhí)行過程中當(dāng)前行的文本內(nèi)容;

            • $1:第一個(gè)字段的文本內(nèi)容;

            • $2:第二個(gè)字段的文本內(nèi)容;

          1. echo -e "line1 f2 f3 line2 line 3"| awk '{print?NR":"$0"-"$1"-"$2}'

          打印每一行的第二和第三個(gè)字段:
          1. awk '{print $2, $3}' file

          統(tǒng)計(jì)文件的行數(shù):
          1. awk ' END {print NR}' file

          累加每一行的第一個(gè)字段:
          1. echo -e "1 2 3 4 "| awk 'BEGIN{num = 0 ;

          2. print "begin";} {sum += $1;} END {print "=="; print sum }'

          傳遞外部變量
          1. var=1000

          2. echo | awk '{print vara}' vara=$var # 輸入來自stdin

          3. awk '{print vara}' vara=$var file # 輸入來自文件

          用樣式對awk處理的行進(jìn)行過濾
          1. awk 'NR < 5'#行號小于5

          2. awk 'NR==1,NR==4 {print}' file #行號等于1和4的打印出來

          3. awk '/linux/'#包含linux文本的行(可以用正則表達(dá)式來指定,超級強(qiáng)大)

          4. awk '!/linux/'#不包含linux文本的行

          設(shè)置定界符
          使用-F來設(shè)置定界符(默認(rèn)為空格)
          1. awk -F: '{print $NF}'/etc/passwd

          讀取命令輸出
          使用getline,將外部shell命令的輸出讀入到變量cmdout中;
          1. echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'

          在awk中使用循環(huán)
          1. for(i=0;i<10;i++){print $i;}

          2. for(i in array){print array[i];}

          eg:
          以逆序的形式打印行:(tac命令的實(shí)現(xiàn))
          1. seq 9|


          2. awk '{lifo[NR] = $0; lno=NR}


          3. END{ for(;lno>-1;lno--){print lifo[lno];}


          4. } '

          awk實(shí)現(xiàn)head、tail命令
          1. head:

          2. awk 'NR<=10{print}' filename

          1. tail:

          2. awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){

          3. print buffer[i %10]} } ' filename

          打印指定列
          awk方式實(shí)現(xiàn):
          1. ls -lrt | awk '{print $6}'

          cut方式實(shí)現(xiàn)
          1. ls -lrt | cut -f6

          打印指定文本區(qū)域
          確定行號
          1. seq 100| awk 'NR==4,NR==6{print}'

          確定文本
          打印處于startpattern 和endpattern之間的文本;
          1. awk '/start_pattern/, /end_pattern/' filename

          1. eg:

          2. seq 100| awk '/13/,/15/'

          3. cat /etc/passwd| awk '/mai.*mail/,/news.*news/'

          awk常用內(nèi)建函數(shù)
          1. index(string,search_string):返回search_string在string中出現(xiàn)的位置

          2. sub(regex,replacement_str,string):將正則匹配到的第一處內(nèi)容替換為replacement_str;

          3. match(regex,string):檢查正則表達(dá)式是否能夠匹配字符串;

          4. length(string):返回字符串長度

          1. echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'

          printf 類似c語言中的printf,對輸出進(jìn)行格式化
          eg:
          1. seq 10| awk '{printf "->%4s ", $1}'

          迭代文件中的行、單詞和字符
          1. 迭代文件中的每一行
          while 循環(huán)法
          1. while read line;

          2. do

          3. echo $line;

          4. done< file.txt

          改成子shell:
          1. cat file.txt | (while read line;do echo $line;done)

          awk法:
          1. cat file.txt| awk '{print}'

          2.迭代一行中的每一個(gè)單詞
          1. for word in $line;

          2. do

          3. echo $word;

          4. done

          ?
          ?3. 迭代每一個(gè)字符
          ${string:startpos:numof_chars}:從字符串中提取一個(gè)字符;(bash文本切片)${#word}:返回變量word的長度
          1. for((i=0;i<${#word};i++))

          2. do

          3. echo ${word:i:1);

          4. done

          -?END -


          往期推薦

          Redis為什么變慢了?常見延遲問題定位與分析

          為什么 GROUP BY 之后不能直接引用原表中的列?

          Java開發(fā)中Websocket的技術(shù)選型參考

          為什么MySQL不推薦使用uuid或者雪花id作為主鍵?

          用鴻蒙跑了個(gè) “hello world”!鴻蒙開發(fā)初體驗(yàn)


          我們在星球聊了很多深度話題,你不來看看?
          我的星球是否適合你?
          點(diǎn)擊閱讀原文看看我們都聊過啥?
          瀏覽 28
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人成视频在线免费观看 | 成人在线大香蕉免费 | 1204人妻一区二区三区 | 免费日韩黄色电影 | 蜜桃视频在线观看91 |