10個linux awk文本處理經典案例,關于AWK的10個經典案例

1、分析訪問日志(Nginx為例)

日志格式: '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"' 統計訪問IP次數: # awk '{a[$1]++}END{for(v in a)print v,a[v]}' access.log 統計訪問訪問大于100次的IP: # awk '{a[$1]++}END{for(v ina){if(a[v]>100)print v,a[v]}}' access.log 統計訪問IP次數并排序取前10: # awk '{a[$1]++}END{for(v in a)print v,a[v]|"sort -k2 -nr |head -10"}' access.log 統計時間段訪問最多的IP: # awk'$4>="[02/Jan/2017:00:02:00" &&$4< ="[02/Jan/2017:00:03:00"{a[$1]++}END{for(v in a)print v,a[v]}'access.log 統計上一分鐘訪問量: # date=$(date -d '-1 minute'+%d/%d/%Y:%H:%M) # awk -vdate=$date '$4~date{c++}END{printc}' access.log 統計訪問最多的10個頁面: # awk '{a[$7]++}END{for(vin a)print v,a[v]|"sort -k1 -nr|head -n10"}' access.log 統計每個URL數量和返回內容總大小: # awk '{a[$7]++;size[$7]+=$10}END{for(v ina)print a[v],v,size[v]}' access.log 統計每個IP訪問狀態碼數量: # awk '{a[$1" "$9]++}END{for(v ina)print v,a[v]}' access.log 統計訪問IP是404狀態次數: # awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print v,a[v]}' access.log

2、兩個文件差異對比

文件內容: # seq 1 5 > a # seq 3 7 > b 找出b文件在a文件相同記錄: 方法1: # awk 'FNR==NR{a[$0];next}{if($0 in a)print $0}' a b 3 4 5 # awk 'FNR==NR{a[$0];next}{if($0 in a)print FILENAME,$0}' a b b 3 b 4 b 5 # awk 'FNR==NR{a[$0]}NR>FNR{if($0 ina)print $0}' a b 3 4 5 # awk 'FNR==NR{a[$0]=1;next}(a[$0]==1)' a b # a[$0]是通過b文件每行獲取值,如果是1說明有 # awk 'FNR==NR{a[$0]=1;next}{if(a[$0]==1)print}' a b 3 4 5 方法2: # awk 'FILENAME=="a"{a[$0]}FILENAME=="b"{if($0 in a)print $0}' a b 3 4 5 方法3: # awk 'ARGIND==1{a[$0]=1}ARGIND==2 && a[$0]==1' a b 3 4 5 找出b文件在a文件不同記錄: 方法1: # awk 'FNR==NR{a[$0];next}!($0 in a)' a b 6 7 # awk 'FNR==NR{a[$0]=1;next}(a[$0]!=1)' a b # awk'FNR==NR{a[$0]=1;next}{if(a[$0]!=1)print}' a b 6 7 方法2: # awk'FILENAME=="a"{a[$0]=1}FILENAME=="b" && a[$0]!=1' a b 方法3: # awk 'ARGIND==1{a[$0]=1}ARGIND==2 && a[$0]!=1' a b

3、合并兩個文件

文件內容: # cat a zhangsan 20 lisi 23 wangwu 29 # cat b zhangsan man lisi woman wangwu man 將a文件合并到b文件: 方法1: # awk 'FNR==NR{a[$1]=$0;next}{print a[$1],$2}' a b zhangsan 20 man lisi 23 woman wangwu 29 man 方法2: # awk 'FNR==NR{a[$1]=$0}NR>FNR{print a[$1],$2}' a b zhangsan 20 man lisi 23 woman wangwu 29 man 將a文件相同IP的服務名合并: # cat a 192.168.1.1: httpd 192.168.1.1: tomcat 192.168.1.2: httpd 192.168.1.2: postfix 192.168.1.3: mysqld 192.168.1.4: httpd # awk 'BEGIN{FS=":";OFS=":"}{a[$1]=a[$1] $2}END{for(v in a)print v,a[v]}' a 192.168.1.4: httpd 192.168.1.1: httpd tomcat 192.168.1.2: httpd postfix 192.168.1.3: mysqld 解讀: 數組a存儲是$1=a[$1] $2,第一個a[$1]是以第一個字段為下標,值是a[$1] $2,也就是$1=a[$1] $2,值的a[$1]是用第一個字段為下標獲取對應的值,但第一次數組a還沒有元素,那么a[$1]是空值,此時數組存儲是192.168.1.1=httpd,再遇到192.168.1.1時,a[$1]通過第一字段下標獲得上次數組的httpd,把當前處理的行第二個字段放到上一次同下標的值后面,作為下標192.168.1.1的新值。此時數組存儲是192.168.1.1=httpd tomcat。每次遇到相同的下標(第一個字段)就會獲取上次這個下標對應的值與當前字段并作為此下標的新值。

