国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

一個優(yōu)秀的分析trace文件的腳本

2024-07-21 02:38:17
字體:
供稿:網(wǎng)友

  使用于unix類環(huán)境,附件中的是Oracle工程師分析trace文件用的,的使用說明在文件中有,down下來后可把txt文件后綴去掉。非常的方便。下面是關(guān)于awk的一些簡單介紹:
  
  Awk 是一種非常好的語言,同時有一個非常希奇的名稱。在本系列(共三篇文章)的第一篇文章中,Daniel Robbins 將使您迅速把握 awk 編程技巧。隨著本系列的進展,將討論更高級的主題,最后將演示一個真正的高級 awk 演示程序。
  捍衛(wèi) awk
  在本系列文章中,我將使您成為精通 awk 的編碼人員。我承認(rèn),awk 并沒有一個非常好聽且又非常“時髦”的名字。awk 的 GNU 版本(叫作 gawk)聽起來非常怪異。那些不熟悉這種語言的人可能聽說過 "awk",并可能認(rèn)為它是一組落伍且過時的混亂代碼。它甚至?xí)棺畈W(xué)的 UNIX 權(quán)威陷于錯亂的邊緣(使他不斷地發(fā)出 "kill -9!" 命令,就象使用咖啡機一樣)。
  
  的確,awk 沒有一個動聽的名字。但它是一種很棒的語言。awk 適合于文本處理和報表生成,它還有許多精心設(shè)計的特性,答應(yīng)進行需要非凡技巧程序設(shè)計。與某些語言不同,awk 的語法較為常見。它借鑒了某些語言的一些精華部分,如 C 語言、python 和 bash(雖然在技術(shù)上,awk 比 python 和 bash 早創(chuàng)建)。awk 是那種一旦學(xué)會了就會成為您戰(zhàn)略編碼庫的主要部分的語言。
  第一個 awk
  讓我們繼續(xù),開始使用 awk,以了解其工作原理。在命令行中輸入以下命令:
  $ awk '{ PRint }' /etc/passwd
  您將會見到 /etc/passwd 文件的內(nèi)容出現(xiàn)在眼前。現(xiàn)在,解釋 awk 做了些什么。調(diào)用 awk 時,我們指定 /etc/passwd 作為輸入文件。執(zhí)行 awk 時,它依次對 /etc/passwd 中的每一行執(zhí)行 print 命令。所有輸出都發(fā)送到 stdout,所得到的結(jié)果與與執(zhí)行catting /etc/passwd完全相同。
  
  現(xiàn)在,解釋 { print } 代碼塊。在 awk 中,花括號用于將幾塊代碼組合到一起,這一點類似于 C 語言。在代碼塊中只有一條 print 命令。在 awk 中,假如只出現(xiàn) print 命令,那么將打印當(dāng)前行的全部內(nèi)容。
  這里是另一個 awk 示例,它的作用與上例完全相同:
  $ awk '{ print $0 }' /etc/passwd
  在 awk 中,$0 變量表示整個當(dāng)前行,所以 print 和 print $0 的作用完全一樣。
  假如您愿意,可以創(chuàng)建一個 awk 程序,讓它輸出與輸入數(shù)據(jù)完全無關(guān)的數(shù)據(jù)。以下是一個示例:
  $ awk '{ print "" }' /etc/passwd
  只要將 "" 字符串傳遞給 print 命令,它就會打印空白行。假如測試該腳本,將會發(fā)現(xiàn)對于 /etc/passwd 文件中的每一行,awk 都輸出一個空白行。再次說明, awk 對輸入文件中的每一行都執(zhí)行這個腳本。以下是另一個示例:
  $ awk '{ print "hiya" }' /etc/passwd
  運行這個腳本將在您的屏幕上寫滿 hiya。
  
  多個字段
  awk 非常善于處理分成多個邏輯字段的文本,而且讓您可以毫不費力地引用 awk 腳本中每個獨立的字段。以下腳本將打印出您的系統(tǒng)上所有用戶帳戶的列表:
  $ awk -F":" '{ print $1 }' /etc/passwd
  上例中,在調(diào)用 awk 時,使用 -F 選項來指定 ":" 作為字段分隔符。awk 處理 print $1 命令時,它會打印出在輸入文件中每一行中出現(xiàn)的第一個字段。以下是另一個示例:
  $ awk -F":" '{ print $1 $3 }' /etc/passwd
  以下是該腳本輸出的摘錄:
  halt7
  Operator11
  root0
  shutdown6
  sync5
  bin1
  ....etc.
  如您所見,awk 打印出 /etc/passwd 文件的第一和第三個字段,它們正好分別是用戶名和用戶標(biāo)識字段。現(xiàn)在,當(dāng)腳本運行時,它并不理想 -- 在兩個輸出字段之間沒有空格!假如習(xí)慣于使用 bash 或 python 進行編程,那么您會指望 print $1 $3 命令在兩個字段之間插入空格。然而,當(dāng)兩個字符串在 awk 程序中彼此相鄰時,awk 會連接它們但不在它們之間添加空格。以下命令會在這兩個字段中插入空格:
  $ awk -F":" '{ print $1 " " $3 }' /etc/passwd
  以這種方式調(diào)用 print 時,它將連接 $1、" " 和 $3,創(chuàng)建可讀的輸出。當(dāng)然,假如需要的話,我們還可以插入一些文本標(biāo)簽:
  $ awk -F":" '{ print "username: " $1 "/t/tuid:" $3" }' /etc/passwd
  這將產(chǎn)生以下輸出:
  username: halt uid:7
  username: operator uid:11
  username: root uid:0
  username: shutdown uid:6
  username: sync uid:5
  username: bin uid:1
  ....etc.
  外部腳本
  將腳本作為命令行自變量傳遞給 awk 對于小的單行程序來說是非常簡單的,而對于多行程序,它就比較復(fù)雜。
