awk-高效查看日志


awk是什么?

awk 是以文件的一行內容為處理單位的一個文本處理工具,依次對每一行進行處理,然后輸出
​
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,默認以空格為分隔符將每行切片,切開的部分再進行各種分析處理。
awk是行處理器,相比較屏幕處理的優點,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,通常用來格式化文本信息 ———————————————— 版權聲明:本文為CSDN博主「謝公子」的原創文章,遵循 CC
4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_36119192/java/article/details/82982732 

awk如何使用?

awk讀取一行內容,然后根據指定條件判斷是否處理此行內容,若此行文本符合條件,則按照動作處理文本,否則跳過此行文本,讀取下一行進行判斷。

 

 

awk參數?

參數: 
-F   指定分隔符  每一行的分割符號  分割后$1發生變化
-f    調用腳本
-v   定義變量
Begin{}    初始化代碼塊,在對每一行進行處理之前,初始化代碼,主要是引用全局變量,設置FS分隔符
//            匹配代碼塊,可以是字符串或正則表達式
{}            命令代碼塊,包含一條或多條命令,多條命令用 ;  隔開
awk  參數    ' BEGIN{} // {action1;action2} '  END{}   文件名
​
END{}      結尾代碼塊,在對每一行進行處理之后再執行的代碼塊,主要是進行最終計算或輸出結尾摘要信息
例:awk 'BEGIN{X=0}/root/{X+=1}END{print "I find",X,"root lines"}'  /etc/passwd   
統計 /etc/passwd 文件中包含root行的總數

 

 

awk中字符的含義