4、將第一列合并到一行

# cat file 1 2 3 4 5 6 7 8 9 # awk '{for(i=1;i< =NF;i++)a[i]=a[i]$i" "}END{for(vin a)print a[v]}' file 1 4 7 2 5 8 3 6 9 解讀: for循環是遍歷每行的字段,NF等于3,循環3次。 讀取第一行時: 第一個字段:a[1]=a[1]1" " 值a[1]還未定義數組,下標也獲取不到對應的值,所以為空,因此a[1]=1 。 第二個字段:a[2]=a[2]2" " 值a[2]數組a已經定義,但沒有2這個下標,也獲取不到對應的值,為空,因此a[2]=2 。 第三個字段:a[3]=a[3]3" " 值a[2]與上面一樣,為空,a[3]=3 。 讀取第二行時: 第一個字段:a[1]=a[1]4" " 值a[2]獲取數組a的2為下標對應的值,上面已經有這個下標了,對應的值是1,因此a[1]=1 4 第二個字段:a[2]=a[2]5" " 同上,a[2]=2 5 第三個字段:a[3]=a[3]6" " 同上,a[2]=3 6 讀取第三行時處理方式同上,數組最后還是三個下標,分別是1=1 4 7,2=2 5 8,3=36 9。最后for循環輸出所有下標值。

5、字符串拆分

字符串拆分: 方法1: # echo "hello" |awk -F '''{for(i=1;i< =NF;i++)print $i}' h e l l o 方法2: # echo "hello" |awk '{split($0,a,"''");for(v in a)print a[v]}' l o h e l

6、統計出現的次數

統計字符串中每個字母出現的次數: # echo "a.b.c,c.d.e" |awk -F'[.,]' '{for(i=1;i< =NF;i++)a[$i]++}END{for(v in a)print v,a[v]}' a 1 b 1 c 2 d 1 e 1

7、費用統計

得出每個員工出差總費用及次數: # cat a zhangsan 8000 1 zhangsan 5000 1 lisi 1000 1 lisi 2000 1 wangwu 1500 1 zhaoliu 6000 1 zhaoliu 2000 1 zhaoliu 3000 1 # awk '{name[$1]++;cost[$1]+=$2;number[$1]+=$3}END{for(v in name)print v,cost[v],number[v]}' a zhangsan 5000 1 lisi 3000 2 wangwu 1500 1 zhaoliu 11000 3

8、獲取某列數字最大數

# cat a a b 1 c d 2 e f 3 g h 3 i j 2 獲取第三字段最大值: # awk 'BEGIN{max=0}{if($3>max)max=$3}END{print max}' a 3 打印第三字段最大行: # awk 'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(v in a)if(a[v]==max)print v}'a g h 3 e f 3

9、去除文本第一行和最后一行

# seq 5 |awk'NR>2{print s}{s=$0}' 2 3 4 解讀: 讀取第一行,NR=1,不執行print s,s=1 讀取第二行,NR=2,不執行print s,s=2 (大于為真) 讀取第三行,NR=3,執行print s,此時s是上一次p賦值內容2,s=3 最后一行,執行print s,打印倒數第二行,s=最后一行

10、獲取Nginx upstream塊內后端IP和端口

# cat a upstream example-servers1 { server 127.0.0.1:80 weight=1 max_fails=2fail_timeout=30s; } upstream example-servers2 { server 127.0.0.1:80 weight=1 max_fails=2fail_timeout=30s; server 127.0.0.1:82 backup; } # awk '/example-servers1/,/}/{if(NR>2){print s}{s=$2}}' a 127.0.0.1:80 # awk '/example-servers1/,/}/{if(i>1)print s;s=$2;i++}' a # awk '/example-servers1/,/}/{if(i>1){print s}{s=$2;i++}}' a 127.0.0.1:80 解讀: 讀取第一行,i初始值為0,0>1為假,不執行print s,x=example-servers1,i=1 讀取第二行,i=1,1>1為假,不執行prints,s=127.0.0.1:80,i=2 讀取第三行,i=2,2>1為真,執行prints,此時s是上一次s賦值內容127.0.0.1:80,i=3 最后一行,執行print s,打印倒數第二行,s=最后一行。 這種方式與上面一樣,只是用i++作為計數器。

