日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c++清空一个txt文本_Linux下常用文本处理命令大全

發布時間:2024/9/27 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++清空一个txt文本_Linux下常用文本处理命令大全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux中很多文本工具都使用到了正則表達式,正則表達式可以極大的簡化linux系統管理工作,因為網上有很多正則相關的教程,所以這里不再講述,我當時看的是菜鳥的正則表達式,看個一下午在實驗幾遍基本就會了,除了正向肯定預查,反向肯定預查這幾個比較復雜一些,其他都是非常簡單的,很多時候記不住也可以查詢網上對著寫,并不需要你實時記住。這里主要談談awk等用到正則表達式的文本處理工具。

一、awk

awk的指令必須包含在單引號中。

基本句式

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

中間的處理塊可以有多個,通過過濾條件單每行都會走一遍過濾條件,其中BEGIN和END邊只會執行一遍

過濾記錄

  • awk '$3==0 && $6=="LISTEN" ' netstat.txt
  • awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt
  • 指定分隔符

  • awk -F: '{print $1,$3,$6}' /etc/passwd等價于awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
  • awk -F '[;:]' 指定多個分隔符
  • awk -F: '{print $1,$3,$6}' OFS="" /etc/passwd指定輸出分隔符
  • 需要注意的是上面print $1,$3,$6中的,被替換成了分隔符,如果是print $1$3$6則中間沒有分隔符

    特殊關鍵字:

  • NR 目前處理的行號
  • NF 當前處理的行一共用到的字段數目
  • FNR 目前處理的文件的行號(當處理多個文件時,NR會不停的累加,但如果是FNR則在處理新文件是從1開始)
  • FILENAME 文件名
  • $0 當前整行
  • FS 輸入字段分隔符 默認是空格或Tab
  • RS 輸入記錄分隔符 默認為換行符
  • OFS 輸出字段分隔符 默認是空格或Tab
  • ORS 輸出記錄分隔符 默認為換行符
  • 正則

  • 普通匹配: awk'/hello/ {print}' test.sh
  • 匹配取反: awk '!/hello/ {print}' test.sh
  • 同時匹配: awk '/hello/ && /world/ {print}' test.sh
  • 或者匹配: awk '/hello/ || /world/ {print}' test.sh 也可以寫成awk '/hello|world/ {print}' test.sh
  • 指定列匹配: awk '$5 ~ /hello/ {print}' test.sh
  • 指定列匹配取反: awk '$5 !~ /hello/ {print}' test.sh
  • 輸出到不同的文件

  • $ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt" }' netstat.txt
  • awk 'NR!=1{print > $6}' netstat.txt
  • 其實使用了 >重定向,上例子使用了if語句

  • 統計數據: awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt
  • 行數篩選,開頭和結尾的條件使用,分隔: awk '/test1/,/test2/ {print}' test.txt
  • 和環境變量的交互

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

    二、grep

    參數列表:

  • -w 匹配整個單詞
  • -s 忽略文件不存在等報錯
  • -l 僅列出匹配文件列表
  • -L 僅列出不匹配文件列表
  • -A 顯示后的行數 如-1 匹配行的后1行
  • -B 顯示前的行數 如-1 匹配行的前1行
  • -number 顯示前后的行數 如-1 匹配行的前后1行
  • -n 打印行數
  • -c 僅顯示個數
  • -v 反向
  • -o 僅顯示匹配的內容
  • -E 則表示要使用EREs
  • -P 則表示要使用PREs
  • grep主要就是一個正則表達式的使用,其中需要注意正則有三種BREs、EREs和PREs。前兩種不支持非貪婪匹配。grep默認是BREs,所以他?,+,|,{,},(,)這種字符都需要用轉義,另外他不支持s,S,D,d,等字符。

    三、sed

    sed命令在自動化腳本編寫的過程還是經常用到的。

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

    操作: n1,n2 動作

    動作:

  • d: 刪除
  • s: 替換,行內替換,行內匹配的字符串,如hello world該行替換hello為hi變成hi world
  • a和i: a增加在匹配的后面增加行 i增加在匹配的前面增加行
  • c :替換,針對整行替換
  • 例子:

  • sed -e 's/hello/hi/g':替換文本,-e可以省略
  • sed -e '1,2s/hello/hi/g' -e '3,4s/world/man/g:等價于sed -e '1,2s/hello/hi/g;3,4s/world/man/g
  • sed s/hello (world)/1 hi/g':群組匹配,可以使用選擇前面的群組
  • 四、sort和uniq

    sort參數

  • -r: 默認升序,-r表示反序
  • -u: 移除重復
  • -o: 重定向到文件,注意sort test.txt >test.txt不可用,因為> 是想清空文件,所以會導致文件在排序之前就清空了
  • -n: 默認按字符排序,如10小于2,-n表示按數字排序
  • -t: 指定分隔符
  • -k: 指明用哪一列來做排序
  • -b: 忽略每行前面開始出的空格字符
  • 例子:

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

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

  • -c:顯示出現的次數
  • -d:僅顯示重復出現行;    
  • -u :僅顯示出一次的行列;   
  • 說說sort|uniq 和sort -u,一直覺得很奇怪,兩者有什么區別,功能是一樣的。sort -u是后面加入的,所以很多人還是使用了sort|uniq,目前推薦使用sort -u,因為還少了進程間通訊。

    五、實戰

    處理以下文件內容,將域名取出并進行計數排序,如處理:

    http://www.baidu.com/index.htmlhttp: / / www.baidu.com/1.htmlhttp://post.baidu.com/index.htmlhttp://mp3.baidu.com/index.htmlhttp://www.baidu.com/3.htmlhttp://post.baidu.com/2.html得到如下結果:3 www.baidu.com2 post.baidu.com1 mp3.baidu.com

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

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

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

    指明了分割符號 直接取對應值

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

    基本的正則中小括號需要轉義,如果采用-r參數即擴展的正則小括號不用轉義

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

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

    awk例子

    需要注意awk不支持多維數組,采用了一種變通的方式,普通的使用沒問題,但是如果需要存的值是一個map就不合適了,如下文件 1-6列分別為deal od sum up lj day ,現在要計算sum up lj day 的累加和輸出輸出也要是deal od sum up lj day也就是sum up lj day需要是一個map,不過awk做不到這點

    { updealids:{ od: {day,sum,up,lj} }}awk 'BEGIN{OFS=""}{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] }}' *

    總結

    以上是生活随笔為你收集整理的c++清空一个txt文本_Linux下常用文本处理命令大全的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。