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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux文本处理常用指令总结

發(fā)布時間:2023/12/18 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux文本处理常用指令总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引子

作為一個偏愛windows的程序員,以前做文本處理的時候總是喜歡在windows下用notepad++等圖形化工具處理,比如有時需要把linux服務(wù)器上一個文件進(jìn)行一次全局字符串替換這樣簡單的操作,還得把文件down到本地編輯好再傳回去。這兩天買了本《鳥哥的Linux私房菜》,終于靜下心系統(tǒng)的學(xué)習(xí)了一下linux下的文本處理,感覺其實沒有想象的難,如果早點學(xué)會節(jié)約下來的大量時間肯定遠(yuǎn)超過學(xué)習(xí)所花的時間。

概覽

先說一下本文要介紹的內(nèi)容:

  • 簡單回顧一下正則表達(dá)式,如果熟悉正則,至少知道正則分為基本正則和擴(kuò)展正則可以跳過該部分。
  • 本文主體:介紹4個linux文本處理命令:grep、sed、printf、awk。
  • 下面正式開始。

    正則表達(dá)式回顧

    這部分是給會正則表達(dá)式的讀者簡單回顧一下正則表達(dá)式,如果沒學(xué)過正則表達(dá)式的讀者建議先找相關(guān)資料學(xué)習(xí)正則表達(dá)式再來看本文。

    正則表達(dá)式分為基本正則表達(dá)式和擴(kuò)展正則表達(dá)式,內(nèi)容如下:

    基本正則表達(dá)式

    正則表達(dá)式字符含義
    ^word查找以word開頭的文本
    word$查找以word結(jié)尾的文本
    .代表一個任意字符
    \轉(zhuǎn)義符
    *0到多個字符
    [abc]代表一個字符,這個字符是a或b或c
    [a-z];[0-9]代表a到z中的一個字符;0到9中的一個數(shù)字
    [^abc]代表一個非a、b、c的字符
    {m,n}m到n個字符

    ?

    擴(kuò)展正則表達(dá)式

    正則表達(dá)式字符含義
    +一個或多個字符
    零個或一個字符
    |或者
    ()分組

    ?

    文本處理命令

    grep

    grep的作用是按行查找字符,輸出包含字符的行。

    grep用法:

    grep一般有兩種用法,一種是從文件查找,一種是從管道的輸入查找,

  • grep 'word' file.txt
  • cat file.txt|grep 'word'
  • grep的常用參數(shù):

    參數(shù)含義及示例
    -n輸出結(jié)果加行號
    --color=auto匹配的關(guān)鍵字高亮顯示
    -A3輸出匹配行的后三行
    -B2   輸出匹配行的前兩行
    -v  反向查找,即輸出不包含關(guān)鍵字的行
    -i關(guān)鍵字匹配時忽略關(guān)鍵字大小寫

    grep使用小技巧:

    多數(shù)情況我們都想要高亮關(guān)鍵詞(使用--color=auto參數(shù)),因此可以在~/.bashrc文件中添加上:

    alias grep='grep --color=auto'

    ?

    ,再用

    source ~/.bashrc

    讓配置生效。這樣當(dāng)我們使用grep的時候,就自動帶了--color=auto參數(shù)。

    grep使用示例:

    grep的查找主要就是基于基本正則表達(dá)式的匹配,下面只是簡單的給一些常用例子供參考。

    grep 't[ae]st'  //查找tast或test

    grep '[0-9]'   //查找數(shù)字

    grep '[^a-z]oo'  //查找Xoo,其中X是一個非a到z的字符

    grep '^the'  //查找以the開頭的字符,這里注意區(qū)分^出現(xiàn)在[]里時代表“非某字符”,如上個例子,出現(xiàn)在[]外時代表"以某字符開頭",如這個例子。

    grep '^$'  //查找空行

    grep 'o\{2\}'  //查找兩個o,這里需要注意,{}在shell里有特殊意義,因此需要轉(zhuǎn)義,這里與一般的正則使用不同,需要注意。

    egrep:

    我們知道正則表達(dá)式分為基本正則表達(dá)式和擴(kuò)展正則表達(dá)式,但是grep只支持基本正則表達(dá)式,如果要是用擴(kuò)展正則表達(dá)式,需要使用egrep命令。

    幾個例子:

    egrep 'gd|good'  //查找gd或good

    egrep 'g(la|oo)d'  //查找glad或good

    egrep 'A(xyz)+C'  //查找AXC,其中X是一個或一個以上的'xyz'字符串。

    ?

    sed

    sed是一個很強(qiáng)大的命令,可以用來做行刪除行新增、行選取、行替換字符串的替換這5種操作。

    sed是一個管道命令,可以處理管道輸入。

    1.行刪除

    nl /etc/passwd | sed '2d'  //刪除第2行

    下面將省略輸入管道

    sed '2,5d'  //刪除第2~5行

    sed '3,$d'  //刪除第3到最后一行,$代表最后一行

    sed '/^$/d'  //刪除空行

    2.行新增

    sed '2a drink tea'  //在第二行下面追加一行"drink tea",a代表append

    sed '2i drink tea'  //在第二行上面插入一行"drink tea",i代表insert

    sed '2a a\

    b\

    c'  //在第二行下面追加三行 "a"、"b"、"c",只需要每行結(jié)尾加"\"即可。

    3.行選取

    sed -n '5,7p'  //選取第5到7行輸出,必須加-n參數(shù),不然效果就是所有行都被輸出,而5到7行輸出兩次。

    4.行替換

    sed '2,5c No 2~5 lines'  //將第2到5行替換為一行字符串"No 2~5 lines"

    5.字符串替換

    sed 's/要被替換的字符串/新的字符串/g'  //固定的格式,開頭是s結(jié)尾是g,中間三個/分隔開要被替換的字符串和新的字符串,注意這里要被替換的字符串可以是正則表達(dá)式。

    ?

    將操作結(jié)果直接寫入文件

    默認(rèn)用sed對文件做修改之后,只是輸出修改后的文件,可以用>寫入到新的文件。但是如果想修改原始文件,千萬不能>到原始文件,這樣執(zhí)行的結(jié)果就是原文件直接被清空了。想要修改原始文件可以用 -i 參數(shù),如:

    sed -i '2d' file.txt  //直接將原文件中的第二行刪除。

    直接修改原文件是很危險的,一旦修改錯誤無法還原??梢韵炔患?-i 參數(shù)執(zhí)行命令把修改結(jié)果打印出來,確認(rèn)無誤后再加上 -i 參數(shù)。

    printf

    printf這個命令用語言不太好描述,但是一動手就明白了。

    把下面的內(nèi)容保存為printf.txt:

    Name Chinese English Math Average DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 73.33

    先cat看一下,是下面這個效果:

    現(xiàn)在用printf指令加一些參數(shù)來看一下,執(zhí)行

    printf '%10s %10s %10s %10s %10s \n' `cat printf.txt`

    輸出結(jié)果:

    是不是比cat輸出的結(jié)果漂亮多了。

    %10s代表這一列的寬度固定為10個字符。更多的格式就不介紹了,這篇文章我們掌握一個%10s就夠了。

    printf不是管道命令,要想用它處理文件必須像上面的命令那樣使用`cat printf.txt`把文件內(nèi)容給提出來。

    printf的使用相當(dāng)廣泛,后面的awk命令中也會應(yīng)用到printf命令。

    awk

    awk命令主要是將文件通過分隔符拆成列來處理,還能通過條件判斷對不同的行進(jìn)行不同的處理,甚至還可以進(jìn)行數(shù)值計算~

    我們也是通過例子來學(xué)習(xí)。

    我們先用last命令看一下最后登錄的5個用戶信息:

    圖中的第一列是用戶名,第三列是用戶ip,現(xiàn)在我們想摘出這兩列,用awk就可以做到:

    last -5|awk '{print $1 "\t" $3}'

    輸出:

    命令看起來挺復(fù)雜,不要著急,其實很簡單。

    首先awk使用時有固定的格式:awk '{命令}',單引號和大括號就是固定的格式而已。

    然后上面的命令就是

    print $1 "\t" $3 //awk默認(rèn)會用空格和tab將每行分隔為N列,$1代表第一列,$3代表第三列。

    這樣一看是不是簡單多了。

    剛剛的last命令產(chǎn)生的數(shù)據(jù)默認(rèn)就是用tab分隔的,現(xiàn)在我們看另一個例子,執(zhí)行 cat /etc/passwd:

    這次產(chǎn)生的數(shù)據(jù)每行是用 ?: 分隔的,那么想使用awk輸出第一列和第三列就需要執(zhí)行分隔符:

    cat /etc/passwd|awk -F ':' '{print $1 "\t" $3}' // -F ':' 代表指定使用 : 作為分隔符

    執(zhí)行結(jié)果:

    除了$1,$3這樣的特殊符號,

    awk的命令中還可以使用下面的特殊符號:

    NF :每一行分隔后的列數(shù)

    NR :行號

    下面用一個綜合的例子來說明awk的條件判斷和數(shù)值計算,有這樣一組數(shù)據(jù)保存為pay.txt:

    Name 1st 2nd 3rd VBird 23000 24000 25000 DMTsai 21000 20000 23000 Bird2 43000 42000 41000

    現(xiàn)在想加一列"Total",計算每一行的數(shù)值總和。

    用awk可以完成這個需求:

    cat pay.txt |awk 'NR==1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,$2+$3+$4}'

    運行結(jié)果:

    ?

    這里有幾個要點:

  • 加入條件判斷后,awk的格式為: awk '條件1 {命令1};條件2{命令2}'
  • 條件判斷有以下邏輯運算:
    • >
    • <
    • >=
    • <=
    • ==  //注意判斷相等要用兩個等號
    • !=
  • 可以直接運算行內(nèi)列的值($1、$2、$3)。
  • 總結(jié)

    這篇文章首先回顧了正則表達(dá)式(基本正則表達(dá)式、擴(kuò)展正則表達(dá)式),然后介紹了4個常用命令,最后我們歸納一下四個命令的用途:

    命令用途
    grep/egrep關(guān)鍵字查找
    sed
  • 行的刪除、添加、替換、選取
  • 關(guān)鍵字替換
  • printf?文件格式化輸出
    awk
  • ?將每行按分隔符拆分成列并選取某些列
  • ?通過邏輯判斷對不同行進(jìn)行不同的處理
  • ?對一行中的幾列數(shù)值進(jìn)行計算
  • ?

    參考資料:

    《鳥哥的Linux私房菜 ?基礎(chǔ)學(xué)習(xí)篇(第三版)》 ?第12章

    轉(zhuǎn)載于:https://www.cnblogs.com/sheeva/p/6406285.html

    總結(jié)

    以上是生活随笔為你收集整理的linux文本处理常用指令总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。