掌握這些awk用法及思路,我相信你在Linux下處理文本無敵了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532995.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532995.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532995.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

arm linux 存儲,linux arm的存儲分布那些事

原標題&#xff1a;linux arm的存儲分布那些事linux arm 內存分布總覽上圖是linux的arm的虛擬地址分布總覽&#xff0c;我們按從低地址到高地址的順序逐個描述&#xff0c;每項的描述包括如下的內容的組和&#xff1a;地址范圍大小&#xff0c;虛擬轉物理的接口函數&#xff0c…

linux恢復終端默認配置,以gnome-terminal為例,修改gnome3 的默認配置,

以gnome-terminal為例&#xff0c;修改gnome3 的默認配置&#xff0c;gnome連續幾個版本的terminal默認配置文件都是同一個配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”。這是因為gnome的developers編輯了這個配置文件并作為gnome-terminal的默認配置文件&#xff0c;用來…

c語言字符串文庫總結,C語言程序設計入門:字符串函數

版權聲明&#xff1a;以上文章中所選用的圖片及文字來源于網絡以及用戶投稿&#xff0c;由于未聯系到知識產權人或未發現有關知識產權的登記&#xff0c;如有知識產權人并不愿意我們使用&#xff0c;如果有侵權請立即聯系&#xff1a;55525090qq.com&#xff0c;我們立即下架或…

vs寫c語言能用scanf,【PAT編寫代碼時遇到的問題】vs中使用scanf(%c,x);

首先&#xff0c;為了在VS中使用scanf&#xff0c;可以在程序開頭加上#pragma warning(disable:4996)昨天在編寫程序的時候&#xff0c;突然發現在循環中使用scanf("%c",&x);的時候&#xff0c;發現結果很奇怪&#xff0c;只能讀入和輸出我所輸入的數據的一半。后…

大數計算器概念c語言,用C語言求兩個超大整數的和

用C語言求兩個超大整數的和在生活中&#xff0c;我們經常需要計算非常大的數&#xff0c;但是任何一種計算器都有計算范圍&#xff0c;一旦超過計算范圍就會有精度的損失。或許有同學認為我們可以通過程序來解決&#xff0c;比如對于C語言來說&#xff0c;我們定義一個long lon…

3 5的二維數組C語言程序,C語言及程序設計提高例程-33 二維數組元素的引用

賀老師教學鏈接 C語言及程序設計提高 本課講解輸入輸出二維數組元素#include int main(){int s[3][5], i, j;printf("Input 3*5 numbers\n");for (i0; i<3; i)for(j0; j<5; j)scanf("%d", &s[i][j]);for (i0; i<3; i){for(j0; j<5; j)pri…

android程序 幻燈片,Android:ViewPager制作幻燈片

