linux awk命令總結

linux awk命令總結

簡介:

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

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

如果只是顯示/etc/passwd的賬戶

#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys

這種是awk+action的示例,每行都會執行action{print $1}。

-F指定域分隔符爲':'。

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割


#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/shbin     
bin     /bin/sh
sys     /bin/sh

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

name,shell

root,/bin/bash

daemon,/bin/sh

bin,/bin/sh

sys,/bin/sh

....

blue,/bin/nosh

awk工作流程是這樣的:先執行BEGING,然後讀取文件,讀入有/n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動作action。接着開始讀入第二條記錄······直到所有的記錄都讀完,最後執行END操作。

搜索/etc/passwd有root關鍵字的所有行


#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

搜索支持正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd

搜索/etc/passwd有root關鍵字的所有行,並顯示對應的shell


# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash

特殊要點:

$0               表示整個當前行

$1               每行第一個字段

$1-$n          當前記錄的第N個字段

NF              字段數量變量

NR              每行的記錄號,多文件記錄遞增

FNR            與NR類似,不過多文件記錄不遞增,每個文件都從1開始

\t                製表符

\n               換行符

FS              BEGIN時定義分隔符

RS               輸入的記錄分隔符, 默認爲換行符(即文本是按一行一行輸入)

~                匹配,與==相比不是精確比較

!~               不匹配,不精確比較

==             等於,必須全部相等,精確比較

!=               不等於,精確比較

&&          邏輯與

||                 邏輯或

+                匹配時表示1個或1個以上

/[0-9][0-9]+/   兩個或兩個以上數字

/[0-9][0-9]*/    一個或一個以上數字

FILENAME 文件名

OFS      輸出字段分隔符, 默認也是空格,可以改爲製表符等

ORS        輸出的記錄分隔符,默認爲換行符,即處理結果也是一行一行輸出到屏幕

-F'[:#/]'   定義三個分隔符

-F指定分隔符

$1 指指定分隔符後,第一個字段,$3第三個字段, \t是製表符

一個或多個連續的空格或製表符看做一個定界符,即多個空格看做一個空格

awk -F":" '{print $1}'  /etc/passwd

awk -F":" '{print $1 $3}'  /etc/passwd                       //$1與$3相連輸出,不分隔

awk -F":" '{print $1,$3}'  /etc/passwd                       //多了一個逗號,$1與$3使用空格分隔

awk -F":" '{print $1 " " $3}'  /etc/passwd                  //$1與$3之間手動添加空格分隔

awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd       //自定義輸出  

awk -F: '{print NF}' /etc/passwd                                //顯示每行有多少字段

awk -F: '{print $NF}' /etc/passwd                              //將每行第NF個字段的值打印出來

 awk -F: 'NF==4 {print }' /etc/passwd                       //顯示只有4個字段的行

awk -F: 'NF>2{print $0}' /etc/passwd                       //顯示每行字段數量大於2的行

awk '{print NR,$0}' /etc/passwd                                 //輸出每行的行號

awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //依次打印行號,字段數,最後字段值,製表符,每行內容

awk -F: 'NR==5{print}'  /etc/passwd                         //顯示第5行

awk -F: 'NR==5 || NR==6{print}'  /etc/passwd       //顯示第5行和第6行

route -n|awk 'NR!=1{print}'                                       //不顯示第一行

//匹配代碼塊

//純字符匹配   !//純字符不匹配   ~//字段值匹配    !~//字段值不匹配   ~/a1|a2/字段值匹配a1或a2 

awk '/mysql/' /etc/passwd

awk '/mysql/{print }' /etc/passwd

awk '/mysql/{print $0}' /etc/passwd                   //三條指令結果一樣

awk '!/mysql/{print $0}' /etc/passwd                  //輸出不匹配mysql的行

awk '/mysql|mail/{print}' /etc/passwd

awk '!/mysql|mail/{print}' /etc/passwd

awk -F: '/mail/,/mysql/{print}' /etc/passwd         //區間匹配

awk '/[2][7][7]*/{print $0}' /etc/passwd               //匹配包含27爲數字開頭的行,如27,277,2777...

awk -F: '$1~/mail/{print $1}' /etc/passwd           //$1匹配指定內容才顯示

awk -F: '{if($1~/mail/) print $1}' /etc/passwd     //與上面相同

awk -F: '$1!~/mail/{print $1}' /etc/passwd          //不匹配

awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd    

IF語句

必須用在{}中,且比較內容用()擴起來

awk -F: '{if($1~/mail/) print $1}' /etc/passwd                                       //簡寫

awk -F: '{if($1~/mail/) {print $1}}'  /etc/passwd                                   //全寫

awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd            //if...else...

邏輯運算符

&& || 

awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd         //邏輯與,$1匹配mail,並且$3>8

awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd

awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //邏輯或

awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章