天天一個 Linux 命令(4):awk

圖片

推薦:天天一個 Linux 命令(3):sedlinux

命令簡介

Awk  pattern scanning and processing language,對文本和數據進行處理。正則表達式

awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸(stdin)、一個或多個文件,或其它命令的輸出。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。編程

語法格式

awk [options] 'scripts' var=value filename

經常使用參數

-F 指定分隔符(能夠是字符串或正則表達式)
-f 從腳本文件中讀取awk命令
-v var=value 賦值變量,將外部變量傳遞給awk

腳本基本結構

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename

一個awk腳本一般由BEGIN語句+模式匹配+END語句三部分組成,這三部分都是可選項.數組

工做原理:app

  • 第一步執行BEGIN 語句
  • 第二步從文件或標準輸入讀取一行,而後再執行pattern語句,逐行掃描文件到文件所有被讀取
  • 第三步執行END語句

實例展現:編程語言

echo "hello " | awk 'BEGIN{ print "welcome" } END{ print "2017-08-08" }'
welcome
2017-08-08
echo -e "hello" | awk 'BEGIN{ print "welcome" } {print} END{ print "2017-08-08" }'
welcome
hello
2017-08-08
#不加print參數時默認只打印當前的行
echo|awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }'
hello nihao mingongge
#使用print以逗號分隔時,打印則是以空格分界
echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }'
mgg is mingg or mingongge
#awk的print語句中雙引號其實就是個拼接做用

Awk的變量

內置變量函數

$0   #當前記錄
$1~$n #當前記錄的第N個字段
FS   #輸入字段分隔符(-F相同做用)默認空格
RS   #輸入記錄分割符,默認換行符
NF   #字段個數就是列 
NR   #記錄數,就是行號,默認從1開始
OFS  #輸出字段分隔符,默認空格
ORS  #輸出記錄分割符,默認換行符

外部變量spa

[mingongge@ ~]#a=100
[mingongge@ ~]#b=100
[mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b
10000

Awk運算與判斷

算術運算符命令行

+ - 加減
* / & 乘 除 求餘
^ *  求冪
++ -- 增長或減小,做爲前綴或後綴
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}'
b 0 1 1
[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}'
0 0 1 1
[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}'
0 0 0 1
#和其它編程語言同樣,全部用做算術運算符進行操做,操做數自動轉爲數值,全部非數值都變爲0

賦值運算符unix

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

正則運算符

~ !~  匹配正則表達式/不匹配正則表達式

邏輯運算符

||  &&  邏輯或  邏輯與

關係運算符

< <= > >= != =

其它運算符

$   字段引用 
空格 字符串連接符
?:   三目運算符
ln   數組中是否存在某鍵值

Awk正則

^    行首定位符
$    行尾定位符
.    匹配任意單個字符
*    匹配0個或多個前導字符(包括回車)
+    匹配1個或多個前導字符
?    匹配0個或1個前導字符 
[]   匹配指定字符組內的任意一個字符/^[ab]
[^]  匹配不在指定字符組內的任意一個字符
()   子表達式
|    或者
    轉義符
~,!~ 匹配或不匹配的條件語句
x{m} x字符重複m次
x{m,} x字符至少重複m次
X{m,n} x字符至少重複m次但不起過n次(需指定參數-posix或--re-interval)

Awk實例介紹

awk –F : ‘{print $2}’ datafile
#以:分隔打印第二列
awk –F : ‘/^Dan/{print $2}’ datafile
#以:分隔打印以Dan開頭行的第二列內容
awk –F : ‘/^[CE]/{print $1}’ datafile 
#打印以C或E開頭行的第一列
awk –F : ‘{if(length($1) == 4) print $1}’ datafile 
#打印以:分隔且長度爲4字符的第一列內容
awk –F : ‘/[916]/{print $1}’ datafile
#匹配916的行以:分隔打印第一列
awk -F : '/^Vinh/{print "a"$5}' 2.txt
#顯示以Dan開頭行並在第五列前加上a
awk –F : ‘{print $2」,」$1}’  datafile
#打印第二列第一列並以,分隔
awk -F : '($5 == 68900) {print $1}' 2.txt
#以:分隔打印第五列是68900的行第一列 
awk -F : '{if(length($1) == 11) print $1}' 2.txt
#打印以:分隔且長度爲4字符的第一列內容
awk -F : '$1~/Tommy Savage/ {print $5}' 2.txt
awk -F : '($1 == "Tommy Savage") {print $5}' 2.txt
#打印以:分隔且第一列爲Tommy Savage的第五列內容
ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
#統計目錄個的文件全部的字節數
awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}' 
#以M爲單位顯示目錄下的全部字節數
awk 'BEGIN{a=10;a+=10;print a}'
20 
#a+10等價於 a=a+10
echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}' 
#正則匹配a 是否有test字符,成立打印ok
awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err
#三目運算符?:
awk '/root/{print $0}' passwd 
#匹配全部包含root的行
awk -F: '$5~/root/{print $0}' passwd 
# 以分號做爲分隔符,匹配第5個字段是root的行
ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'
#打印IP地址
awk '{print toupper($0)}' test.txt
#toupper是awk內置函數,將所小寫字母轉換成大寫

天天一個 Linux 命令(1):xargs

天天一個 Linux 命令(2):od

image

相關文章
相關標籤/搜索