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

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

生活随笔

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

linux

linux —— shell 编程(文本处理)

發(fā)布時(shí)間:2023/12/20 linux 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux —— shell 编程(文本处理) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
導(dǎo)讀

本文為博文 linux —— shell 編程(整體框架與基礎(chǔ)筆記)的第4小點(diǎn)的拓展。(本文所有語(yǔ)句的測(cè)試均在 Ubuntu 16.04 LTS 上進(jìn)行)


目錄
  • 基本文本處理
  • 流編輯器sed
  • awk模式掃描與處理語(yǔ)言
  • 1、基本文本處理

    sort :用于排序,常用參數(shù) -t 指定一行的分隔符 -k 指定具體排序的規(guī)則 -d 按字典序排列 ?-f 忽略大小寫(xiě)

       ?-u (unique)丟棄相同指定字段的記錄

    unique:報(bào)告或刪除文件中重復(fù)的行。?-c 在輸出行前加上出現(xiàn)的次數(shù) ? ?-d ?(duplicated)顯示重復(fù)的行 ?

                      -u 僅顯示不重復(fù)的行?

    wc: ?統(tǒng)計(jì)文本行數(shù),字?jǐn)?shù)和字符數(shù)。 ? ?-c 字符數(shù) ? ?-w ?單詞數(shù) ? ?-l ?行數(shù)

    pr:將文本轉(zhuǎn)換成適合打印的格式。 ? -c 顯示的列數(shù)(截?cái)喑龅牟糠?

    fmt: 優(yōu)化文本的格式。 ?-w 設(shè)置一行顯示的最大行寬 ? -s ?只對(duì)過(guò)長(zhǎng)的行進(jìn)行換行,不要自動(dòng)回填。

    fold:限制文本寬度(強(qiáng)行截?cái)嗖Q行)。 -w 指定寬度 ?-s 只在空格處換行。

    cut :截取行的字段。 ? -delimiter ?設(shè)置字段分割符 -f List 設(shè)置截取的域 ?

               List可以是M,M-,M-N -M;可以用逗號(hào)指定多個(gè)

    join:連接兩個(gè)文件的數(shù)據(jù)字段。 ?join file1 file2 ?-1 M ?-2 N ? ?M、N指定匹配的字段

    tr: 文本替換。 tr set set :將str1上字符替換成str2上對(duì)于位置的字符; (可以是 tr 'a-z' 'A-Z')

           ?tr {-d|-s} set :-d 刪除set上的每一個(gè)字符 ;-s 除去連續(xù)出現(xiàn)的set中的字符,至只剩下單個(gè)

            tr -c (complement 互補(bǔ))使用set1的外的其他字符 [例子:tr -cs '[:lower:][:upper:]' '[\n*]' 單詞表]

    2、流編輯器sed

    0)sed 的作用和工作方式

    sed 是一個(gè)非交互式的的行編輯器,工作時(shí),從指定的輸入讀入一行數(shù)據(jù)存入被稱(chēng)為模式空間(Pattern Space) 的臨時(shí)緩沖區(qū),然后按照指定的sed編輯命令處理緩沖區(qū)里面的內(nèi)容,將結(jié)果輸出到標(biāo)準(zhǔn)輸出后從模式空間中刪除,然后繼續(xù)讀取下一行繼續(xù)工作。

    1) 地址范圍

    sed -e '1,5d' test.txt sed -e '/^#/d' test.txt

    規(guī)則表達(dá)式中使用的表達(dá)式字符:

    字符描述
    ^與行首匹配

    $

    與行尾匹配

    .

    與任意一個(gè)字符匹配
    *與之前一個(gè)字符的零個(gè)或多個(gè)出現(xiàn)匹配
    []與[]之間的所有字符匹配

    ?2) 參數(shù)

    -e ? ? 將腳本添加到命令執(zhí)行,如上面的 '/^#/d'

    -n ? ?禁止模式空間的自動(dòng)打印

    替換文本: ? sed -e "s/benson/BENSON/g" ?將benson 替換成大寫(xiě)

          sed -e "1,10s/benson/BENSON/g" 將1-10行的benson變成大寫(xiě)

         ? ? ?s/// 的 “/”可以被替換:比如 sed -e "s:/usr/local:/usr:g"?

    多條命令一起執(zhí)行: ?sed -n -e "=;p" ? 打印行號(hào);打印行 (等價(jià)與 sed -e "=" -e "p" )

    多條命令于同一地址范圍:sed -n -e '1,5{s/benson/BENSON/g;s/laur/LAUR/g}'

    把命令放在文件fsed里:sed -n -f fsed?

    3、awk模式掃描與處理語(yǔ)言

    awk 具有成為一門(mén)語(yǔ)言應(yīng)有的要素:變量,函數(shù)等,是強(qiáng)大的處理工具。

    例子:

    awk -F ":" '{print "USER:" $1 "\tSHELL: " $7 }' /etc/passwd 結(jié)果: USER:root SHELL: /bin/bash USER:daemon SHELL: /usr/sbin/nologin USER:sync SHELL: /bin/sync

    上面的命令也可以寫(xiě)入文件file.awk中:

    awk -f file.awk /etc/passwd BEGIN{ FS=":" } {print "USER:" $1 "\tSHELL: " $7 } file.awk 3.1 awk的變量和數(shù)組

    1)用戶(hù)自定義變量

    命名規(guī)則:[A-Za-z_][A-Za-z0-9_]*

    2) 常用的內(nèi)建變量

    變量說(shuō)明
    FILENAME當(dāng)前輸入的文件名稱(chēng)
    FNR當(dāng)前輸入的文件的記錄數(shù)
    FS字段分隔符(支持正則表達(dá)式),默認(rèn)空格
    NF當(dāng)前記錄的字段數(shù)
    NR在工作(job)中的記錄數(shù)
    OFS輸出字段分隔字符
    ORS輸出記錄分隔字符(默認(rèn)為“\n”)
    RS輸入記錄分隔字符

    3) awk數(shù)組 ?的字符索引支持?jǐn)?shù)字、字符串

    sit[google]="https://google.com" sit[baidu]="http;//baidu.com"數(shù)組存儲(chǔ)是稀疏的,可直接定義如下兩項(xiàng): x[1]=1234 x[1000]=234234delete x 將刪除數(shù)組里所有的元素刪除后,可以繼續(xù)定義如下: x=567

    訪問(wèn)環(huán)境變量:ENVIRON["PATH"]

    3.2 算數(shù)運(yùn)算 awk的運(yùn)算符?
    運(yùn)算符描述例子
    = ?+= ?*= ? /= ?^= ?**=賦值?
    ?=C條件表達(dá)式?
    || ? &&邏輯與或?
    ++--自增自減?
    ~ ? ~!匹配正則表達(dá)式和不匹配正則表達(dá)式?
    < ? <= ?> ?>= ?!= ?==關(guān)系運(yùn)算符?
    空格連接?
    + -加、減?
    * / ?%乘除 求余?
    + ?- ?!一元加減,邏輯非?
    ^ ?***求冪?
    $字段引用?
    in數(shù)組成員?

    awk支持的算數(shù)函數(shù):  

        sin(x) cos(x) atan2(x,2) :x,y 范圍內(nèi)的余切 int(x):沒(méi)有舍入地取整 exp(x)求冪 log(x):自然對(duì)數(shù) sqrt(x)?

        rand():產(chǎn)生>=0 <1的隨機(jī)數(shù) srand(x):x是rand()的種子

    3.3 條件和循環(huán)語(yǔ)句

    條件語(yǔ)句和循環(huán)語(yǔ)句與C類(lèi)似,支持break,continue(可以不使用;結(jié)尾)

    例子:將下面記錄每組一行輸出

    abc,123 tttt ddddddd,324 ssss ssdd sdfsd sdf dddd sfdfsdf 待處理數(shù)據(jù) BEGIN{FS="\n"RS=""    # RS設(shè)置為""將可以解析多行記錄(以空行分隔)ORS="" #輸出記錄分隔符不要換行 } {x=1while(x<NF){print $x "\t"x++}print $NF "\n" } 使用while循環(huán)

    結(jié)果:

    abc,123 tttt dddd ddd,324 ssss ssdd sdfsd sdf dddd sfdfsdf 處理結(jié)果 3.4 自定義函數(shù)

    在函數(shù)中,指定的參數(shù)將被當(dāng)做局部變量,而所有函數(shù)體內(nèi)未出現(xiàn)在參數(shù)列表中的變量會(huì)被視為全局性。為此,awk允許聲明過(guò)多的參數(shù)用于局部使用如:

    function add(x,y, sum) { sum = x+y return sum }

    如果需要使用函數(shù)進(jìn)行引用傳遞,只能通過(guò)傳入數(shù)組來(lái)實(shí)現(xiàn):

    引用傳遞 3.5 字符串處理

    格式化輸出:

    printf("%s have %d jobs","somebody",3) strout = sprintf("%s have %d jobs","somebody",3)

    格式化輸出的轉(zhuǎn)義字符:c s d ld (十進(jìn)制長(zhǎng)整數(shù)) u lu x lx o lo e(科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù)) f g(e或f中比較短的一種)

    printf 修飾符: ?- 左對(duì)齊 ? ? #顯示八進(jìn)制時(shí)在前面加個(gè)0;顯示十六進(jìn)制時(shí)在前面加0x ?

            ?+顯示defg 轉(zhuǎn)換的整數(shù)時(shí),加上正負(fù)號(hào) ? ?0 ?填充空白為0

            具體的格式為:%-width.precision fotmat-specifier

    awk內(nèi)置字符串函數(shù):

    awk函數(shù)描述
    sub(/reg/,newsubstr,str)替換第一個(gè)匹配的字符串
    gsub(/reg/,newsubstr,str)替換所有匹配
    index(str,substr)返回substr在str中的索引
    length(str)長(zhǎng)度
    match(str,/reg/)如果在str中找到正則表達(dá)式/reg/匹配的串,則返回出現(xiàn)的位置,未找到則返回0
    split(str,array,sep)使用sep分隔到array
    substr(str,position[,length])返回str從position開(kāi)始的length個(gè)字符
    tolower(str)變小寫(xiě)
    toupper(str)變大寫(xiě)
    sprintf("fmt",expr)格式化返回字符串

    ?

    3.6 多文件處理 10001 南京 佛擋殺佛 sdfsdf 10002 天津 發(fā)生地方 雙方的發(fā)生 10003 石家莊 發(fā)生地方 發(fā)生地方 a.txt 11000,南京 11003,天津 12000,河北省 13000,品上線(xiàn) 12344,石家莊 b.txt BEGIN{FS="[ ,]"OFS="," }NR <= FNR{array[$2]=$1 } NR > FNR{print $1,$2,array[$2] } join.awk awk -f join.awk a.txt b.txt 11000,南京,10001 11003,天津,10002 12000,河北省, 13000,品上線(xiàn), 12344,石家莊,10003 執(zhí)行結(jié)果

    ?

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

    總結(jié)

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

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