linux文本分析命令——awk

2021-02-13 夜班保安小吳愛編程
一、基本介紹和說明

作用:接收輸入的文本如日誌等每行有一致性的內容,可按照規則進行分析、處理、轉化得到想要的輸出。

普遍用法:

# 分析文件awk ' rule /pattern/ {action} ' filename# 分析輸入ls netstat.log | awk ' rule /pattern/ {action} '

相關符號:

•$0 當前記錄•$n 第n個欄位(一般而言,分析的內容每行一個記錄,每列一個欄位),即第n列•NR 當前行數,不斷增加•NF 欄位數•FS 分析內容(輸入欄位)的分隔符•OFS 輸出欄位分隔符•FILENAME 當前輸入文件名•BEGIN 開始前就執行•END 行數遍歷完再執行•邏輯運算符:||、&&、!=、==、>、<、>=、<=

注意:

•awk語句必須被單引號(必須)包圍•單引號內,我的規律總結為:規則、正則直接寫,行為操作使用{}包起來

二、示例說明

先創建了一個日誌文件test_awk.log,內容如下,分隔符默認是空格,這裡為了說明分隔符的使用,使用|作為各個欄位的分隔符:

time    user    ip      msg2020-01-01|ronnie|127.0.0.1|this is msg show2020-01-12|littsh|119.119.0.1|login for test2020-02-13|bob|113.12.34.1|I am bob

1.簡單的選取time和ip欄位:

# 示例以#作為分隔符,需要聲明分隔符為#,用-F參數指定awk -F "|" '{print $1,$3}' test_awk.log# 用BEGIN在開始分析前執行指定分隔符,用內置變量FS來指定|為分隔符awk 'BEGIN {FS="|"} {print $1,$3}' test_awk.log

分析結果為:

time    user    ip      msg2020-01-01 127.0.0.12020-01-12 119.119.0.12020-02-13 113.12.34.1

讀取了所有行數和滿足分隔符條件的第一列和第三列。此時,如果不需要第一行,可以使用NR內建變量來根據它來輸入,命令:

awk -F "|" 'NR!=1 {print $1,$3}' test_awk.log

意為:NR(類似索引,awk是按行分析)不為1,即不為第一行的內容,才輸出,註:條件NR!=1直接寫在''內,操作才寫在{}內。結果為:

2020-01-01 127.0.0.12020-01-12 119.119.0.12020-02-13 113.12.34.1

如果輸出的結果間距太小,不夠美觀,可以用printf方法來進行格式化輸出,和c很像,命令:

awk -F "|" 'NR!=1 {printf "%-15s %-15s\n",$1,$3}' test_awk.log

註:上面命令,printf後面接的是雙引號,裡面%s代表字符串,%-15s代表如果沒有滿足15個字符,那麼就右補齊。輸出如下:

2020-01-01      127.0.0.12020-01-12      119.119.0.12020-02-13      113.12.34.1

如果說不希望展示127.0.0.1的數據,那麼,可以輸入條件來過濾:

awk -F "|" 'NR!=1 && $3!="127.0.0.1" {printf "%-15s %-15s\n",$1,$3}' test_awk.log

輸出:

2020-01-12      119.119.0.12020-02-13      113.12.34.1

2.利用正則表達式選取: 若想要選擇含有2020-01的內容,那麼,命令如下:

awk -F "|" '/2020-01/ {print $1,$2,$3}' test_awk.log

該命令將正則規則寫在''內,選取的是只要含有2020-01的行數,列為欄位時間、名字、ip,輸出為:

2020-01-01 ronnie 127.0.0.12020-01-12 littsh 119.119.0.1

如果我想要選取僅僅ip($3)內含有12的行,就需要指定行,命令如下:

awk -F "|" '$3 ~/12/ {print $1,$2,$3}' test_awk.log

正則前需要加$3 ~,意味第三列的匹配模式為後面的正則,~表示模式開始。

2020-01-01 ronnie 127.0.0.12020-02-13 bob 113.12.34.1

3.統計: 如果我想要得出出ip裡面含有12的有多少列,需要用到變量和END,命令如下:

awk -F "|" '$3 ~/12/ {total+=1} END {print "total is",total}' test_awk.log

其中,表達式total+=1必須寫在{}內,每次分析一行,都會給total加1,END意思為直到讀取完所有行才執行後面的內容,故,輸出為:

4.awk腳本: 如果要處理的awk的命令比較複雜的,那麼,可以寫在一個文件中test_awk.awk,內容如下:

#!/bin/awk -f
# BEGIN後面必須緊接著{}BEGIN{ FS="|" printf "time user ip count\n" printf "\n" count = 0}{ # if的寫法 if($3!="127.0.0.1" && NR!=1){ count += 1 printf "%-15s %-15s %-15s %-15s\n",$1,$2,$3,count }}END{ printf "##################################################\n"}

該段代碼意思為:開始分析前,先修改分隔符為|;之後自定義輸出幾個欄位,每個欄位包括後面的空格總共15個字符,且count是自定義的;之後輸出---的行分割線;自己定義變量count=0;之後,按行分析,如果第三個欄位ip不是127.0.0.1的且不是第一行的,就輸出,且count每次加1;待所有行分析之後,完後再輸出#################,最後結果如下:

time           user           ip             count2020-01-12      littsh          119.119.0.1     12020-02-13      bob             113.12.34.1     2##################################################

