awk大法

awk


awk概念

一款用于數據流的文本處理工具,它將文件作為記錄序列處理。在一般情況下,文件內容的每行都是一個記錄。每行內容都會被分割成一系列的域,因此,我們可以認為一行的第一個詞為第一個域,第二個詞為第二個,以此類推。AWK程序是由一些處理特定模式的語句塊構成的。AWK一次可以讀取一個輸入行。對每個輸入行,AWK解釋器會判斷它是否符合程序中出現的各個模式,并執行符合的模式所對應的動作。

它頗有玩頭的原因,就在于可以對列和行進行操作。awk也有很多內建功能,比如數組、函數等,這是它和C語言的相同之處。靈活性是awk最大的優勢。

awk語法

program: PATTERN{ACTION STATEMENTS}
    語句之間用分號分隔
    print, printf
選項:
    -F:指明輸入時用到的字段分隔符;
    -v var=value: 自定義變量;

由例子引入:

awk大法

由上面可以看到:基本用法是

awk 'BEGIN{ print "start" }{ print }END{ print "END" }'

awk也可以從stdin(標準輸入中讀取)

三部分:BEGIN,END,和帶模式匹配選項的常見語句塊,都可以省略。

然后來談談awk的工作原理:

1、執行BEGIN{ commands }語句塊中的語句

2、從文件或stdin中讀取一行,然后執行pattern{ commands }。從復這個過程,直到文件全部被讀取完畢。

3、當讀至輸入流末尾時,執行END{ commands }語句塊。

總結,BEGIN\END語句塊,在輸入流之前和之后被執行,一般用于在開頭和結尾加點什么東西。最重要的部分是pattern語句塊中的通用命令。如果不提供該語句塊,則默認執行{ print },即打印所讀取到的每一行。

print

print item1, item2, ...
要點:
(1) 逗號分隔符;
(2) 輸出的各 item 可以字符串,也可以是數值;當前記錄的字段、變量或 awk 的表達
式;
(3) 如省略 item,相當于 print $0;

1、打印后五行的第二和第四字段

awk大法

2、在字段前后加上字符和數字

awk大法

變量

內建變量:最常用的是FS

FS:input field seperator,默認為空白字符;
OFS:output field seperator,默認為空白字符;
RS:input record seperator,輸入時的換行符;
ORS:output record seperator,輸出時的換行符;
NF:number of field,字段數量
{print NF}, {print $NF}
NR:number of record, 行數;
FNR:各文件分別計數;行數;
FILENAME:當前文件名;
ARGC:命令行參數的個數;
ARGV:數組,保存的是命令行所給定的各參數;


自定義變量

(1) -v var=value
變量名區分字符大小寫;
(2) 在 program 中直接定義

1、打印/etc/passwd中的第一個字段

awk大法

2、使用-F:與 -v FS=':'一樣

awk大法

3、打印/etc/passwd 中的第1,3,7字段,并以:隔開打印

awk大法

awk大法

4、顯示每一行有多少個字段

awk大法

printf 命令

格式化輸出:printf FORMAT, item1, item2, ...
(1) FORMAT 必須給出;
(2) 不會自動換行,需要顯式給出換行控制符,\n
(3) FORMAT 中需要分別為后面的每個 item 指定一個格式化符號;
格式符:
    %c: 顯示字符的 ASCII 碼;
    %d, %i: 顯示十進制整數;
    %e, %E: 科學計數法數值顯示;
    %f:顯示為浮點數;
    %g, %G:以科學計數法或浮點形式顯示數值;
    %s:顯示字符串;
    %u:無符號整數;
    %%: 顯示%自身;
修飾符:
    #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度;
    %3.1f
    -: 左對齊
    +:顯示數值的符號

1、以字符串形式顯示

awk大法

2、以字符串輸出username,以十進制形式輸出UID

awk大法

3、打印用戶UID大于1000的輸出普通用戶,否則是系統用戶或者管理員。

awk大法

4、打印UID大于1000用戶的第一和第三字段

awk大法

5、打印以UUID開頭的行的第一個字段

awk大法

6、找出“/bin/bash”的的行

awk大法

7、找出以root開頭到以ftp開頭的行,打印出來第一個字段

awk大法

awk最有意思的地方是:我覺得它是在抄c語言的

暫且把awk當做萬能的吧,由于知識水平的限制,我不知道它內部不能用什么。就知道它可以用數組,可以用函數,可以用控制語句。姑且認為這個作者是個抄家吧,那下面看看哪里抄了。

