婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux下的命令行編程工具Awk的入門簡介

Linux下的命令行編程工具Awk的入門簡介

熱門標簽:上海電銷卡外呼系統供應商 優邁系統外呼顯示亂層 布谷電銷機器人價格 怎么查看地圖標注的地點 營銷智能外呼系統口碑推薦 義烏市400電話辦理 岑溪電銷機器人 電銷機器人錄音用什么軟件 大連企業電銷機器人線路

什么是Awk

Awk是一種小巧的編程語言及命令行工具。(其名稱得自于它的創始人Alfred Aho、Peter Weinberger 和 Brian Kernighan姓氏的首個字母)。它非常適合服務器上的日志處理,主要是因為Awk可以對文件進行操作,通常以可讀文本構建行。
我說它適用于服務器是因為日志文件,轉儲文件(dump files),或者任意文本格式的服務器終止轉儲到磁盤都會變得很大,并且在每個服務器你都會擁有大量的這類文件。如果你經歷過這樣的情境——在沒有像Splunk或者其他等價的工具情況下不得不在50個不同的服務器里分析幾G的文件,你會覺得去獲取和下載所有的這些文件并分析他們是一件很糟糕的事。

我親身經歷過這種情境。當一些Erlang節點將要死掉并留下一個700MB到4GB的崩潰轉儲文件(crash dump)時,或者當我需要在一個小的個人服務器(叫做VPS)上快速瀏覽日志,查找一個常規模式時。

在任何情況下,Awk都不僅僅只是用來查找數據的(否則,grep或者ack已經足夠使用了)——它同樣使你能夠處理數據并轉換數據。
代碼結構

Awk腳本的代碼結構很簡單,就是一系列的模式(pattern)和行為(action):

   

復制代碼
代碼如下:
# comment
Pattern1 { ACTIONS; }
# comment
Pattern2 { ACTIONS; }
# comment
Pattern3 { ACTIONS; }
# comment
Pattern4 { ACTIONS; }

掃描文檔的每一行時都必須與每一個模式進行匹配比較,而且一次只匹配一個模式。那么,如果我給出一個包含以下內容的文件:

   

復制代碼
代碼如下:
this is line 1
this is line 2

this is line 1 這行就會與Pattern1進行匹配。如果匹配成功,就會執行ACTIONS。然后this is line 1 會和Pattern2進行匹配。如果匹配失敗,它就會跳到Pattern3進行匹配,以此類推。

一旦所有的模式都匹配過了,this is line 2 就會以同樣的步驟進行匹配。其他的行也一樣,直到讀取完整個文件。

簡而言之,這就是Awk的運行模式
數據類型

Awk僅有兩個主要的數據類型:字符串和數字。即便如此,Awk的字符串和數字還可以相互轉換。字符串能夠被解釋為數字并把它的值轉換為數字值。如果字符串不包含數字,它就被轉換為0.

它們都可以在你代碼里的ACTIONS部分使用 = 操作符給變量賦值。我們可以在任意時刻、任意地方聲明和使用變量,也可以使用未初始化的變量,此時他們的默認值是空字符串:“”。

最后,Awk有數組類型,并且它們是動態的一維關聯數組。它們的語法是這樣的:var[key] = value 。Awk可以模擬多維數組,但無論怎樣,這是一個大的技巧(big hack)。
模式

可以使用的模式分為三大類:正則表達式、布爾表達式和特殊模式。

正則表達式和布爾表達式

你使用的Awk正則表達式比較輕量。它們不是Awk下的PCRE(但是gawk可以支持該庫——這依賴于具體的實現!請使用 awk

–version查看),然而,對于大部分的使用需求已經足夠了:

   

復制代碼
代碼如下:
/admin/ { ... } # any line that contains 'admin'
/^admin/ { ... } # lines that begin with 'admin'
/admin$/ { ... } # lines that end with 'admin'
/^[0-9.]+ / { ... } # lines beginning with series of numbers and periods
/(POST|PUT|DELETE)/ # lines that contain specific HTTP verbs