1.分析性能: 但是涉及性能,需要研究下極端的情況,無窮小或者無窮大時候的情況,就拿日常web的訪問日誌(不同的內容數量)來說,用普通python腳本讀取、正則分析和用awk讀取分析,後續可以來做一個比較。

關於保安小吳

相關焦點

  • 面試題linux命令之awk
    無論是在測試還是開發崗位的面試招聘中,都會被提問到:是否了解linux系統,經常使用linux命令有哪些,接著可能會出一道題目,找出下列文本中的哪些值
  • Linux常用命令 awk 入門基礎教程
    在使用awk命令的過程中,可以使用邏輯操作符「&&」和「||」;也可以進行簡單的數學運算,如+ 、-、、/、%、^分別表示加、減、乘、除、取餘、乘方。**awk從輸入文件或者標準輸入中讀入信息,與sed一樣,信息的讀入也是逐行讀取的。不同的是,awk命令將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄的一個欄位。
  • 【Linux】常用命令之 awk 常用實例
    awk命令工具在Linux/UNIX系統中,awk是一個功能強大的編輯工具,逐行讀取輸入文本,
  • Linux 三劍客 Awk、Sed、Grep 命令詳解
    詳細說明awk 是一種程式語言,用於在linux/unix下對文本和數據進行處理。數據可以來自標準輸(stdin)、一個或多個文件,或其它命令的輸出。它在命令行中使用,但更多是作為腳本來使用。awk有很多內建的功能,比如數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優勢。
  • Linux awk命令入門詳解
    簡介awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大
  • linux Awk命令詳解
    簡介awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
  • Linux Awk命令詳解
    簡介awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大
  • linux awk命令詳解
    是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。
  • Linux 上 12 個高效的文本過濾命令
    因此,它可以用來以強大的方式處理信息,例如重新結構化輸出以生成有用的報告,修改文件裡面的文本,以及其他很多系統管理任務。下面是 Linux 上的一些有用的文件或者文本過濾器。1、 awk 命令awk[1] 是一個卓越的模式掃描和處理語言,它可被用於在 Linux 下構造有用的過濾器。
  • 10分鐘學會 Linux awk命令
    是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。
  • awk一個linux系統的中的好教官
    awk是一個文本處理程序,但是我更喜歡叫它教官,因為這樣更形象。我喜歡把各種文本的內容稱為士兵,而教官負責管理培訓它們。日誌統計開發web的人員知道,我們經常需要查看nginx的伺服器來統計來訪者的記錄。
  • 史上最全的 Linux Shell 文本處理工具集錦,快收藏!
    :find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;對shell腳本使用的原則是命令單行書寫,儘量不要超過2行;如果有更為複雜的任務需求,還是考慮python吧;我把 linux 相關的文章整理成了 PDF,關注公眾號 Java後端 並回復 666 下載。
  • Linux shell腳本編程入門系列七:linux三劍客之awk
    1、awk是什麼?awk命令的作用是進行文本掃描、處理以及報表的生成。awk命令有自己的語法規則,官方說法叫「樣式掃描和處理語言」,其語法借鑑了C語言的精華。由於其強大的文本分析能力與格式化輸出能力,awk命令成為Linux環境開發者的必備殺器,與grep命令、sed命令一起被稱為Linux三劍客。熟練運用awk命令能讓我們的日常工作變得高端同時也高效起來。2、awk的基本使用awk對文本的掃描是以行為單位的,也就是說awk一次從文本中讀取一行的內容。
  • 性能工具之linux常見日誌統計分析命令
    引言在上文中性能工具之linux三劍客awk、grep、sed詳解,我們已經詳細介紹 linux
  • Linux 三劍客之 awk 詳解
    (給Linux愛好者加星標,提升Linux技能)以下文章來源於宜信技術學院 ,作者秦偉第一篇 awk簡介與表達式實例
  • 20分鐘吃掉Linux常用命令40式
    #切換到上級目錄, linux中一個點表示當前路徑,二個點表示當前路徑上級路徑例2:cd ~ #切換到主目錄例3:cd /User/liangyun03/ # 切換到某個絕對路徑,linux中以/開頭的路徑表示絕對路徑例4:cd
  • 搞定Linux Shell文本處理工具,看完這篇集錦就夠了
    下面我介紹Linux下使用Shell處理文本時最常用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;提供的例子和參數都是最常用和最為實用的;我對shell腳本使用的原則是命令單行書寫,儘量不要超過2行;如果有更為複雜的任務需求,還是考慮python吧;1、find
  • Linux系統和Shell命令行簡介,走上數據分析之路
    在一般的系統當中,都可以在這個目錄下找到linux常用的命令。系統所需要的那些命令位於此目錄或/usr/bin、/usr/local/bin中。/etc:etc (Editable Text Configuration) 目錄是linux系統中最重要的目錄之一。此目錄下存放了系統管理所需的各種配置文件和子目錄。
  • Linux awk 入門教程
    awk 是處理文本文件的一個應用程式,幾乎所有 Linux 系統都自帶這個程序。對於日誌、CSV 那樣的每行格式相同的文本文件,awk可能是最方便的工具。awk其實不僅僅是工具軟體,還是一種程式語言。不過,本文只介紹它的命令行用法,對於大多數場合,應該足夠用了。一、基本用法awk的基本用法就是下面的形式。
  • linux文本截取與處理之cut
    前面說了awk和sed,自然少不了要說說cut