awk使用和詳解

来源:https://www.cnblogs.com/bugingcode/archive/2018/01/15/8287914.html
-Advertisement-
Play Games

awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,ga ...


awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程式,這些程式讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。

awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

awk有3個不同版本號: awk、nawk和gawk,未作特別說明,一般指gawk。

awk程式的報告生成能力通經常使用來從大文本文件里提取數據元素並將它們格式化成可讀的報告。最完美的樣例是格式化日誌文件。

awk的用法

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:運行BEGIN{ commands }語句塊中的語句。

第二步:從文件或標準輸入(stdin)讀取一行。然後運行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最後一行反覆這個過程。直到文件所有被讀取完成。

第三步:當讀至輸入流末尾時。運行END{ commands }語句塊。

BEGIN語句塊在awk開始從輸入流中讀取行之前被運行,這是一個可選的語句塊,比方變數初始化、列印輸出表格的表頭等語句通常能夠寫在BEGIN語句塊中。

END語句塊在awk從輸入流中讀取全然部的行之後即被運行。比方列印全部行的分析結果這類信息彙總都是在END語句塊中完畢,它也是一個可選語句塊。

pattern語句塊中的通用命令是最重要的部分,它也是可選的。假設沒有提供pattern語句塊,則預設運行{ print },即列印每個讀取到的行。awk讀取的每一行都會運行該語句塊。

這三個部分缺少任何一部分都可以。

內建變數

列出某個目錄的文件:

[root@localhost profile.d]# ls -lh
total 136K
-rwxr-xr-x 1 root root  766 Jul 22  2011 colorls.csh
-rwxr-xr-x 1 root root  727 Jul 22  2011 colorls.sh
-rw-r--r-- 1 root root   92 Feb 23  2012 cvs.csh
-rwxr-xr-x 1 root root   78 Feb 23  2012 cvs.sh
-rwxr-xr-x 1 root root  192 Mar 25  2009 glib2.csh
-rwxr-xr-x 1 root root  192 Mar 25  2009 glib2.sh
-rw-r--r-- 1 root root  218 Jun  6  2013 krb5-devel.csh
-rw-r--r-- 1 root root  229 Jun  6  2013 krb5-devel.sh
-rw-r--r-- 1 root root  218 Jun  6  2013 krb5-workstation.csh
-rw-r--r-- 1 root root  229 Jun  6  2013 krb5-workstation.sh
-rwxr-xr-x 1 root root 3.0K Feb 22  2012 lang.csh
-rwxr-xr-x 1 root root 3.4K Feb 22  2012 lang.sh
-rwxr-xr-x 1 root root  122 Feb 23  2012 less.csh
-rwxr-xr-x 1 root root  108 Feb 23  2012 less.sh
-rwxr-xr-x 1 root root   97 Mar  6  2011 vim.csh
-rwxr-xr-x 1 root root  293 Mar  6  2011 vim.sh
-rwxr-xr-x 1 root root  170 Jan  7  2007 which-2.sh

試一下awk的使用

ls -lh | awk '{print $1}'

在這裡awk 後面沒有BEGIN和END,跟著的是pattern,也就是每一行都會經過這個命令,在awk中$n,表示第幾列,在這裡表示列印每一行的第一列。

  • $0 當前記錄(這個變數中存放著整個行的內容)
  • $1~$n 當前記錄的第n個欄位,欄位間由FS分隔
  • FS 輸入欄位分隔符 預設是空格或Tab
  • NF 當前記錄中的欄位個數,就是有多少列
  • NR 已經讀出的記錄數,就是行號,從1開始,如果有多個文件話,這個值也是不斷累加中。
  • FNR 當前記錄數,與NR不同的是,這個值會是各個文件自己的行號
  • RS 輸入的記錄分隔符, 預設為換行符
  • OFS 輸出欄位分隔符, 預設也是空格
  • ORS 輸出的記錄分隔符,預設為換行符
  • FILENAME 當前輸入文件的名字

如列印每一行的行數:

[root@localhost profile.d]# ls -lh | awk '{print NR " " $1}'
1 total
2 -rwxr-xr-x
3 -rwxr-xr-x
4 -rw-r--r--
5 -rwxr-xr-x
6 -rwxr-xr-x
7 -rwxr-xr-x
8 -rw-r--r--
9 -rw-r--r--
10 -rw-r--r--
11 -rw-r--r--
12 -rwxr-xr-x
13 -rwxr-xr-x
14 -rwxr-xr-x
15 -rwxr-xr-x
16 -rwxr-xr-x
17 -rwxr-xr-x
18 -rwxr-xr-x

這樣再來看這段語句應該就很容易理解了:

root@ubuntu:~# awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/usr/sbin/nologin
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/usr/sbin/nologin
filename:/etc/passwd,linenumber:5,columns:7,linecontent:sync:x:4:65534:sync:/bin:/bin/sync
filename:/etc/passwd,linenumber:6,columns:7,linecontent:games:x:5:60:games:/usr/games:/usr/sbin/nologin

變數

除了awk的內置變數,awk還可以自定義變數。

如下引入變數sum,統計py文件的大小:

root@ubuntu:~# ls -l  *.py | awk '{sum+=$5} END {print sum}'
574

語句

awk中的條件語句是從C語言中借鑒來的,見如下聲明方式:

if語句

if (expression) {
    statement;
    statement;
    ... ...
}

if (expression) {
    statement;
} else {
    statement2;
}

if (expression) {
    statement1;
} else if (expression1) {
    statement2;
} else {
    statement3;
}

