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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

linux

linux文本处理常用指令总结

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

引子

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

概覽

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

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

    正則表達(dá)式回顧

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

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

    基本正則表達(dá)式

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

    ?

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

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

    ?

    文本處理命令

    grep

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

    grep用法:

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

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

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

    grep使用小技巧:

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

    alias grep='grep --color=auto'

    ?

    ,再用

    source ~/.bashrc

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

    grep使用示例:

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

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

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

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

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

    grep '^$'  //查找空行

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

    egrep:

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

    幾個(gè)例子:

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

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

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

    ?

    sed

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

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

    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'  //固定的格式,開(kāi)頭是s結(jié)尾是g,中間三個(gè)/分隔開(kāi)要被替換的字符串和新的字符串,注意這里要被替換的字符串可以是正則表達(dá)式。

    ?

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

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

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

    直接修改原文件是很危險(xiǎn)的,一旦修改錯(cuò)誤無(wú)法還原。可以先不加 -i 參數(shù)執(zhí)行命令把修改結(jié)果打印出來(lái),確認(rèn)無(wú)誤后再加上 -i 參數(shù)。

    printf

    printf這個(gè)命令用語(yǔ)言不太好描述,但是一動(dòng)手就明白了。

    把下面的內(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看一下,是下面這個(gè)效果:

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

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

    輸出結(jié)果:

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

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

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

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

    awk

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

    我們也是通過(guò)例子來(lái)學(xué)習(xí)。

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

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

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

    輸出:

    命令看起來(lái)挺復(fù)雜,不要著急,其實(shí)很簡(jiǎn)單。

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

    然后上面的命令就是

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

    這樣一看是不是簡(jiǎn)單多了。

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

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

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

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

    除了$1,$3這樣的特殊符號(hào),

    awk的命令中還可以使用下面的特殊符號(hào):

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

    NR :行號(hào)

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

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

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

    用awk可以完成這個(gè)需求:

    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}'

    運(yùn)行結(jié)果:

    ?

    這里有幾個(gè)要點(diǎn):

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

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

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

    參考資料:

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

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

    總結(jié)

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

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