Linux三劍客awk命令

1 .awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。 awk其名稱得自于它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。 2.

 awk '{pattern + action}' {filenames}

盡管操作可能會很復雜,但語法總是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令?;ɡㄌ枺▄})不需要在程序中始終出現,但它們用于根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜杠括起來。 awk語言的最基本功能是在文件或者字符串中基于指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。 通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執行相應的命令,來處理文本。 3.   有三種方式調用awk  

 3.1.命令行方式 awk [-F  field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。
 3.2.shell腳本方式
將所有的awk命令插入一個文件,并使awk程序可執行,然后awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。
相當于shell腳本首行的:#!/bin/sh 可以換成:#!/bin/awk
 3.3.將所有的awk命令插入一個單獨文件,然后調用: awk -f awk-script-file input-file(s)
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。

 
  4. print 和 printf awk中同時提供了print和printf兩種打印輸出的函數。   其中print函數的參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。 printf函數,其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。 5.循環 awk中的循環語句同樣借鑒于C語言,支持while、do/while、for、break、continue,這些關鍵字的語義和C語言中的語義完全相同。 6.數組 因為awk中數組的下標可以是數字和字母,數組的下標通常被稱為關鍵字(key)。值和關鍵字都存儲在內部的一張針對key/value應用hash的表格里。由于hash不是順序存儲,因此在顯示數組內容時會發現,它們并不是按照你預料的順序顯示出來的。數組和變量一樣,都是在使用時自動創建的,awk也同樣會自動判斷其存儲的是數字還是字符串。一般而言,awk中的數組用來從記錄中收集信息,可以用于計算總和、統計單詞以及跟蹤模板被匹配的次數等等。   顯示/etc/passwd的賬戶  

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd 0 root 1 daemon 2 bin 3 sys 4 sync 5 games
......

7.列出一些常見的awk命令:
 

  1. #刪除temp文件的重復行
  2. awk ‘!($0 in array) { array[$0]; print }’ temp
  3. #查看最長使用的10個unix命令
  4. awk ‘{print $1}’ ~/.bash_history | sort | uniq -c | sort -rn | head -n 10
  5. #查看機器的ip列表
  6. ifconfig -a | awk ‘/Bcast/{print $2}’ | cut -c 5-19
  7. #查看機器的每個遠程鏈接機器的連接數
  8. netstat -antu | awk ‘$5 ~ /[0-9]:/{split($5, a, “:”); ips[a[1]]++} END {for (ip in ips) print ips[ip], ip | “sort -k1 -nr”}’
  9. #查看某個進程打開的socket數量
  10. ps aux | grep [process] | awk ‘{print $2}’ | xargs -I % ls /proc/%/fd | wc -l
  11. #查看無線網絡的ip
  12. sudo ifconfig wlan0 | grep inet | awk ‘NR==1 {print $2}’ | cut -c 6-
  13. #批量重命名文件
  14. find . -name ‘*.jpg’ | awk ‘BEGIN{ a=0 }{ printf “mv %s name%01d.jpg\n”, $0, a++ }’ | bash
  15. #查看某個用戶打開的文件句柄列表
  16. for x in `ps -u 500 u | grep java | awk ‘{ print $2 }’`;do ls /proc/$x/fd|wc -l;done
  17. #計算文件temp的第一列的值的和
  18. awk ‘{s+=$1}END{print s}’ temp
  19. #查看最常用的命令和使用次數
  20. history | awk ‘{if ($2 == “sudo”) a[$3]++; else a[$2]++}END{for(i in a){print a[i] ” ” i}}’ |  sort -rn | head
  21. #查找某個時間戳的文件列表
  22. cp -p `ls -l | awk ‘/Apr 14/ {print $NF}’` /usr/users/backup_dir
  23. #格式化輸出當前的進程信息
  24. ps -ef | awk -v OFS=“\n” ‘{ for (i=8;i<=NF;i++) line = (line ? line FS : “”) $i; print NR “:”, $1, $2, $7, line, “”; line = “” }’
  25. #查看輸入數據的特定位置的單個字符
  26. echo “abcdefg”|awk ‘BEGIN {FS=“””} {print $2}’
  27. #打印行號
  28. ls | awk ‘{print NR “\t” $0}’
  29. #打印當前的ssh 客戶端
  30. netstat -tn | awk ‘($4 ~ /:22\s*/) && ($6 ~ /^EST/) {print substr($5, 0, index($5,”:”))}’
  31. #打印文件第一列不同值的行
  32. awk ‘!array[$1]++’ file.txt
  33. #打印第二列唯一值
  34. awk ‘{ a[$2]++ } END { for (b in a) { print b } }’ file
  35. #查看系統所有分區
  36. awk ‘{if ($NF ~ “^[a-zA-Z].*[0-9]$” && $NF !~ “c[0-9]+d[0-9]+$” && $NF !~ “^loop.*”) print “/dev/”$NF}’  /proc/partitions
  37. #查看2到100所有質數
  38. for num in `seq 2 100`;do if [ `factor $num|awk ‘{print $2}’` == $num ];then echo -n “$num “;fi done;echo
  39. #查看第3到第6行
  40. awk ‘NR >= 3 && NR <= 6′ /path/to/file
  41. #逆序查看文件
  42. awk ‘{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j–] }’
  43. #打印99乘法表
  44. seq 9 | sed ‘H;g’ | awk -v RS= ‘{for(i=1;i<=NF;i++)printf(“%dx%d=%d%s”, i, NR, i*NR, i==NR?”\n”:”\t”)}’

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

原創文章,作者:oranix,如若轉載,請注明出處:http://www.www58058.com/86407

(2)
oranixoranix
上一篇 2017-09-07 21:06
下一篇 2017-09-08 17:27

相關推薦

  • Homework Week-7 RAID及bash編程

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;    (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; fdisk /dev/sda n …

    Linux干貨 2016-09-26
  • 循環結構

    循環結構 循環執行:     講一段代碼重復執行一次或多次          進入條件:條件滿足時進入循環     退出條件:每一個循環都應該有退出條件,以有機會退出循環;   &…

    Linux干貨 2016-08-21
  • Function函數實例

    函數:function     把一段獨立功能的代碼當做一個整體,而后為之取一個名字,命令的代碼段,即為函數。 注意:     定義函數的代碼段不會自動執行,在調用時執行;所謂調用函數,在代碼中給定函數名即可     函數名出現的任何位置,…

    Linux干貨 2016-08-21
  • 在馬幫的宣言

    好好學習,在這半年時間讓自己的道路上再邁出一大步

    Linux干貨 2016-10-28
  • 8-2 用戶組和權限管理

    用戶組和權限管理     本節主要是:su、passwd、chage、chown、chgrp、chmod、umask等命令及文件的三種普通權限和三種特殊權限     切換用戶或以其他用戶身份執行命令:su su [options…] [-] [user[args…]] 切換用…

    Linux干貨 2016-08-07
  • lvs nat模型調度雙http服務且http上布置discuz

    實驗的拓撲圖: 實驗方案: 我們先在real server上編譯安裝好http,然后,咋們切換到mysql服務器上安裝mysql,在換到http主機上編譯php的工作方式基于模塊的,再把discuz資源放到http的資源訪問目錄下,且在雙方http主機上布上rsync服務器,雙反的主機也要加上inotify來實時關注http訪問目錄的資源變化,有變化就要數據…

    Linux干貨 2015-10-22

評論列表(2條)

  • eedsxb
    eedsxb 2017-09-08 19:52

    小胖子。

  • eedsxb
    eedsxb 2017-09-08 19:52

    有用!

欧美性久久久久