注意,模式不能捕獲特定的組(groups)使它們在代碼的ACTIONS部分執行。模式是專門匹配內容的。

布爾表達式與PHP或者Javascript中的布爾表達式類似。特別的是,在awk中可以使用(“與”)、||(“或”)、!(“非”)操作符。你幾乎可以在所有類C語言中找到它們的蹤跡。它們可以對常規數據進行操作。

與PHP和Javascript更相似的特性是比較操作符,==,它會進行模糊匹配(fuzzy matching)。因此“23”字符串等于23,”23″ == 23 表達式返回true。!= 操作符同樣在awk里使用,并且別忘了其他常見的操作符:>,,>=,和=。

你同樣可以混合使用它們:布爾表達式可以和常規表達式一起使用。 /admin/ || debug == true 這種用法是合法的,并且在遇到包含“admin”單詞的行或者debug變量等于true時該表達式就會匹配成功。

注意,如果你有一個特定的字符串或者變量要與正則表達式進行匹配,~ 和!~ 就是你想要的操作符。 這樣使用它們:string ~ /regex/ 和 string !~ /regex/。

同樣要注意的是,所有的模式都只是可選的。一個包含以下內容的Awk腳本:


復制代碼
代碼如下:
{ ACTIONS }

對輸入的每一行都將會簡單地執行ACTIONS。
特殊的模式

在Awk里有一些特殊的模式,但不是很多。

第一個是BEGIN,它僅在所有的行都輸入到文件之前進行匹配。這是你可以初始化你的腳本變量和所有種類的狀態的主要地方。

另外一個就是END。就像你可能已經猜到的,它會在所有的輸入都被處理完后進行匹配。這使你可以在退出前進行清除工作和一些最后的輸出。

最后一類模式,要把它進行歸類有點困難。它處于變量和特殊值之間,我們通常稱它們為域(Field)。而且名副其實。

使用直觀的例子能更好地解釋域:

   

復制代碼
代碼如下:
# According to the following line
#
# $1 $2 $3
# 00:34:23 GET /foo/bar.html
# _____________ _____________/
# $0

# Hack attempt?
/admin.html$/ $2 == "DELETE" {
print "Hacker Alert!";
}

域(默認地)由空格分隔。$0 域代表了一整行的字符串。 $1 域是第一塊字符串(在任何空格之前), $2 域是后一塊,以此類推。

一個有趣的事實(并且是在大多是情況下我們要避免的事情),你可以通過給相應的域賦值來修改相應的行。例如,如果你在一個塊里執行 $0 = “HAHA THE LINE IS GONE”,那么現在下一個模式將會對修改后的行進行操作而不是操作原始的行。其他的域變量都類似。
行為

這里有一堆可用的行為(possible actions),但是最常用和最有用的行為(以我的經驗來說)是:

   

復制代碼
代碼如下:
{ print $0; } # prints $0. In this case, equivalent to 'print' alone
{ exit; } # ends the program
{ next; } # skips to the next line of input
{ a=$1; b=$0 } # variable assignment
{ c[$1] = $2 } # variable assignment (array)

{ if (BOOLEAN) { ACTION }
else if (BOOLEAN) { ACTION }
else { ACTION }
}
{ for (i=1; ix; i++) { ACTION } }
{ for (item in c) { ACTION } }

這些內容將會成為你的Awk工具箱的主要工具,在你處理日志之類的文件時你可以隨意地使用它們。

Awk里的變量都是全局變量。無論你在給定的塊里定義什么變量,它對其他的塊都是可見的,甚至是對每一行都是可見的。這嚴重限制了你的Awk腳本大小,不然他們會造成不可維護的可怕結果。請編寫盡可能小的腳本。
函數

可以使用下面的語法來調用函數:

   

復制代碼
代碼如下:
{ somecall($2) }

這里有一些有限的內置函數可以使用,所以我可以給出這些函數的通用文檔(regular documentation)。

