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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sed与awk命令小结

發(fā)布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sed与awk命令小结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.sed命令小結

Sed是一個非交互式文本編輯器,它可對文本文件和標準輸入進行編輯,標準輸入可以是來自鍵盤輸入、文件重定向、字符串、變量,甚至來自管道的文本。Sed從文本的一個文本行或標準輸入中讀取數(shù)據(jù),將其復制到緩沖區(qū),然后讀取命令行或腳本的第一個命令,對此命令要求的行號進行編輯,重復此過程,直到命令行或腳本中的所有命令都執(zhí)行完畢。相對于vi等其他文本編輯器,sed可以一次性處理所有的編輯任務,顯得非常高效,為用戶節(jié)省了大量的時間。

  • 1.?語法sed [OPTION]... {script} [input-file]...

  • 工作機制:每次讀取一行文本至“模式空間(pattern space)”中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;

    ???-r支持擴展正則

    ???-n靜默模式:不輸出,只編輯

    ???-e script1 –e script2 –e script3多點編輯

    ???-f 從配置文件中讀取腳本,然后按腳本執(zhí)行

    ???-i 直接修改源文件;默認是不修改源文件的

    ?

    地指定界:

    ??#:指定行

    ??$:最后一行

    ??/regexp/:能夠被regexp所匹配的行

    ??\%regexp%:同上

    ??/regexp/|\%regexp%忽略字符大小寫


    開始行,結束行:

    ??#, /regexp/:從#開始,披到到/regexp/結束

    ??#,#1:#開始,#1結束

    ??/regexp1/,/regexp2/,從匹配1開始到匹配2結束

    ??#,+n:#開始,匹配之后的n行

    ? first~step:first開始,step步進

    ?

  • 2.sed的編輯命令

  • (1)打印某行

    sed -n 'n'p filename 單引號內(nèi)的n是一個數(shù)字,表示第幾行:

    ?

    ???

    ????????????#sed?-n?'2'p/etc/passwd


    要想把所有行都打印出來可以使用 sed -n '1,$'p filename

    ???

    ????????????#sed?-n?'1,$'p?/etc/passwd


    也可以指定一個區(qū)間:

    ? ?

    ????????????#sed?-n?'1,3'p?/etc/passwd


    ???

    ?

    (2)打印包含某個字符串的行

    ? ?

    ????????????#sed?-n?'/root/'p?/etc/passwd


    grep中使用的特殊字符,如 ^ $ . * 等同樣也能在sed中使用

    ? ?

    ????????????#sed?-n?'/^root/'p/etc/passwd


    ? ?

    ????????????#sed?-n?'/in$/'p?/etc/passwd


    ?

    (3)-e可以實現(xiàn)多個行為

    ? ?

    ????????????#sed?-e?'1'p?-e'/^ftp/'p?-n?/etc/passwd


    ?

    (4)刪除某行或者多行

    ? ?

    ????????????#sed?'1'd?/tmp/passwd


    ? ?

    ????????????#sed?'1,3'd?/tmp/passwd


    ? ?

    ????????????#sed?'/adm/'d?/tmp/passwd


    ‘d’ 這個字符就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字符的行,另外還可以刪除從某一行一直到文檔末行。

    ?

    (5)替換字符或字符串

    ??? ?

    ????????????#sed?'1,2s/ot/to/g'/tmp/passwd


    上例中的 ‘s’ 就是替換的命令, ‘g’ 為本行中全局替換,如果不加 ‘g’ 只換該行中出現(xiàn)的第一個。除了可以使用‘/’ 作為分隔符外,還可以使用其他特殊字符例如 ‘#’ 或者‘@’ 都沒有問題。

    ?

    (6)調換兩個字符串的位置

    ? ?

    ????????????#sed?'s/\(root\)\(.*\)\(bash\)/\3\2\1/'/tmp/passwd


    這個就需要解釋一下了,上例中用 () 把所想要替換的字符括起來成為一個整體,因為括號在sed中屬于特殊符號,所以需要在前面加脫意字符 ‘’, 替換時則寫成 ‘1’, ‘‘2’, ‘‘3’ 的形式。

    ?

    (7)直接修改文件的內(nèi)容

    ? ?

    ????????????#sed?-i?'s/ot/to/g'?/tmp/passwd


    ?

    練習:

    1、刪除/boot/grub/grub.conf文件中所有行首的空白字符

    ????????????#sed's/^[[:space:]]\+//'?/tmp/grub.conf


    ?

    2、刪除/etc/fstab文件中所有#開頭,后至少跟一個空白字符的行的行首的#和空白字符

    ????????????#sed's/^#[[:space:]]\+//'?/etc/fstab


    ?

    3、把/etc/fstab文件的奇數(shù)行另存為/tmp/fstab.3

    ????????????#sed'1~2w?/tmp/fstab.3'?/etc/fstab


    ?

    4、echo一個文件路徑給sed命令,取出其基名,進一步取出其路徑名

    取基名:

    ????????????#echo?"/etc/sysconfig/network-scripts/"?|?sed's@^.*/\([^/]\+\)/\?$@\1@'


    取路徑名:

    ????????????#echo?"/etc/sysconfig/network-scripts/"?|?sed's@[^/]\+/\?$@@'


    ?

  • 3.高級命令:

  • 保持空間,hold space

    保存模式空間中的內(nèi)容

    ??? h:用模式空間內(nèi)容覆蓋保持空間內(nèi)容

    ??? H:用模式空間內(nèi)容追加保持空間內(nèi)容

    ??? g:從保持空間中取1行內(nèi)容覆蓋到模式空間

    ??? G:從保持空間取呢容追加模式空間

    ??? x:交換內(nèi)容

    ??? n:讀取匹配行下一行,覆蓋保持空間

    ??? N:讀取匹配行,追加保持空間

    ??? d:刪除模式空間的內(nèi)容

    ??? D:刪除多行模式空間中的首行

    注意:命令功能可使用!取反;分號可用于分隔腳本;

    ?

    示例:

    在文件中的每行后方添加空白行;

    ????????????#sed?'G'?/etc/issue

    保留最后一行;

    ????????????#sed?'$!d'?/etc/fstab

    保證指定的文件每一行后方有且只有一個空白行;

    ????????????#sed?'/^$/d;G'?/etc/issue

    保留奇數(shù)行;

    ????????????#sed?'n;d'?/etc/issue

    ?

    ?

    2.???awk編程小結

    awk是由Aho, WeinbergerKernighan共同開發(fā)的編程語言。基本語法與C語言類似。

    awk功能與sed相似,都是用來進行文本處理的,awk語言可以從文件或字符串中基于指定規(guī)則瀏覽和抽取信息,在抽取信息的基礎上,才能進行其他文本操作。

    awk是一種編程語言,awk實際是指向gawk的符號鏈接。

    ?

    1、基本語法

    awk [options] 'program' file file ...

    awk [options] 'PATTERN{action}' file file...

    -F CHAR:輸入分隔符

    ?

    2、awk的輸出:

    print item1, item2,...

    要點:

    (1) 各項目之間使用逗號分隔,而輸出時則使用輸出分隔符分隔;

    (2) 輸出的各item可以字符串或數(shù)值、當前記錄的字段、變量或awk的表達式;數(shù)值會被隱式轉換為字符串后輸出;

    (3) print后面item如果省略,相當于print $0;輸出空白,使用pirnt ""

    ?

    3、awk的變量

    內(nèi)置變量,自定義變量

    3.1 內(nèi)置變量

    FSField Seperator, 輸入時的字段分隔符

    示例:

    ????????#awk?'BEGIN{FS=":"}{print?$1,$7}'?/etc/passwd

    ????????

    RSRecord Seperator, 輸入行分隔符

    OFS: Output Field Seperator, 輸出時的字段分隔符;

    ORS: Outpput Row Seperator, 輸出時的行分隔符;

    NFNumbers of Field,字段數(shù)

    NRNumbers of Record, 行數(shù);所有文件的一并計數(shù);

    FNR:行數(shù);各文件分別計數(shù);

    ARGV:數(shù)組,保存命令本身這個字符,awk '{print $0}' 1.txt 2.txt,意味著ARGV[0]保存awk,

    ARGC: 保存awk命令中參數(shù)的個數(shù);

    FILENAME awk正在處理的當前文件的名稱;

    ?

    3.2 可自定義變量

    ???????? -v var_name=VALUE

    ?

    ???????? 變量名區(qū)分字符大小寫;

    ?

    ???????? (1) 可以program中定義變量;

    ???????? (2) 可以命令行中通過-v選項自定義變量;

    ?

    4awkprintf命令

    命令的使用格式:printfformat, item1, item2,...

    要點:

    ???????? (1) 要指定format

    ???????? (2) 不會自動換行;如需換行則需要給出\n

    ???????? (3) format用于為后面的每個item指定其輸出格式;

    ???????? format格式的指示符都%開頭,后跟一個字符:

    ????????????????? %c: 顯示字符的ASCII碼;

    ????????????????? %d, %i: 十進制整數(shù);

    ????????????????? %e, %E: 科學計數(shù)法顯示數(shù)值;

    ????????????????? %f: 顯示浮點數(shù);

    ????????????????? %g, %G: 以科學計數(shù)法格式或浮點數(shù)格式顯示數(shù)值;

    ????????????????? %s: 顯示字符串;

    ????????????????? %u: 顯示無符號整數(shù);

    ????????????????? %%: 顯示%自身;

    ???????? 修飾符:

    ????????????????? #:顯示寬度

    ????????????????? -:左對齊

    ????????????????? +:顯示數(shù)值的符號

    ????????????????? .#: 取值精度

    ?

    5、awk輸出重定向

    print items > output-file

    print items >> output-file

    print items | command

    ?

    特殊文件描述符:

    /dev/stdin: 標準輸入

    /dev/stdout: 標準輸出

    /dev/stderr: 錯誤輸出

    ?

    6、awk的操作符

    算術操作符:

    ???????? x+y

    ???????? x-y

    ???????? x*y

    ???????? x/y

    ???????? x**y, x^y

    ???????? x%y

    ???????? -x:負值

    ???????? +x:轉換為數(shù)值

    ?

    字符串操作符:連接

    ?

    ???????? 賦值操作符:

    ????????????????? =

    ????????????????? +=

    ????????????????? -=

    ????????????????? *=

    ????????????????? /=

    ????????????????? %=

    ????????????????? ^=

    ????????????????? **=

    ????????????????? ++

    ????????????????? --

    ????????????????? 如果模式自身是=號,要寫為/=/

    ?

    ???????? 比較操作符:

    ????????????????? <

    ????????????????? <=

    ????????????????? >

    ????????????????? >=

    ????????????????? ==

    ????????????????? !=

    ????????????????? ~:模式匹配,左邊的字符串能夠被右邊的模式所匹配為真,否則為假;

    ????????????????? !~: 與上面相反

    ?

    ???????? 邏輯操作符:

    ????????????????? &&

    ????????????????? ||:或

    ?

    ???????? 條件表達式:

    ???????? selector?if-true-expression:if-false-expression

    ?

    示例:

    ? ? ? ? ?

    ????????#awk?-F:?'{$3>=1000?utype="commonuser":utype="admin?or?system?user";print$1,"is",utype}'?/etc/passwd

    ????????

    ?

    ???????? 函數(shù)調用:

    ????????????????? function_name(argu1,argu2)

    ?

    7、模式

    (1) Regexp: 格式為/PATTERN/

    ????????????????? 僅處理被/PATTERN/匹配到的行;

    (2) Expression: 表達式,其結果為非0或非空字符串時滿足條件;

    ????????????????? 僅處理滿足條件的行;

    (3) Ranges: 行范圍,此前地址定界,

    ????????????????? NR

    ????????????????? 僅處理范圍內(nèi)的行

    (4) BEGIN/END: 特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之后(END)執(zhí)行一次;

    (5) Empty:空模式,匹配任意行;

    ?

    8、常用的action

    (1) Expressions

    (2) Control statements

    (3) Compound statements

    (4) input statements

    (5) output statements

    ?

    9、控制語句

    9.1 if-else

    ???????? 格式:if(condition) {then body} else {else body}

    示例:

    ? ? ?

    ????????#awk?-F:?'{if($3>=500)?{print?$1,"is?a?common?user"}?else?{print?$1,?"isan?admin?or?system?user"}}'?/etc/passwd

    ? ? ?

    ????????#awk?'{if?(NF>=8){print}}'?/etc/inittab

    ?


    9.2 while

    ???????? 格式:while(condition) {while body}

    示例:

    ? ? ? ?

    ????????#awk?'{i=1;?while(i<=NF){printf?"%s?",$i;i+=2};print?""}'?/etc/inittab

    ?

    ? ? ? ? ?

    ????????#awk?'{i=1;?while(i<=NF){if?(length($i)>=6)?{print?$i};?i++}}'?/etc/inittab

    ?

    ????

    ???????? length()函數(shù):取字符串的長度

    ?

    9.3 do-while循環(huán)

    ???????? 格式:do{do-while body} while (condition)

    ?

    9.4 for循環(huán)

    ???????? 格式:for(variable assignment; condition; iteration process) {for body}

    示例:

    ? ? ? ? ?

    ????????#awk?'{for(i=1;i<=NF;i+=2){printf?"%s?",$i};print?""}'/etc/initta

    ? ? ? ?

    ????????#awk?'{for(i=1;i<=NF;i++){if?(length($i)>=6)?print?$i}}'?/etc/inittab

    ?

    ???????? for循環(huán)可用來遍歷數(shù)組元素:

    ????????????????? 語法:for (i inarray) {for body}

    ?

    9.5 case語句

    ???????? 語法:switch(expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}

    ?

    9.6 循環(huán)控制

    ???????? break

    ???????? continue

    ?

    9.7 next

    ???????? 提前結束對本行的處理進而提前進入下一行的處理;

    ? ? ?

    ????????#awk?-F:?'{if($3%2==0)next;print?$1,$3}'?/etc/passwd

    ? ? ? ?

    ????????#awk?-F:?'{if(NR%2==0)?next;print?NR,$1}'?/etc/passwd

    ?

    10、數(shù)組

    傳統(tǒng)數(shù)組:Index編號從1開始;

    關聯(lián)數(shù)組:

    ???????? array[index-expression]

    ???????? index-expression: 可以使用任意字符串; 如果某數(shù)組元素事先不存在,那么在引用時,awk會自動創(chuàng)建此元素并將其初始化為空串;因此,要判斷某數(shù)組是否存在某元素,必須使用“index in array”這種格式;

    ?

    ????????????????? A[first]="helloawk"

    ????????????????? printA[second]

    ?

    ???????? 要遍歷數(shù)組中的每一個元素,需要使用如下特殊結構:

    ????????????????? for (var inarray) {for body}

    ????????????????? var會遍歷array的索引;

    ????????????????? state[LISTEN]++

    ????????????????? state[ESTABLISHED]++

    ?

    示例:

    ? ? ? ? ? ? ? ?

    ????????#netstat?-tan|?awk?'/^tcp/{++state[$NF]}END{for?(s?in?state)?{print?s,state[s]}}'

    ????????????????? ????????

    刪除數(shù)組元素:

    ???????? delete array[index]

    ?

    11、awk的內(nèi)置函數(shù)

    split(string,array[,fieldsep[,seps]])

    ???????? 功能:將string表示的字符串以fieldsep為分隔符進行切片,并切片后的結果保存至array為名的數(shù)組中;數(shù)組下標從1開始;

    ???????? ???????? root:x:0:0::/root:/bin/bash

    ???????? ???????? user[1]="root", user[2]

    ???????? 此函數(shù)有返回值,返回值為切片后的元素的個數(shù)

    ?

    示例:

    ?

    ????????#netstat?-tn?|?awk'/^tcp/{lens=split($5,client,":");ip[client[1]]++}END{for?(i?in?ip)print?i,ip[i]}'

    ???????

    ?

    length(string)

    ???????? 功能:返回給定字串的長度

    ?

    substr(string,start[,length])

    ???????? 功能:從string中取子串,從start為起始位置為取length長度的子串;

    ?

    ?


    轉載于:https://blog.51cto.com/2280627/1697863

    總結

    以上是生活随笔為你收集整理的sed与awk命令小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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