$0           表示整個當前行
$1           每行第一個字段
NF          字段數量變量
NR          每行的記錄號,多文件記錄遞增
FNR        與NR類似,不過多文件記錄不遞增,每個文件都從1開始
\t            制表符
\n           換行符
FS          BEGIN時定義分隔符
RS         輸入的記錄分隔符, 默認為換行符(即文本是按一行一行輸入)
~            包含
!~           不包含
==         等於,必須全部相等,精確比較
!=           不等於,精確比較
&&         邏輯與
||             邏輯或
​
匹配時表示1個或1個以上
/[0-9][0-9]+/     兩個或兩個以上數字
/[0-9][0-9]*/     一個或一個以上數字
OFS         輸出字段分隔符, 默認也是空格,可以改為其他的
ORS         輸出的記錄分隔符,默認為換行符,即處理結果也是一行一行輸出到屏幕
-F  [:#/]    定義了三個分隔符

 

 

print 打印

print 是 awk打印指定內容的主要命令,也可以用 printf
awk '{print}'  /etc/passwd   ==   awk '{print $0}'  /etc/passwd  
awk '{print " "}'  /etc/passwd         不輸出passwd的內容,而是輸出相同個數的空行,進一步解釋了awk是一行一行處理文本
awk '{print "a"}'   /etc/passwd        輸出相同個數的a行,一行只有一個a字母
awk -F:  '{print $1}'  /etc/passwd  ==   awk  -F  ":"  '{print $1}'  /etc/passwd
awk -F: '{print $1 $2}'                輸入字段1,2,中間不分隔
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd        輸出字段1,3,6, 以制表符作為分隔符
awk -F: '{print $1; print $2}'   /etc/passwd           輸入字段1,2,分行輸出
awk -F: '{print $1 "**" print $2}'   /etc/passwd       輸入字段1,2,中間以**分隔
awk -F: '{print "name:"$1"\tid:"$3}' /etc/passwd       自定義格式輸出字段1,2
awk -F: '{print NF}' /etc/passwd                       顯示每行有多少字段
awk -F: 'NF>2{print }' /etc/passwd                     將每行字段數大於2的打印出來
awk -F: 'NR==5{print}' /etc/passwd                     打印出/etc/passwd文件中的第5行
awk -F: 'NR==5|NR==6{print}' /etc/passwd               打印出/etc/passwd文件中的第5行和第6行
awk -F: 'NR!=1{print}'  /etc/passwd                    不顯示第一行
awk -F: '{print > "1.txt"}'  /etc/passwd               輸出到文件中
awk -F: '{print}' /etc/passwd > 2.txt                  使用重定向輸出到文件中 

 

 

字符匹配

awk  -F: '/root/{print }'  /etc/passwd             打印出文件中含有root的行
awk  -F: '/'$A'/{print }'  /etc/passwd             打印出文件中含有變量 $A的行
awk -F: '!/root/{print}' /etc/passwd               打印出文件中不含有root的行
awk -F:  '/root|tom/{print}'  /etc/passwd       打印出文件中含有root或者tom的行
awk -F: '/mail/,mysql/{print}'  test   打印出文件中含有 mail*mysql 的行,*代表有0個或任意多個字符
awk -F: '/^[2][7][7]*/{print}'  test   打印出文件中以27開頭的行,如27,277,27gff 等等
awk -F: '$1~/root/{print}' /etc/passwd          打印出文件中第一個字段是root的行
awk -F: '($1=="root"){print}' /etc/passwd       打印出文件中第一個字段是root的行,與上面的等效
awk -F: '$1!~/root/{print}' /etc/passwd         打印出文件中第一個字段不是root的行
awk -F: '($1!="root"){print}' /etc/passwd       打印出文件中第一個字段不是root的行,與上面的等效
awk -F: '$1~/root|ftp/{print}' /etc/passwd      打印出文件中第一個字段是root或ftp的行
awk -F: '($1=="root"||$1=="ftp"){print}' /etc/passwd   打印出文件中第一個字段是root或ftp的行,與上面的等效
awk -F: '$1!~/root|ftp/{print}' /etc/passwd     打印出文件中第一個字段不是root或不是ftp的行
awk -F: '($1!="root"||$1!="ftp"){print}' /etc/passwd    打印出文件中第一個字段不是root或不是ftp的行,與上面等效
awk -F: '{if($1~/mail/) {print $1} else {print $2}}'  /etc/passwd   如果第一個字段是mail,則打印第一個字段,否則打印第2個字段

 

 

格式化輸出

*awk '{printf "%-5s %.2d",$1,$2}' test\****
- printf 表示格式輸出
- %格式化輸出分隔符
- -8表示長度為8個字符
- s表示字符串類型,d表示小數

 

示例

1、顯示 /etc/passwd 中含有 root 的行
awk '/root/'  /etc/passwd
2、以 : 為分隔,顯示/etc/passwd中每行的第1和第7個字段
awk -F ":" '{print $1,$7}' /etc/passwd  或  awk 'BEGIN{FS=":"}{print $1,$7}' /etc/passwd
3、以 : 為分隔,顯示/etc/passwd中含有 root 的行的第1和第7個字段
awk -F ":" '/root/{print $1,$7}' /etc/passwd
4、以 : 為分隔,顯示/etc/passwd中以 root 開頭行的第1和第7個字段
awk -F ":" '/^root/{print $1,$7}' /etc/passwd
5、以 : 為分隔,顯示/etc/passwd中第3個字段大於999的行的第1和第7個字段
awk -F ":" '$3>999{print $1,$7}'  /etc/passwd
6、以 : 為分隔,顯示/etc/passwd中第7個字段包含bash的行的第1和第7個字段
awk -F ":" '$7~"bash"{print $1,$7}' /etc/passwd
7、以 : 為分隔,顯示/etc/passwd中第7個字段不包含bash的行的第1和第7個字段
awk -F ":" '$7!~"nologin"{print $1,$7}'  /etc/passwd
8、以 : 為分隔,顯示$3>999並且第7個字段包含bash的行的第1和第7個字段
awk -F ":" '$3>999&&$7~"bash"{print $1,$7}' /etc/passwd
9、以 : 為分隔,顯示$3>999或第7個字段包含bash的行的第1和第7個字段
awk -F ":" '$3>999||$7~"bash"{print $1,$7}' /etc/passwd
10、以 : 為分隔,第10行輸出1,其他輸出當前行
awk -F ":" ' {if (NR ==10){print 1} else {print}}' /etc/passwd

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM