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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

gawk程序

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gawk程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 雖然sed編輯器是非常方便自動修改文本文件的工具,但其也有自身的限制。通常你需要一個用來處理文件中的數據的更高級工具,他能提供一個類編程環境來修改和重新組織文件中的數據,這正是gawk能夠做到的。

? ? 說明:在所有發行版中都沒有默認安裝gawk程序。如果你所用的linux發行版中沒有包含gawk,請參考第9章中的內容來安裝gawk包。

? ??gawk程序是unix中的原始程序的GNU版本。gawk程序讓流編輯邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,你可以做下面的事情:

定義變量來保存數據:

定義變量來保存數據;

使用算術和字符串操作符來處理數據;

使用結構化變成概念(比如if-then語句和循環)來為數據處理增加處理邏輯;

通過提取數據文件中的數據元素,將其重新排列或格式化,生成格式化報告。

? ?gawk程序的報告生成能力通常用來從大文本文件中提取數據元素,他將格式化成可讀的報告。其中最完美的例子時格式化日志文件。在日志文件中找出錯誤行會很難,gawk程序可以讓你從日志文件中過濾出需要的數據元素,然后你可以將其格式化,時的重要的數據更易于閱讀。

? ?1. gawk命令格式

? ? gawk程序的基本格式如下:

? ? gawk options program file?

? ?表19-2 顯示了gawk程序可用選項。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 表19-2 gawk選項

選項? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述

-F fs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 指定行中劃分數據字段的字段分隔符

-f file? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 從指定的文件中讀取程序

-v var=value? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?定義gawk程序中的一個變量及默認值

-mf? N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定要處理的數據文件中的最大字段數

-mr N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 指定數據文件中的最大數據行數

-w keyword? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定gawk的兼容模式或者警告等級

命令行選項提供了一個簡單的途徑來定制gawk程序的功能。我們會在探索gawk進一步了解這些選項。

? ?gawk的強大之處在于程序腳本。可以寫腳本來讀取文本行的數據,然后處理并顯示數據,創建任何類型的輸出報告。

2 從命令行讀取程序腳本

? ?gawk程序腳本用一對花括號來定義。你必須將腳本命令放到兩個花括號({})中。如果你錯誤地使用了圓括號來包含gawk腳本,就會得到類似下面的錯誤提示。

$ gawk '(print "Hello world!")'
gawk: cmd. line:1: (print "Hello world!")
gawk: cmd. line:1: ?^ syntax error
gawk: cmd. line:2: (print "Hello world!")
gawk: cmd. line:2: ? ? ? ? ? ? ? ? ? ? ? ^ unexpected newline or end of string

由于gawk命令行假定程序是單個文本字符串,你還必須將腳本放進單引號中。下面的例子時在命令行中指定了一個簡單的gawk程序腳本:

gawk '{print "Hello world!"}'

這個程序腳本定義了一個命令:print命令。這個命令名副其實:它會將文本打印到STDOUT。如果嘗試運行這個命令,你可能會有些失望,因為什么也不會發生。原因在于沒有任何在命令行指定的文件名,所以gawk程序會從STDIN接收數據。在運行這個程序時,它會一直等待從STDIN輸入的文本。

? ? 如果你輸入一行文本并按下回車鍵,gawk會對這行文本運行一遍程序腳本。跟sed編輯器一樣,gawk程序會針對數據流中的每行文本執行程序腳本。由于程序腳本被設為顯示一行固定的文本字符串,因此不管你在數據流中輸入什么文本,都會得到同樣的文本輸出。

gawk '{print "Hello World!"}'

This is a test
Hello world
hello
Hello world
This is a another test
Hello world

要終止這個gawk程序,你必須表名數據流結束了。bash shell提供了一個組合鍵來生成EOF(End-of-line)字符。 Ctrl+D組合鍵會在bash中產生一個EOF字符。這個組合鍵能夠終止該gawk程序并返回到命令行界面提示符下。

3 使用數據字段變量

gawk的主要特性之一是其處理文本文件中數據的能力。它會自動給一行的每個數據元素分配一個變量。默認情況下,gawk會將如下變量分配給他在文本行中發現的數據字段。