public class MainActivity extendsActivity {//ViewPagerprivateViewPager viewpager;//幻燈片圖片資源private int [] imgArray{R.drawable.view1,R.drawable.view2,R.drawable.view3};//圖片數組private ArrayListviewlist;privateImageView imageView;//點點privateViewGro…

android獲取圖片方向并旋轉,Android 判斷imageview角度并旋轉

/*** 讀取照片exif信息中的旋轉角度** return角度 獲取從相冊中選中圖片的角度*/public static float readPictureDegree(String path) {int degree 0;try {ExifInterface exifInterface new ExifInterface(path);int orientation exifInterface.getAttributeInt(ExifInterf…

android鍵盤移動光標,在Android鍵盤上完成鍵

Jos Silva..12代替ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));嘗試ic.performEditorAction(EditorInfo.IME_ACTION_GO);執行的操作應該是在EditorInfo上定義的操作,它將在方法onStartInputView上傳遞給您要在操作之間切換,請使用:(sEditorI…

android 遠程桌面連接閃退,遠程桌面一點連接就閃退,不能彈出輸入賬號密碼窗口...

您好&#xff0c;感謝您在我們論壇發帖。首先&#xff0c;按照您的描述&#xff0c;正常情況下&#xff0c;您的客戶端可以遠程連接您的服務器&#xff0c;輸入IP和端口之后&#xff0c;會彈出驗證框&#xff0c;輸入賬戶密碼之后即可進入服務器的桌面。當出現問題時&#xff0…

com.sec.android.app.smartclipservice,EPR Aerospace News

The World Cup Ball And Its Astonishing Effects Can Be Easily Explained Through TheTheory Of Dynamic Interactions, Which Also Applies To The Flight Of The Boomerang.The official World Cup ball, the so called “Jabulani”, which has been object of a lot of c…

signature=5bcdc11c0d509d82e0d44c544cfad97b,江蘇省職稱計算機考試新職稱光盤試卷

試卷一1、世界上第一臺電子數字計算機采用的主要邏輯部件是(D)A光電管 B繼電器 C晶體管 D電子管2、世界上首次提出存儲程序計算機體系結構的是(D)A艾倫〃圖靈 B莫奇萊 C喬治〃布爾 D馮〃諾依曼3、計算機最主要的工作特點是(A)A存儲程序與自動控制 B高速度與高精度C可靠性與可用…

html表格內文字置頂,css如何讓table里的字居中?

css如何讓table里的字居中&#xff1f;下面本篇文章就來給大家介紹一下使用CSS讓table里字居中的方法。有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對大家有所幫助。在CSS中&#xff0c;可以通過設置text-align: center;和vertical-align:middle;來…

你是怎么理解HTML語義化,HTML語義化標簽理解

1&#xff1a;語義化標簽是什么&#xff1f;語義化標簽&#xff0c;目的是讓標簽有自己的含義語義化非語義化如上代碼&#xff0c;p標簽含義就是段落&#xff0c;而span標簽毫無意義。2&#xff1a;語義化標簽好處方便用戶閱讀&#xff0c;頁面更加清晰。更好的SEO&#xff0c;…

html5離開網頁自動暫停,通過html5代碼在網頁中實現播放和暫停音樂mp3,mav等文

介紹通過html5代碼在網頁中實現播放和暫停音樂mp3,mav等文件的具體操作方法。這樣對于用戶來說&#xff0c;在線可播放功能能大大提高站內效率也可帶來一定的流量。希望對有需要的朋友有所幫助。這里我們需要先了解下&#xff0c;在html5中的兩個個重要標簽。阿里西西web開發網…

android開發屏幕橫放,android-即使從橫向旋轉到垂直,細節片段也會...

在一個Activity中,我們稱其為MasterActivity,我只想在橫向模式下加載媒體播放的細節片段.準備就緒后,媒體將自動啟動.主從流程設置&#xff1a;我有兩個xml,activity_master和activity_master.xml(land).標識為“ detail_container”的容器視圖僅位于景觀xml中.具有細節容器的l…

android insmod命令,android的啟動腳本(init.rc)文件的語法

android的啟動腳本(init.rc)文件的語法&#xff0c;參考資料&#xff1a;Android 初始化語言(Android Init Language)Android初始化腳本語言包含四種類型的語句&#xff1a;動作(Actions)指令(Commands)服務(Services)選項(Options)該語言的語法包括下列約定&#xff1a;所有類…

android digest 認證,探究 Android 簽名機制和原理

背景最近在調研一個測試工具的使用&#xff0c;在使用中發現被測試工具處理過的apk文件經安裝后打開就會崩潰&#xff0c;分析崩潰日志后原因是簽名不一致導致的。說到Android中的簽名&#xff0c;可能大家都知道簽名的目的就是為了保護apk文件的安全&#xff0c;如果apk被惡意…

html圖片拼接出現留白,關于img標簽周圍留白的問題

在進行頁面的DIV CSS排版時&#xff0c;遇到IE6瀏覽器中的圖片元素img下出現多余空白的問題絕對是常見的&#xff0c;對于該問題的解決方法也是“見機行事”。1、將圖片轉換為塊級對象即&#xff0c;設置img為“display:block;”。在本例中添加一組CSS代碼&#xff1a;“#sub i…

html5中的行高元素,詳解HTML元素的height、offsetHeight、clientHeight、scrollTop等梳理

關于元素的一些屬性在前端的日常開發中&#xff0c;我們經常無可避免的需要獲取或者監聽一些頁面的屬性&#xff0c;那么我們需要經常了解一些屬性代表的含義才能更好地使用這些屬性。特別是一下這些&#xff1a;尺寸相關&#xff1a;offsetHeight、clientHeight、scrollHeight…