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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux高级文本处理之gawk语法和基础命令(一)

發(fā)布時間:2025/7/14 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux高级文本处理之gawk语法和基础命令(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、引言

Awk 是一個維護和處理文本數(shù)據(jù)文件的強大語言。在文本數(shù)據(jù)有一定的格式,即每行數(shù)據(jù)包 含多個以分界符分隔的字段時,顯得尤其有用。 即便是輸入文件沒有一定的格式,你仍然可 以使用 awk 進行基本的處理。 Awk 當然也可以沒有輸入文件,那不是必須的。 簡言之, AWK 是一種能處理從瑣碎的小事到日常例行公事的強大語言。

二、awk語法

1.基礎語法:

awk?[-F??field-separator]?'/pattern/?{action}'?input-file (或者) awk?[-F??field-separator]?'{action}'?input-file

上面語法中:

  • -F 為字段分界符。如果不指定,默認會使用空格作為分界符。

  • /pattern/和{action}需要用單引號引起來。

  • /pattern/是可選的。如果不指定, awk 將處理輸入文件中的所有記錄。如果指定一個模式, awk 則只處理匹配指定的模式的記錄。

  • {action} 為 awk 命令,可以是單個命令,也可以多個命令。整個 action(包括里面的所有命令)都必須放在{ 和 }之間。

  • Input-file 即為要處理的文件

實例1:打印/etc/passwd文件中mail用戶所在行的用戶名mail

[root@localhost?~]#?grep?'^mail'?/etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin [root@localhost?~]#?awk?-F:?'/mail/{print?$1}'?/etc/passwd?#-F?":"也是正確的 mail

2.awk腳本:

當需要執(zhí)行很多 awk 命令時, 可以把/pattern/{action}這一部分放到單獨的文件中,然后調 用它:

awk?–Fs?–f?myscript.awk?input-file??#[-F??field-separator]簡寫?-FS

也可以在這個文件中設置字段分界符(后面詳述),然后調用:

awk?–f?myscript.awk?input-file

二、Awk 程序結構(BEGIN,body,END)區(qū)域

1.BEGIN 區(qū)域

Begin 區(qū)域的語法:

BEGIN?{?awk-commands?}

說明:BEGIN 區(qū)域的命令只最開始、在 awk 執(zhí)行 body 區(qū)域命令之前執(zhí)行一次。

  • BEGIN 區(qū)域很適合用來打印報文頭部信息,以及用來初始化變量。

  • BEGIN 區(qū)域可以有一個或多個 awk 命令

  • 關鍵字 BEGIN 必須要用大寫

  • BEGIN 區(qū)域是可選的

2.body 區(qū)域

body 區(qū)域的語法:

/pattern/?{action}
  • body 區(qū)域的命令每次從輸入文件讀取一行就會執(zhí)行一次

  • 如果輸入文件有 10 行,那 body 區(qū)域的命令就會執(zhí)行 10 次(每行執(zhí)行一次)

  • Body 區(qū)域沒有用任何關鍵字表示,只有用正則模式和命令。

3.END block

END 區(qū)域的語法:

  • END { awk-commands }

  • END 區(qū)域在 awk 執(zhí)行完所有操作后執(zhí)行,并且只執(zhí)行一次。

  • END 區(qū)域很適合打印報文結尾信息,以及做一些清理動作

  • END 區(qū)域可以有一個或多個 awk 命令

  • 關鍵字 END 必須要用大寫

  • END 區(qū)域是可選的

awk執(zhí)行流程圖:

實例1:

[root@localhost?~]#?awk?' >?BEGIN{FS=":";print?"----header----"}???#打印內容字符串要用雙引號,單引號有語法錯誤 >?/mail/{print?$1} >?END{print?"----footer----"} >?'?/etc/passwd----header---- mail ----footer----

提示:如果命令很長,即可以放到單行執(zhí)行,也可以用\折成多行執(zhí)行。

實例2:通過awk腳本執(zhí)行實例1中的命令

[root@localhost?~]#?cat?myscript.awk? BEGIN{ FS=":" print?"----header----" }/mail/{ print?$1 }END{ print?"----footer----" } [root@localhost?~]#?awk?-f?myscript.awk?/etc/passwd ----header---- mail ----footer----

說明:awk 腳本中,注釋以#開頭。

只使用 BEGIN 區(qū)域在 awk 中是符合語法的。在沒有使用 body 區(qū)域時,不需要指定輸入文件, 因為 body 區(qū)域只在輸入文件上執(zhí)行。 所以在執(zhí)行和輸入文件無關的工作時,可以只使用 BEGIN 區(qū)域。

實例3:只使用BEGIN無輸入文件

[root@localhost?~]#?awk?'BEGIN{print?"HELLO?WORLD"}' HELLO?WORLD

4.多個輸入文件:

awk 指定多個輸入文件。如果指定了兩個文件,那么 body 區(qū)域會首先在第一 個文件的所有行上執(zhí)行,然后在第二個文件的所有行上執(zhí)行。

實例4:多文件處理

[root@localhost?~]#?awk?-F:?' >?BEGIN{print?"----header----"} >?/mail/{print?$1} >?END{print?"----footer----"} >?'?/etc/passwd?/etc/group ----header---- mail mail ----footer----

注意:即是指定了多個文件, BEGIN 和 END 區(qū)域,仍然只會執(zhí)行一次。

三、打印命令

默認情況下,awk 的打印命令 print(不帶任何參數(shù))會打印整行數(shù)據(jù)。下面的例子等價于”cat employee.txt”命令。

實例1:不帶參數(shù)

[root@localhost?~]#?awk?'{print}'?emp 101,John?Doe,CEO 102,Jason?Smith,IT?Manager 103,Raj?Reddy,Sysadmin 104,Anand?Ram,Developer 105,Jane?Miller,Sales?Manager

實例2:也可以通過傳遞變量”$字段序號”作為 print 的參數(shù)來指定要打印的字段。

[root@localhost?~]#?awk?'{print?$2}'?./emp??#默認以空格為分隔符 Doe,CEO Smith,IT Reddy,Sysadmin Ram,Developer Miller,Sales

實例3:輸出雇員姓名與職位

[root@localhost?~]#?cat?emp 101,John?Doe,CEO 102,Jason?Smith,IT?Manager 103,Raj?Reddy,Sysadmin 104,Anand?Ram,Developer 105,Jane?Miller,Sales?Manager[root@localhost?~]#?awk?' >BEGIN{FS=",";print?"-------\nNAME??Title\n--------\n"} >{print?$2,"\t",$3}??#打印多變量,之間用逗號或者空格分隔 >END{print?"----------------"}'?emp ------- NAME??Title --------John?Doe?????????CEO Jason?Smith??????IT?Manager Raj?Reddy????????Sysadmin Anand?Ram????????Developer Jane?Miller??????Sales?Manager ----------------

說明:請注意, $0 代表整條記錄。 下面兩個命令是等價的,都打印 employee.txt 的所有行:

awk?'{print}'?emp awk?'{print?$0}'?emp

四、模式匹配

只在匹配特殊模式的行數(shù)執(zhí)行 awk 命令。

實例1:只處理匹配行

[root@localhost?~]#?awk?-F,?'/Manager/{print?$2,$3}'?emp Jason?Smith?IT?Manager Jane?Miller?Sales?Manager

實例2:只打印雇員 id 為 102 的雇員的信息

[root@localhost?~]#?awk?-F,?'/^102/{print?"Emp?is?102?is",$2}'?emp? Emp?is?102?is?Jason?Smith


轉載于:https://blog.51cto.com/yolynn/1890927

總結

以上是生活随笔為你收集整理的Linux高级文本处理之gawk语法和基础命令(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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