您肯定想要在外部文件中撰寫腳本。然后可以向 awk 傳遞 -f 選項,以向它提供此腳本文件:
  $ awk -f myscript.awk myfile.in
  將腳本放入文本文件還可以讓您使用附加 awk 功能。例如,這個多行腳本與前面的單行腳本的作用相同,它們都打印出 /etc/passwd 中每一行的第一個字段:
  BEGIN {
  FS=":"
  }
  
  { print $1 }
  這兩個方法的差別在于如何設(shè)置字段分隔符。在這個腳本中,字段分隔符在代碼自身中指定(通過設(shè)置 FS 變量),而在前一個示例中,通過在命令行上向 awk 傳遞 -F":" 選項來設(shè)置 FS。通常,最好在腳本自身中設(shè)置字段分隔符,只是因為這表示您可以少輸入一個命令行自變量。我們將在本文的后面具體討論 FS 變量。
  BEGIN 和 END 塊
  通常,對于每個輸入行,awk 都會執(zhí)行每個腳本代碼塊一次。然而,在許多編程情況中,可能需要在 awk 開始處理輸入文件中的文本之前執(zhí)行初始化代碼。對于這種情況,awk 答應(yīng)您定義一個 BEGIN 塊。我們在前一個示例中使用了 BEGIN 塊。因為 awk 在開始處理輸入文件之前會執(zhí)行 BEGIN 塊,因此它是初始化 FS(字段分隔符)變量、打印頁眉或初始化其它在程序中以后會引用的全局變量的極佳位置。
  awk 還提供了另一個非凡塊,叫作 END 塊。awk 在處理了輸入文件中的所有行之后執(zhí)行這個塊。通常,END 塊用于執(zhí)行最終計算或打印應(yīng)該出現(xiàn)在輸出流結(jié)尾的摘要信息。
  規(guī)則表達(dá)式和塊
  awk 答應(yīng)使用規(guī)則表達(dá)式,根據(jù)規(guī)則表達(dá)式是否匹配當(dāng)前行來選擇執(zhí)行獨立代碼塊。以下示例腳本只輸出包含字符序列 foo 的那些行:
  /foo/ { print }
  當(dāng)然,可以使用更復(fù)雜的規(guī)則表達(dá)式。以下腳本將只打印包含浮點數(shù)的行:
  /[0-9]+/.[0-9]*/ { print }
  表達(dá)式和塊
  還有許多其它方法可以選擇執(zhí)行代碼塊。我們可以將任意一種布爾表達(dá)式放在一個代碼塊之前,以控制何時執(zhí)行某特定塊。僅當(dāng)對前面的布爾表達(dá)式求值為真時,awk 才執(zhí)行代碼塊。以下示例腳本輸出將輸出其第一個字段等于 fred 的所有行中的第三個字段。假如當(dāng)前行的第一個字段不等于 fred,awk 將繼續(xù)處理文件而不對當(dāng)前行執(zhí)行 print 語句:
  $1 == "fred" { print $3 }
  awk 提供了完整的比較運算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,awk 還提供了 "~" 和 "!~" 運算符,它們分別表示“匹配”和“不匹配”。它們的用法是在運算符左邊指定變量,在右邊指定規(guī)則表達(dá)式。假如某一行的第五個字段包含字符序列 root,那么以下示例將只打印這一行中的第三個字段:
  $5 ~ /root/ { print $3 }
  條件語句
  awk 還提供了非常好的類似于 C 語言的 if 語句。假如您愿意,可以使用 if 語句重寫前一個腳本:
  {
  if ( $5 ~ /root/ ) {
  print $3
  }
  }
  這兩個腳本的功能完全一樣。第一個示例中,布爾表達(dá)式放在代碼塊外面。而在第二個示例中,將對每一個輸入行執(zhí)行代碼塊,而且我們使用 if 語句來選擇執(zhí)行 print 命令。這兩個方法都可以使用,可以選擇最適合腳本其它部分的一種方法。
  以下是更復(fù)雜的 awk if 語句示例。可以看到,盡管使用了復(fù)雜、嵌套的條件語句,if 語句看上去仍與相應(yīng)的 C 語言 if 語句一樣:
  {
  if ( $1 == "foo" ) {
  if ( $2 == "foo" ) {
  print "uno"
  } else {
  print "one"
  }
  } else if ($1 == "bar" ) {
  print "two"
  } else {
  print "three"
  }
  }
  使用 if 語句還可以將代碼:
  ! /matchme/ { print $1 $3 $4 }
  轉(zhuǎn)換成:
  {
  if ( $0 !~ /matchme/ ) {
  print $1 $3 $4
  }
  }
  這兩個腳本都只輸出不包含 matchme 字符序列的那些行。此外,還可以選擇最適合您的代碼的方法。它們的功能完全相同。
  awk 還答應(yīng)使用布爾運算符 ""(邏輯與)和 "&&"(邏輯或),以便創(chuàng)建更復(fù)雜的布爾表達(dá)式:
  ( $1 == "foo" ) && ( $2 == "bar" ) { print }
  這個示例只打印第一個字段等于 foo 且第二個字段等于 bar 的那些行。
  數(shù)值變量!
  至今,我們不是打印字符串、整行就是特定字段。然而,awk 還答應(yīng)我們執(zhí)行整數(shù)和浮點運算。通過使用數(shù)學(xué)表達(dá)式,可以很方便地編寫計算文件中空白行數(shù)量的腳本。以下就是這樣一個腳本:
  BEGIN { x=0 }
  /^$/ { x=x+1 }
  END { print "I found " x " blank lines. " }
  在 BEGIN 塊中,將整數(shù)變量 x 初始化成零。然后,awk 每次碰到空白行時,awk 將執(zhí)行 x=x+1 語句,遞增 x。處理完所有行之后,執(zhí)行 END 塊,awk 將打印出最終摘要,指出它找到的空白行數(shù)量。
  字符串化變量
  awk 的優(yōu)點之一就是“簡單和字符串化”。我認(rèn)為 awk 變量“字符串化”是因為所有 awk 變量在內(nèi)部都是按字符串形式存儲的。同時,awk 變量是“簡單的”,因為可以對它執(zhí)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 婺源县| 金秀| 洛宁县| 云林县| 乐东| 隆尧县| 枣庄市| 林州市| 兴城市| 基隆市| 道孚县| 望城县| 明溪县| 奈曼旗| 浏阳市| 屏南县| 革吉县| 宜兰县| 偏关县| 凤城市| 丹东市| 澳门| 十堰市| 西青区| 马龙县| 黔东| 东至县| 房山区| 宣威市| 平湖市| 陆良县| 焉耆| 郧西县| 扎囊县| 宣化县| 克山县| 湟源县| 津市市| 芦溪县| 方正县| 阿瓦提县|