用戶定義的函數同樣很簡單:

   

復制代碼
代碼如下:
# function arguments are call-by-value
function name(parameter-list) {
ACTIONS; # same actions as usual
}

# return is a valid keyword
function add1(val) {
return val+1;
}

特殊變量

除了常規變量(全局的,可以在任意地方使用),這里還有一系列特殊的變量,它們的的作用有點像配置條目(configuration entries):

   

復制代碼
代碼如下:
BEGIN { # Can be modified by the user
FS = ","; # Field Separator
RS = "n"; # Record Separator (lines)
OFS = " "; # Output Field Separator
ORS = "n"; # Output Record Separator (lines)
}
{ # Can't be modified by the user
NF # Number of Fields in the current Record (line)
NR # Number of Records seen so far
ARGV / ARGC # Script Arguments
}

我把可修改的變量放在BEGIN里,因為我更喜歡在那重寫它們。但是這些變量的重寫可以放在腳本的任意地方然后在后面的行里生效。
示例

以上的就是Awk語言的核心內容。我這里沒有大量的例子,因為我趨向于使用Awk來完成快速的一次性任務。

不過我依然有一些隨身攜帶的腳本文件,用來處理一些事情和測試。我最喜歡的一個腳本是用來處理Erlang的崩潰轉儲文件,形如下面的:

   

復制代碼
代碼如下:
=erl_crash_dump:0.3
Tue Nov 18 02:52:44 2014
Slogan: init terminating in do_boot ()
System version: Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Compiled: Fri Sep 19 03:23:19 2014
Taints:
Atoms: 12167
=memory
total: 19012936
processes: 4327912
processes_used: 4319928
system: 14685024
atom: 339441
atom_used: 331087
binary: 1367680
code: 8384804
ets: 382552
=hash_table:atom_tab
size: 9643
used: 6949
...
=allocator:instr
option m: false
option s: false
option t: false
=proc:0.0.0>
State: Running
Name: init
Spawned as: otp_ring0:start/2
Run queue: 0
Spawned by: []
Started: Tue Nov 18 02:52:35 2014
Message queue length: 0
Number of heap fragments: 0
Heap fragment data: 0
Link list: [0.3.0>, 0.7.0>, 0.6.0>]
Reductions: 29265
Stack+heap: 1598
OldHeap: 610
Heap unused: 656
OldHeap unused: 468
Memory: 18584
Program counter: 0x00007f42f9566200 (init:boot_loop/2 + 64)
CP: 0x0000000000000000 (invalid)
=proc:0.3.0>
State: Waiting
...
=port:#Port0.0>
Slot: 0
Connected: 0.3.0>
Links: 0.3.0>
Port controls linked-in driver: efile
=port:#Port0.14>
Slot: 112
Connected: 0.3.0>
...

產生下面的結果:

   

復制代碼
代碼如下:
$ awk -f queue_fun.awk $PATH_TO_DUMP
MESSAGE QUEUE LENGTH: CURRENT FUNCTION
======================================
10641: io:wait_io_mon_reply/2
12646: io:wait_io_mon_reply/2
32991: io:wait_io_mon_reply/2
2183837: io:wait_io_mon_reply/2
730790: io:wait_io_mon_reply/2
80194: io:wait_io_mon_reply/2
...

這是在Erlang進程里運行的函數列表,它們導致了mailboxe變得很龐大。腳本在這:

   

復制代碼
代碼如下:
# Parse Erlang Crash Dumps and correlate mailbox size to the currently running
# function.
#
# Once in the procs section of the dump, all processes are displayed with
# =proc:0.M.N> followed by a list of their attributes, which include the
# message queue length and the program counter (what code is currently
# executing).
#
# Run as:
#
# $ awk -v threshold=$THRESHOLD -f queue_fun.awk $CRASHDUMP
#
# Where $THRESHOLD is the smallest mailbox you want inspects. Default value
# is 1000.
BEGIN {
if (threshold == "") {
threshold = 1000 # default mailbox size
}
procs = 0 # are we in the =procs entries?
print "MESSAGE QUEUE LENGTH: CURRENT FUNCTION"
print "======================================"
}