$0代表整個文本行

$1代表文本行中的第一個數據字段。

$2代表文本行中的第二個數據字段

$N代表文本行中的第N個數據字段

? ?在文本行中,沒個數據字段都是通過字段分隔符劃分的。gawk在讀取一行文本時,會用預定義的字段分隔符劃分沒個數據字段。gawk中默認吧的字段分隔符是任意的空白字符(例如空格或者制表符)

在下面例子中,gawk程序讀取文本文件,只顯示第一個數據字段的值。

cat data2.txt

gawk '{print $1}' data2.txt
One
Two
Three

該程序用$1字段變量來僅顯示每行文本的第1個數據字段。

如果你要讀取采用了其他字段分隔符的文件,可以用-F選項指定。

$gawk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
tcpdump
mysql
dockerroot
這個簡短的程序顯示了系統中密碼文件中的第一個數據字段。由于/ect/passwd文件用冒號來分割數據字段,因而如果要劃分每個數據元素,則必須在gawk選項中將冒號指定為字段分隔符。

4. 在程序腳本中使用多個命令

? ? 如果一種編程語言只能執行一條命令,那么它不會有太大可用性。gawk編程語言允許你將多條命令組合成一個正常的程序。要在命令行的程序腳本中使用多條命令,只要在命令之間放個分號即可。

echo "My name is Rich" ?| gawk '{$4="Chritine"; print $0}'
My name is Chritine
? ? ?第一條命令會給字段變量$4賦值。第二條命令會打印整個數據字段。注意,gawk程序在輸出中已經將原文本中的第四個數據字段替換成了新值。

? ?也可以用次提示符一行一行地輸入程序腳本命令。

?gawk '{
> $4="Chritine"
> print $0}'
My name is Rich
My name is Chritine
?

在你使用了表示起始的單引號后,bash shell 會使用次提示符來提示你輸入更多數據。你可以每次在每行加一條命令,直到輸入結尾的單引號。因為沒有在命令行中指定文件名,gawk程序會從STDIN中獲得數據。當運行這個程序結束的時候,它會等著讀取來自STDIN的文本,要退出程序,只需要按下CTRL+D組合鍵來表名數據結束。

5. 從文件中讀取程序

跟sed編輯器一樣,gawk編輯器允許將程序存儲到文件中,然后再在命令行中引用。

cat script2.gawk

{print $1 "'s home directory is " $6}
?

?gawk -F: -f script2.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
sync's home directory is /sbin
shutdown's home directory is /sbin

?

script2.gawk程序腳本會再次使用print命令打印/etc/passwd文件的主目錄數據字段(字段變量$6),以及userid數據字段(字段變量$1)。

可以在程序文件中指定多條命令。要這么做的話,只要一條命令放一行即可,不需要使用分號。

cat script3.gawk
{
text = "'s home directory is "
print $1 text $6
}
?

awk -F: -f script3.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
sync's home directory is /sbin
shutdown's home directory is /sbin
halt's home directory is /sbin
mail's home directory is /var/spool/mail
? ?script3.gawk程序腳本定義了一個變量來保存print命令中用到的文本字符串。注意,gawk程序在引用變量值并未像shell腳本一樣使用美元符。

6. 在處理數據前運行腳本

? gawk還允許指定程序腳本何時運行。默認情況下,gawk會從輸入中讀取一行文本,然后針對改行的數據執行程序腳本。有時可能需要在處理數據前運行腳本,比如為報告創建標題。BEGIN關鍵字就是用來做這個的。它會強制gawk在讀取數據前執行BEGIN關鍵字后制定的程序腳本。

?gawk 'BEGIN {print "Hello World"}'
Hello World

這次print命令會在讀取數據前顯示腳本。但它顯示了文本后,它會快速推出,不等待任何數據。如果想使用正常的程序腳本中處理數據,必須用另一個腳本區域來定義程序。


?

?

?
?

?

總結

以上是生活随笔為你收集整理的gawk程序的全部內容,希望文章能夠幫你解決所遇到的問題。

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