乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      常用文本處理命令

       印度阿三17 2019-12-06

      目錄

      Linux中很多文本工具都使用到了正則表達(dá)式,正則表達(dá)式可以極大的簡(jiǎn)化linux系統(tǒng)管理工作,因?yàn)榫W(wǎng)上有很多正則相關(guān)的教程,所以這里不再講述,我當(dāng)時(shí)看的是菜鳥的正則表達(dá)式,看個(gè)一下午在實(shí)驗(yàn)幾遍基本就會(huì)了,除了正向肯定預(yù)查,反向肯定預(yù)查這幾個(gè)比較復(fù)雜一些,其他都是非常簡(jiǎn)單的,很多時(shí)候記不住也可以查詢網(wǎng)上對(duì)著寫,并不需要你實(shí)時(shí)記住。這里主要談?wù)刟wk等用到正則表達(dá)式的文本處理工具。

      一、awk

      awk的指令必須包含在單引號(hào)中。

      基本句式

      awk -F'指定輸入分隔符' 'BEGIN{做一些初始化工作} 一些過(guò)濾條件 {針對(duì)每行的工作}... END{最后收尾工作}'

      中間的處理塊可以有多個(gè),通過(guò)過(guò)濾條件單每行都會(huì)走一遍過(guò)濾條件,其中BEGIN和END邊只會(huì)執(zhí)行一遍

      過(guò)濾記錄

      1. awk '$3==0 && $6=="LISTEN" ' netstat.txt
      2. awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt

      指定分隔符

      1. awk -F: '{print $1,$3,$6}' /etc/passwd等價(jià)于awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
      2. awk -F '[;:]' 指定多個(gè)分隔符
      3. awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd指定輸出分隔符

      需要注意的是上面print $1,$3,$6中的,被替換成了分隔符,如果是print $1$3$6則中間沒(méi)有分隔符

      特殊關(guān)鍵字:

      1. NR 目前處理的行號(hào)
      2. NF 當(dāng)前處理的行一共用到的字段數(shù)目
      3. FNR 目前處理的文件的行號(hào)(當(dāng)處理多個(gè)文件時(shí),NR會(huì)不停的累加,但如果是FNR則在處理新文件是從1開始)
      4. FILENAME 文件名
      5. $0 當(dāng)前整行
      6. FS 輸入字段分隔符 默認(rèn)是空格或Tab
      7. RS 輸入記錄分隔符 默認(rèn)為換行符
      8. OFS 輸出字段分隔符 默認(rèn)是空格或Tab
      9. ORS 輸出記錄分隔符 默認(rèn)為換行符

      正則

      1. 普通匹配: awk'/hello/ {print}' test.sh
      2. 匹配取反: awk '!/hello/ {print}' test.sh
      3. 同時(shí)匹配: awk '/hello/ && /world/ {print}' test.sh
      4. 或者匹配: awk '/hello/ || /world/ {print}' test.sh 也可以寫成awk '/hello|world/ {print}' test.sh
      5. 指定列匹配: awk '$5 ~ /hello/ {print}' test.sh
      6. 指定列匹配取反: awk '$5 !~ /hello/ {print}' test.sh

      輸出到不同的文件

      1. $ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt" }' netstat.txt
      2. awk 'NR!=1{print > $6}' netstat.txt

      其實(shí)使用了 >重定向,上例子使用了if語(yǔ)句

      1. 統(tǒng)計(jì)數(shù)據(jù): awk 'NR!=1{a[$6] ;} END {for (i in a) print i ", " a[i];}' netstat.txt
      2. 行數(shù)篩選,開頭和結(jié)尾的條件使用,分隔: awk '/test1/,/test2/ {print}' test.txt

      和環(huán)境變量的交互

      $ x=5
       
      $ y=10
      $ export y
       
      $ echo $x $y
      5 10
      $ awk -v val=$x '{print $1, $2, $3, $4 val, $5 ENVIRON["y"]}' OFS="\t" score.txt
      Marry   2143    78      89      87
      Jack    2321    66      83      55
      Tom     2122    48      82      81
      Mike    2537    87      102     105
      Bob     2415    40      62      72

      二、grep

      參數(shù)列表:

      1. -w 匹配整個(gè)單詞
      2. -s 忽略文件不存在等報(bào)錯(cuò)
      3. -l 僅列出匹配文件列表
      4. -L 僅列出不匹配文件列表
      5. -A 顯示后的行數(shù) 如-1 匹配行的后1行
      6. -B 顯示前的行數(shù) 如-1 匹配行的前1行
      7. -number 顯示前后的行數(shù) 如-1 匹配行的前后1行
      8. -n 打印行數(shù)
      9. -c 僅顯示個(gè)數(shù)
      10. -v 反向
      11. -o 僅顯示匹配的內(nèi)容
      12. -E 則表示要使用EREs
      13. -P 則表示要使用PREs

      grep主要就是一個(gè)正則表達(dá)式的使用,其中需要注意正則有三種BREs、EREs和PREs。前兩種不支持非貪婪匹配。grep默認(rèn)是BREs,所以他?, ,|,{,},(,)
      這種字符都需要用\轉(zhuǎn)義,另外他不支持\s,\S,\D,\d,\n等字符。

      三、sed

      sed命令在自動(dòng)化腳本編寫的過(guò)程還是經(jīng)常用到的。

      基本句式: sed -nfei [操作]

      操作: n1,n2 動(dòng)作

      動(dòng)作:

      1. d: 刪除
      2. s: 替換,行內(nèi)替換,行內(nèi)匹配的字符串,如hello world該行替換hello為hi變成hi world
      3. a和i: a增加在匹配的后面增加行 i增加在匹配的前面增加行
      4. c :替換,針對(duì)整行替換

      例子:

      1. sed -e 's/hello/hi/g':替換文本,-e可以省略
      2. sed -e '1,2s/hello/hi/g' -e '3,4s/world/man/g:等價(jià)于sed -e '1,2s/hello/hi/g;3,4s/world/man/g
      3. sed s/hello \(world\)/\1 hi/g':群組匹配,可以使用\n選擇前面的群組

      四、sort和uniq

      sort參數(shù)

      1. -r: 默認(rèn)升序,-r表示反序
      2. -u: 移除重復(fù)
      3. -o: 重定向到文件,注意sort test.txt >test.txt不可用,因?yàn)?gt; 是想清空文件,所以會(huì)導(dǎo)致文件在排序之前就清空了
      4. -n: 默認(rèn)按字符排序,如10小于2,-n表示按數(shù)字排序
      5. -t: 指定分隔符
      6. -k: 指明用哪一列來(lái)做排序
      7. -b: 忽略每行前面開始出的空格字符

      例子:

      1. sort -t $'\t' -k 1 -u res.txt > res2.txt 以tab作為分隔符,按第一列排序并去重

      uniq參數(shù)

      需要注意uniq需要文本是有序的,所以一般使用uniq的時(shí)候是用更早sort的管道后面

      1. -c:顯示出現(xiàn)的次數(shù)
      2. -d:僅顯示重復(fù)出現(xiàn)行;    
      3. -u :僅顯示出一次的行列;   

      說(shuō)說(shuō)sort|uniqsort -u,一直覺(jué)得很奇怪,兩者有什么區(qū)別,功能是一樣的。sort -u是后面加入的,所以很多人還是使用了sort|uniq,
      目前推薦使用sort -u,因?yàn)檫€少了進(jìn)程間通訊。

      五、實(shí)戰(zhàn)

      處理以下文件內(nèi)容,將域名取出并進(jìn)行計(jì)數(shù)排序,如處理:

      http://www.baidu.com/index.html
      http: / / www.baidu.com/1.html
      http://post.baidu.com/index.html
      http://mp3.baidu.com/index.html
      http://www.baidu.com/3.html
      http://post.baidu.com/2.html
      得到如下結(jié)果:
      3 www.baidu.com
      2 post.baidu.com
      1 mp3.baidu.com

      解法1:grep -Po '(?<=//)(.*?)(?=/)' test.txt |sort |uniq -c|sort -nr

      1.利用了Perl,他支持非貪婪,2.利用了正向和反向預(yù)查(正向預(yù)查是后面的(?=)) 3.利用了-o參數(shù)只輸出匹配的內(nèi)容

      解法2:awk -F/ '{print $3}' test.txt |sort |uniq -c|sort -nr

      指明了分割符號(hào) 直接取對(duì)應(yīng)值

      解法3:sed 's/http:\/\/\([^/]*\).*/\1/' test.txt|sort |uniq -c|sort -nr

      基本的正則中小括號(hào)需要轉(zhuǎn)義,如果采用-r參數(shù)即擴(kuò)展的正則小括號(hào)不用轉(zhuǎn)義

      解法4: sed -e 's/http:\/\///' -e 's/\/.*//' | sort | uniq -c | sort -rn

      采用了替換,先替換前面的,在替換后面的

      awk例子

      需要注意awk不支持多維數(shù)組,采用了一種變通的方式,普通的使用沒(méi)問(wèn)題,但是如果需要存的值是一個(gè)map就不合適了,如下
      文件 1-6列分別為deal od sum up lj day ,現(xiàn)在要計(jì)算sum up lj day 的累加和輸出
      輸出也要是deal od sum up lj day也就是sum up lj day需要是一個(gè)map,不過(guò)awk做不到這點(diǎn)

      {
          updealids:{
              od: {day,sum,up,lj}
              
          }
      }
      awk 'BEGIN{OFS="\t"}{result[$1,$3,"sum"] =$4;result[$1,$3,"up"] =$5;result[$1,$3,"lj"] =$6;result[$1,$3,"day"]=$2}END{for ( i in result)   {split(i, a, SUBSEP); print result[i] ,a[1], a[2], a[3] }}'  *

      參考資料:

      1. AWK 簡(jiǎn)明教程
      2. SED 簡(jiǎn)明教程
      來(lái)源:https://www./content-4-587001.html

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多