# Only bother with the =proc: entries. Anything else is useless.
procs == 0 /^=proc/ { procs = 1 } # entering the =procs entries
procs == 1 /^=/ !/^=proc/ { exit 0 } # we're done

# Message queue length: 1210
# 1 2 3 4
/^Message queue length: / $4 >= threshold { flag=1; ct=$4 }
/^Message queue length: / $4 threshold { flag=0 }

# Program counter: 0x00007f5fb8cb2238 (io:wait_io_mon_reply/2 + 56)
# 1 2 3 4 5 6
flag == 1 /^Program counter: / { print ct ":", substr($4,2) }

你跟上思路沒?如果跟上了,你已經了解了Awk。恭喜!

標簽:遼寧 六安 大興安嶺 青島 大慶 周口 樂山 大理

巨人網絡通訊聲明:本文標題《Linux下的命令行編程工具Awk的入門簡介》,本文關鍵詞  Linux,下,的,命令行,編程工具,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux下的命令行編程工具Awk的入門簡介》相關的同類信息!
  • 本頁收集關于Linux下的命令行編程工具Awk的入門簡介的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美三级午夜理伦三级中视频| 欧洲精品一区二区| 久久精品水蜜桃av综合天堂| 精品影视av免费| 亚洲国产高清不卡| 色哟哟国产精品免费观看| 亚洲国产精品人人做人人爽| 91麻豆精品国产91久久久| 久久久国产精华| 色婷婷综合久久久久中文一区二区| 一区二区三区日韩在线观看| 欧美精选在线播放| 国产老女人精品毛片久久| 日韩三级免费观看| av成人免费在线| 一区二区三区影院| 91精品91久久久中77777| 蜜臀av一区二区在线免费观看 | 亚洲一二三四在线观看| 色婷婷国产精品久久包臀| 日韩精品一级二级| 国产欧美一区视频| 欧美日韩一区二区三区视频| 蜜臀av一区二区在线观看| 国产精品久久久久久久裸模| 欧美日韩aaaaaa| 国产91对白在线观看九色| 一区二区三区四区在线播放 | 97久久精品人人澡人人爽| 性做久久久久久久久| 国产日韩三级在线| 欧美老人xxxx18| 不卡电影一区二区三区| 日韩高清一区在线| 中文字幕字幕中文在线中不卡视频| 91精品国产色综合久久不卡电影| 成人免费高清视频| 亚洲午夜精品一区二区三区他趣| 久久影院午夜论| 欧美日韩高清一区| av不卡一区二区三区| 一片黄亚洲嫩模| 亚洲国产成人午夜在线一区| 欧美丰满少妇xxxbbb| 床上的激情91.| 五月婷婷欧美视频| 亚洲人成网站在线| 日韩欧美二区三区| 在线一区二区视频| 狠狠色丁香婷婷综合久久片| 亚洲影院理伦片| 中文成人综合网| 精品国产人成亚洲区| 91福利国产成人精品照片| 国产精品一级片| 久久精品国产亚洲aⅴ| 精品乱码亚洲一区二区不卡| 91成人看片片| 波多野洁衣一区| 蜜桃av噜噜一区二区三区小说| 国产高清在线观看免费不卡| 久久久久高清精品| 欧美男男青年gay1069videost| 91免费看视频| 成人免费av资源| 免费欧美日韩国产三级电影| 亚洲精品国产无天堂网2021| 亚洲精品一区二区三区四区高清 | 成人精品视频一区二区三区尤物| 免费久久精品视频| 亚洲一区在线视频| 1000精品久久久久久久久| 国产欧美日韩在线视频| 欧美va亚洲va国产综合| 亚洲精品福利视频网站| 欧美日韩aaa| 成人av网址在线| 国产亚洲精品久| 大白屁股一区二区视频| 欧美色图免费看| 精品亚洲成a人在线观看 | 国产一区二区三区| 秋霞午夜av一区二区三区| 午夜在线成人av| 欧美国产激情一区二区三区蜜月 | 99久久精品国产网站| 久久精品国产在热久久| 亚洲第一精品在线| 一区二区三区在线视频观看 | 久久精品99国产精品| 亚洲成人动漫在线观看| 一区二区免费看| 中文字幕一区二| 久久国产综合精品| 中文字幕一区二区5566日韩| 国产亚洲欧美激情| 久久综合色8888| 久久人人超碰精品| 欧美成人艳星乳罩| 日韩欧美一级二级三级| 日韩一区二区三区四区| 欧美一级专区免费大片| 555夜色666亚洲国产免| 欧美精品自拍偷拍| 日韩欧美综合一区| 精品日产卡一卡二卡麻豆| 精品理论电影在线| 久久影视一区二区| www成人在线观看| 久久综合五月天婷婷伊人| 欧美理论电影在线| 欧美人成免费网站| 欧美另类久久久品| 777奇米四色成人影色区| 欧美一区二区三区公司| 日韩精品在线一区二区| 久久综合九色综合97婷婷女人 | 欧美午夜寂寞影院| 欧美日韩一区二区三区在线| 欧美亚一区二区| 美腿丝袜亚洲三区| 经典一区二区三区| 国产激情一区二区三区四区| 国产成人三级在线观看| 成人福利视频网站| 高清av一区二区| 波多野结衣欧美| 欧洲精品一区二区| 欧美一区二区三区成人| 久久亚洲欧美国产精品乐播| 欧美精品一区二区久久久| 欧美激情一区二区| 自拍偷自拍亚洲精品播放| 亚洲综合久久久久| 日日骚欧美日韩| 精品一区二区免费| 国产91在线观看| 成人精品视频网站| 欧美性生活影院| 日韩欧美成人一区二区| 国产午夜精品一区二区三区嫩草| 91精品国产综合久久久久久漫画| 精品久久久久久亚洲综合网| 欧美视频在线观看一区| 久久国产婷婷国产香蕉| 国产成人午夜精品5599| 日韩一区二区影院| 日韩一级二级三级精品视频| 久久精品欧美日韩精品| 久久你懂得1024| 亚洲三级电影全部在线观看高清| 亚洲成人资源在线| 久久国产综合精品| 99精品视频一区二区| 在线播放/欧美激情| 国产日韩欧美亚洲| 亚洲综合一二区| 国产精品人妖ts系列视频| 亚洲一区二区三区激情| 久草在线在线精品观看| 99久久99久久久精品齐齐| 欧美高清视频一二三区 | 国产99久久久久| 色素色在线综合| 日韩欧美激情四射| 国产精品天天摸av网| 亚洲尤物视频在线| 日本伊人午夜精品| 成人小视频在线观看| 欧美国产激情一区二区三区蜜月| 中文字幕乱码一区二区免费| 国产精品免费视频观看| 亚洲无人区一区| 亚洲成av人片在线| 国产成+人+日韩+欧美+亚洲| 欧美日韩午夜在线| 国产女同性恋一区二区| 午夜精彩视频在线观看不卡| 韩国成人精品a∨在线观看| 91浏览器打开| 欧美日韩一区三区四区| 国产女主播在线一区二区| 五月激情综合色| av中文字幕在线不卡| 日韩欧美在线一区二区三区| 国产精品久久久99| 亚洲欧美日韩国产另类专区| 久久亚洲精精品中文字幕早川悠里 | 久久精品国产久精国产| 91国偷自产一区二区三区观看| 久久综合色婷婷| 亚洲v日本v欧美v久久精品| 国产高清无密码一区二区三区| 99久久99久久久精品齐齐| 日韩欧美色电影| 亚洲一本大道在线| 成人开心网精品视频| 精品盗摄一区二区三区| 亚洲高清一区二区三区| 99久久综合狠狠综合久久|