车载以太网之权威指南_awk权威指南之 终结篇!
前段時(shí)間看了一下awk的使用選項(xiàng),字段變量,標(biāo)準(zhǔn)變量,操作運(yùn)算符,正則表達(dá)式,數(shù)組和控制流,并且也附帶著一些相關(guān)的案例,總的來說,在深入了解和使用AWK之后,還是帶來了很多的便利,在處理文本的文件的時(shí)候提供了更多的思路和便捷,比如按需自定義打印文本顯示格式,進(jìn)行一些簡(jiǎn)單的數(shù)據(jù)處理,同時(shí)awk還有和shell,python,go一些編程語(yǔ)言類似的循環(huán),條件,邏輯處理,以及一些內(nèi)置的函數(shù)更方便的幫助在命令行完成一些文本處理工作。今天完成了awk剩余的一些知識(shí)點(diǎn)學(xué)習(xí)。
awk中的循環(huán)
FOR
格式: for(initialisation;condition;increment/decrement)action
for 語(yǔ)句首先執(zhí)行初始化動(dòng)作( initialisation ),然后再檢查條件( condition )。如果條件為真,則執(zhí)行動(dòng)作( actio n ),然后執(zhí)行遞增( increment )或者遞減( decrement )操作。只要條件為真循環(huán)就會(huì)一直執(zhí)行。每次循環(huán)結(jié)束 都會(huì)進(jìn)條件檢查,若條件為假則結(jié)束 循環(huán)
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }' # 注意這里是++i,不是i++
while
While 循環(huán)會(huì)一直執(zhí)行動(dòng)作直到邏輯條件為假為止,AWK 首先檢查條件是否為真,若條件為真則執(zhí)行動(dòng)作。此過程一直重復(fù)直到條件為假時(shí),則停止
awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }' # 等同上面的for語(yǔ)句
DO-WHILE
Do-While 循環(huán)與 While 循環(huán)相似,但是 Do-While 的條件測(cè)試放到了循環(huán)的尾部,在 do-while 循環(huán)中,無(wú)論條件是真是假,循環(huán)語(yǔ)句至少執(zhí)行一次,執(zhí)行后檢查條件真假,使用格式如下:
do action
while (condition)
看一個(gè)案例:
awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
break
break 用以結(jié)束循環(huán)過程
awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) break; else print "Sum =", sum }
}'
continue
Continue 語(yǔ)句用于在循環(huán)體內(nèi)部結(jié)束本次循環(huán),從而直接進(jìn)入下一次循環(huán)迭代。當(dāng)我們希望跳過循環(huán)中某處數(shù)據(jù) 處理時(shí)就會(huì)用到 Continue
awk 'BEGIN {for (i = 1; i <= 20; ++i) {if (i % 2 == 0) print i ; else continue} }'
EXIT
Exit 用于結(jié)束腳本程序的執(zhí)行。該函數(shù)接受一個(gè)整數(shù)作為參數(shù)表示 AWK 進(jìn)程結(jié)束狀態(tài)。如果沒有提供該參數(shù),其默認(rèn)狀態(tài)為 0
awk 'BEGIN { ? 10022 12:34:02 ?
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) exit(10); else print "Sum =", sum }
}'
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45
root # echo ? #查看期退出的狀態(tài)碼為指定的10
10
內(nèi)置函數(shù)
AWK 為程序開發(fā)者提供了豐富的內(nèi)置函數(shù)。包括算術(shù)函數(shù)、字符串操作函數(shù)、時(shí)間操 作相關(guān)的函數(shù)、位操作函數(shù)以及其它各種各樣的函數(shù)
算術(shù)函數(shù)
exp(expr) 返回自然數(shù)e的expr次冪
awk 'BEGIN{printf "The exponential value of 5 is %f.\n",exp(5)}'
int(expr) 返回?cái)?shù)值expr的整數(shù)部分
awk 'BEGIN {printf "34.1212的整數(shù)部分是: %d",int(34.1212)}'
awk 'BEGIN {param=4.232;result=int(param);printf "整數(shù)部分是:%d",result}'
log(expr) 返回自然對(duì)數(shù)
rand() 函數(shù)返回一個(gè)大于等于 0 小于 1 的隨機(jī)數(shù) N(0<= N < 1)
sin(expr) 正弦函數(shù)返回角度 expr 的正弦值,角度以弧度為單位
sqrt(expr) 計(jì)算 expr 的平方根
srand([expr]) 使用種子值生成隨機(jī)數(shù),數(shù)值 expr 作為隨機(jī)數(shù)生成器的種子值。如果沒有指定 expr 的值則函數(shù)默認(rèn)使 用當(dāng)前系統(tǒng)時(shí)間作為種子值
awk 'BEGIN { param = 10
printf "srand() = %d\n", srand()
printf "srand(%d) = %d\n", param, srand(param) }'
字符串函數(shù)
asort(arr,[, d [,how] ]) 函數(shù)使用 GAWK 值比較的一般規(guī)則排序 arr 中的內(nèi)容,然后用以 1 開始的有序整數(shù)替換排序內(nèi)容的索引
注意mac上的awk 20070501版本沒有該函數(shù)
awk 'BEGIN {
arr[0] = "Three"
arr[1] = "One"
arr[2] = "Two"
print "Array elements before sorting:";
for (i in arr) {
print arr[i]
}
asort(arr)
print "Array elements after sorting:"
for (i in arr) {
print arr[i]
}
}'
asorti(arr,[, d [,how] ]) asorti 函數(shù)的行為與 asort 函數(shù)的行為很相似,二者的差別在于 aosrt 對(duì)數(shù)組的值排序,而 asorti 對(duì)數(shù)組的索引 排序
gsub(regx,sub, string) gsub 是全局替換( global substitution )的縮寫。它將出現(xiàn)的子串(sub)替換為 regx。第三個(gè)參數(shù) string 是可 選的,默認(rèn)值為 $0,表示在整個(gè)輸入記錄中搜索子串
awk '{gsub("172.16.132.148","0.0.0.0");print }' docker-compose.yml # 替換docker-compose.yml中的172.16.132.148為0.0.0.0
index(str,sub) index 函數(shù)用于檢測(cè)字符串 sub 是否是 str 的子串。如果 sub 是 str 的子串,則返回子串 sub 在字符串 str 的開 始位置;若不是其子串,則返回 0。str 的字符位置索引從 1 開始計(jì)數(shù)
awk 'BEGIN {
str = "One Two Three"
subs = "Two"
ret = index(str, subs)
printf "Substring \"%s\" found at %d location.\n", subs, ret }'
length(str) 返回字符串的長(zhǎng)度
match(str, regex) match 返回正則表達(dá)式在字符串 str 中第一個(gè)最長(zhǎng)匹配的位置。如果匹配失敗則返回0。
split(str, arr,regex) split 函數(shù)使用正則表達(dá)式 regex 分割字符串 str。分割后的所有結(jié)果存儲(chǔ)在數(shù)組 arr 中。如果沒有指定 regex 則 使用 FS 切分。
awk 'BEGIN {
str = "One,Two,Three,Four"
split(str, arr, ",")
print "Array contains following values"
for (i in arr) { print arr[i]
} }'
sprintf(format,expr-list) sprintf 函數(shù)按指定的格式( format )將參數(shù)列表 expr-list 構(gòu)造成字符串然后返回。
awk 'BEGIN {
str = sprintf("%s", "Hello, World !!!")
print str }'
strtonum(str) strtonum 將字符串 str 轉(zhuǎn)換為數(shù)值。如果字符串以 0 開始,則將其當(dāng)作十進(jìn)制數(shù);如果字符串以 0x 或 0X 開 始,則將其當(dāng)作十六進(jìn)制數(shù);否則,將其當(dāng)作浮點(diǎn)數(shù)。
root@dev-node1:~# awk 'BEGIN {
> print "Decimal num = " strtonum("123")
> print "Octal num = " strtonum("0123")
> print "Hexadecimal num = " strtonum("0x123")
> }'
Decimal num = 123
Octal num = 83
Hexadecimal num = 291
sub(regex,sub,string)sub 函數(shù)執(zhí)行一次子串替換。它將第一次出現(xiàn)的子串用 regex 替換。第三個(gè)參數(shù)是可選的,默認(rèn)為 $0。
substr(str, start, l) substr 函數(shù)返回 str 字符串中從第 start 個(gè)字符開始長(zhǎng)度為 l 的子串。如果沒有指定 l 的值,返回 str 從第 start 個(gè)字符開始的后綴子串
root@dev-node1:~# awk 'BEGIN {
str = "Hello, World !!!"; subs = substr(str, 1, 5);
print "Substring = " subs }'
Substring = Hello
root@dev-node1:~# awk 'BEGIN {
str = "Hello, World !!!"; subs = substr(str, 1);
print "Substring = " subs }'
Substring = Hello, World !!!
tolower(str) 此函數(shù)將字符串 str 中所有大寫字母轉(zhuǎn)換為小寫字母然后返回。注意,字符串 str 本身并不被改變。
toupper(str)此函數(shù)將字符串 str 中所有小寫字母轉(zhuǎn)換為大寫字母然后返回。注意,字符串 str 本身不被改變。
時(shí)間函數(shù)
systime 此函數(shù)返回從 Epoch 以來到當(dāng)前時(shí)間的秒數(shù)
mktime(dataspec) 此函數(shù)將字符串 dataspec 轉(zhuǎn)換為與 systime 返回值相似的時(shí)間戳。dataspec 字符串的格式為 YYYY MM D D HH MM SS。
strftime([format [, timestamp[, utc-flag]]]) 函數(shù)根據(jù) format 指定的格式將時(shí)間戳 timestamp 格式化
位操作函數(shù)
and 執(zhí)行位與操作
compl 按位求補(bǔ)
lshift 左移位操作
awk 'BEGIN { num1 = 10
printf "lshift(%d) by 1 = %d\n", num1, lshift(num1, 1) }'
rshift 向右移位操作
or 按位或操作
xor 按位異或操作
其他函數(shù)
delete 被用于從數(shù)組中刪除元素
exit 該函數(shù)終止腳本執(zhí)行。它可以接受可選的參數(shù) expr 傳遞 AWK 返回狀態(tài)
flush 函數(shù)用于刷新打開文件或管道的緩沖區(qū)
getline 函數(shù)讀入下一行
next 停止處理當(dāng)前記錄,并且進(jìn)入到下一條記錄的處理過程
awk '{if ($0 ~/Shyam/) next; print $0}' marks.txt
nextfile 停止處理當(dāng)前文件,從下一個(gè)文件第一個(gè)記錄開始處理
awk '{ if ($0 ~ /file1:str2/) nextfile; print $0 }' file1.txt file2.txt
return 用于從用戶自定義的函數(shù)中返回值。請(qǐng)注意,如果沒有指定返回值,那么的返回值是未定義的
cat << EOF >> functions.awk
function addition(num1, num2) {
result = num1 + num2
return result }
BEGIN {
res = addition(10, 20) print "10 + 20 = " res
}
EOF
system 函數(shù)可以執(zhí)行特定的命令然后返回其退出狀態(tài)。返回值為 0 表示命令執(zhí)行成功;非 0 表示命令執(zhí)行失 敗
awk 'BEGIN { ret = system("date"); print "Return value = " ret }'
輸出重定向
重定向操作符
awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
追加操作符
awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
管道 除了使用文件在程序之間傳遞數(shù)據(jù)之外,AWK 還提供使用管道將一個(gè)程序的輸出傳遞給另一個(gè)程序。這種重定 向方式會(huì)打開一個(gè)管道,將對(duì)象的值通過管道傳遞給管道另一端的進(jìn)程,然后管道另一端的進(jìn)程執(zhí)行命令
awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
雙向通信通道 AWK 允許使用 |& 與一個(gè)外部進(jìn)程通信,并且可以雙向通信。下面的例子中,我們?nèi)匀皇褂?tr 命令將字母轉(zhuǎn)換為 大寫字母
BEGIN {
cmd = "tr [a-z] [A-Z]"
print "hello, world !!!" |& cmd close(cmd, "to")
cmd |& getline out
print out;
close(cmd);
}
第一條語(yǔ)句 cmd = "tr [a-z] [A-Z]" 在AWK 中建立了一個(gè)雙向的通信通道。
第二條語(yǔ)句 print 為 tr 命令提供輸入。&| 表示雙向通信。
第三條語(yǔ)句 close(cmd, "to") 執(zhí)行后關(guān)閉 to 進(jìn)程。
第四條語(yǔ)句 cmd |& getline out 使用 getline 函數(shù)將輸出存儲(chǔ)到 out 變量中。
接下來的輸出語(yǔ)句打印輸出的內(nèi)容,最后 close 函數(shù)關(guān)閉 cmd
總結(jié)
以上是生活随笔為你收集整理的车载以太网之权威指南_awk权威指南之 终结篇!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 集群实践_MySQL Clu
- 下一篇: PHP与MySQL连接菜鸟教程_PHP