迴圈語句

awk中的迴圈語句同樣借鑒於C語言,支持while、do/while、for、break、continue,這些關鍵字的語義和C語言中的語義完全相同。

數組

因為awk中數組的下標可以是數字和字母,數組的下標通常被稱為關鍵字(key)。值和關鍵字都存儲在內部的一張針對key/value應用hash的表格裡。由於hash不是順序存儲,因此在顯示數組內容時會發現,它們並不是按照你預料的順序顯示出來的。數組和變數一樣,都是在使用時自動創建的,awk也同樣會自動判斷其存儲的是數字還是字元串。一般而言,awk中的數組用來從記錄中收集信息,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。

使用數組,統計重覆出現的次數:

[root@localhost cc]# cat test.txt
a 00
b 01
c 00
d 02
[root@localhost cc]# awk '{sum[$2]+=1}END{for(i in sum)print i"\t"sum[i]}' test.txt
00 2
01 1
02 1

站點日誌分析

以下使用Linux中的Awk對tomcat中日誌文件做一些分析,主要統計pv,uv等。

日誌文名稱:access_2013_05_30.log,大小57.7 MB 。

這次分析僅僅是簡單演示,所以不是太精確地處理數據。

日誌地址:http://download.csdn.net/detail/u011204847/9496357

日誌數據演示樣例:

日誌總行數:

列印的第七列數據為日誌的URL:

分析中用到的一些知識:

  • shell中的管道|
    command 1 | command 2 #他的功能是把第一個命令command 1運行的結果作為command 2的輸入傳給command 2

  • wc -l #統計行數

  • uniq -c #在輸出行前面加上每行在輸入文件里出現的次數

  • uniq -u #僅顯示不反覆的行

  • sort -nr
    -n:按照數值的大小排序
    -r:以相反的順序來排序
    -k:按照哪一列進行排序

  • head -3 #取前三名

數據清洗:

1、第一次清洗:去除URL中以/static/開頭的URL

awk '($7 !~ /^\/static\//){print $0}' access_2013_05_30.log > clean_2013_05_30.log

去除前:

去除後:

2、第二次清洗:去除圖片、css和js

awk '($7 !~ /\.jpg|\.png|\.jpeg|\.gif|\.css|\.js/) {print $0}' clean_2013_05_30.log > clean2_201 3_05_30.log

PV

pv是指網頁訪問次數

方法:統計全部數據的總行數

數據清洗:對原始數據中的干擾數據進行過濾

awk 'BEGIN{pv=0}{pv++}END{print "pv:"pv}' clean2_2013_05_30.log > pv_2013_05_30

UV

uv指的是訪問人數。也就是獨立IP數

對ip反覆的數據進行去重,然後再統計全部行數

awk '{print $1}' clean2_2013_05_30.log |sort -n |uniq -u |wc -l > uv_2013_05_30

訪問最多的IP(前10名)

對ip反覆的數據進行去重的時候還要彙總,取前10名

awk '{print $1}' clean2_2013_05_30.log | sort -n | uniq -c |sort -nr -k 1|head -10 > top10_2013_05_30

訪問前十的URL(能夠用來分析站點哪個模塊最受歡迎)

awk '{print $7}' clean2_2013_05_30.log | sort | uniq -c |sort -nr -k 1|head -10 > top10URL_2013_ 05_30

更多教程:阿貓學編程


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UNIX/Linux 本身是沒有圖形界面的,我們通常在 UNIX/Linux 發行版上看到的圖形界面實際都只是運行在 Linux 系統之上的一套軟體XFree86,現在則是 xorg(X.Org),而這套軟體又是通過 X 視窗系統(X Window System,也常被稱為 X11 或 X)實現的, ...
  • 一、 $diskutil list 尋找外設存儲器的名字/ promote:~ jss$ diskutil list /dev/disk0 (internal): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme 121.3 GB disk0 ...
  • Ubuntu中組管理和用戶管理;chmod,chgrp,chown,su以及which命令等命令的應用; ...
  • 參考文檔: grafana 部署:http://docs.grafana.org/installation/rpm/ 一.環境 1. 拓撲 2. 節點 Node OS Hostname IP Remark prometheus& grafana server centos 7.4 prometheu ...
  • ``虛擬機安裝Linux環境常需添加空間,預設分區模式根分區較小(20G),home目錄沒有單獨掛載。採用VMware自動安裝方式時,使用一段時間需要對目標虛擬機硬碟空間進行擴展,使用Expand可以擴展磁碟大小,但分區大小並未改變(某些發行版重啟即完成擴容,但至少CentOS中沒發現有,可能和分區 ...
  • 題記 對於top命令來說,基本是都是linux命令入門中,第一個使用的命令,在windows中電腦如果卡頓,回去任務欄中查看cpu和記憶體的使用情況。top命令實現的就是這個重要的功能。 在系統維護的過程中,隨時可能有需要查看 CPU 使用率,並根據相應信息分析系統狀況的需要。在 CentOS 中,可 ...
  • 1.兩個字典:a={'a':1,'b':2,'c':3} b= {'aa':11,'bb':22,'cc':33} 合併1:dict(a, b) 操作如下: a={'a':1,'b':2,'c':3} b= {'aa':11,'bb':22,'cc':33} dict(a, b) {'a': 1, ...
  • 埠名稱 埠號/協議 別名 ftp 21/tcp Telnet 23/tcp smtp 25/tcp mail nicename 43/tcp whois domain 53/tcp nameserver domain 53/udp nameserver finger 79/tcp http 80 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...