1、算術操作符:(抄一點,bash腳本有let、bc、[ ]等等)

x+y, x-y, x*y, x/y, x^y, x%y
-x
+x: 轉換為數值;

2、字符串操作符:

沒有符號的操作符,字符串連接

bash:==,>,<,!=,=~--->是否等于,大于,小于,不等于

3、賦值操作符:(算你沒抄)

=,+=,-=,*=,/=,%=,^=,++,--

4、比較操作符:(全抄)

>,>=,<,<=,!=,==


bash:-gt -ge -lt -le -eq -ne

5、模式匹配符:(還不知道什么意思)

~:是否匹配
!~:是否不匹配

6、邏輯操作符:(沒抄)

&&
||
!

7、函數調用:

function_name(argu1,argu2,……)

8、條件表達式:

selector?if-true-expression:if-false-expression

C語言也是這樣

# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or
SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

PATTERN

(1) empty:空模式,匹配每一行;
(2) /regular expression/:僅處理能夠被此處的模式匹配到的行;
(3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;真:結果為非 0 值,非空字符串;
(4) line ranges:行范圍,

    startline,endline:/pat1/,/pat2/
    注意: 不支持直接給出數字的格式
    ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END 模式

    BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
    END{}:僅在文本處理完成之后執行一次;

控制語句

if(condition) {statments}
if(condition) {statments} else {statements}
while(conditon) {statments}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }

if-else

1、用if else來轉換條件表達式select

awk大法

2、找到shell類型是bash的用戶并打印出來

awk大法

3、找到字段數大于5的行并打印

awk大法

awk大法

4、找到磁盤應用(use)顯示比例大于80%的話,怎么顯示出來?

先以%為分割符分割 awk大法再取最后一個字段

awk大法

僅顯示以DEV條件開頭的行

awk大法

找出最后一個字段值大于20的

awk大法


while循環

使用場景:對一行內的多個字段逐一進行處理,對數組中的各元素逐一使用。

取出linux16開頭的行,并且對每一行的每個字段分別去統計字符的個數

awk大法

只顯示大于等于7的。多加一個if。(類似于編腳本)

awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7){print $i,length($i)}; i++}}' /etc/grub2.cfg

awk大法

for循環(與bash差不多)

語法:for(expr1;expr2;expr3) statement
for(variable assignment;condition;iteration process) {for-body}

~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print$i,length($i)}}' /etc/grub2.cfg

特殊用法:
能夠遍歷數組中的元素;
語法:for(var in array) {for-body}

next

提前結束對本行的處理而直接進入下一行;
~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

暫且整理到這里,后面還有數組array+函數,暫時啃不懂,上面的熟悉掌握了,再補充。

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

(0)
N24_yeziN24_yezi
上一篇 2016-12-04 14:46
下一篇 2016-12-04 15:42

相關推薦

  • 密碼保護:第二天

    無法提供摘要。這是一篇受保護的文章。

    Linux干貨 2017-07-15
  • 第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。         使用到的命令:w或who、cut、sort、uniq          &nbsp…

    Linux干貨 2017-02-02
  • 文本處理三劍客之grep及正則表達式

    文本處理三劍客之grep及正則表達式   文本處理工具:   Linux上處理文本三劍客:     Grep:文本過濾器工具(模式:pattern)工具;     Sed: stream editor,流編輯器;文本編輯工具;   &nbs…

    Linux干貨 2016-08-12
  • linux初期了解

    計算機的組成及其功能 計算機有運算器,控制器,存儲器,輸出設備和輸入設備組成: 1.運算器:運算器又稱算術邏輯單元(Arithmetic Logic Unit簡稱ALU)。它是計算機對數據進行加工處理的部件,包括算術運算2.控制器:控制器負責從存儲器中取出指令,并對指令進行譯碼 3.存儲器:存儲器是計算機記憶或暫存數據的部件。 4.輸入設備:輸入設備是給計算…

    Linux干貨 2016-10-30
  • iptables

    iptables Firewall:防火墻 隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件; 分類: 硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現; 軟件防火墻:應用軟件處理邏輯運行于通用…

    Linux干貨 2016-11-07
  • iptables詳解

    iptables命令: iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specificatio…

    Linux干貨 2017-11-12

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-12-07 23:42

    總結的很好,有圖有真相,有理解!!!!

欧美性久久久久