awk基礎linux
print的使用格式:正則表達式
print item1,item2, ….express
要點:vim
各項目本身使用逗號隔開,而輸出時則以空白字符分隔;數組
輸出的item能夠爲字符串或者數值,當前記錄的字段(如$1)、變量或者awk的表達式;數值會先轉換爲字符串,然後再輸出;bash
print的命令後面的item能夠省略,此時其功能至關於print $0,所以,若是想輸出空白行,則須要使用print 「」;tcp
例子:函數
# awk ‘BEGIN {print 「line one\nline two\nline three」}’url
awk –F: ‘{print $1,$2}’ /etc/passwdspa
內置變量:
ORS(output record sepatator) (輸出換行符)
OFS(output field separator) (輸出分隔符)
FS: field separator,默認是空白字符;(輸入文件分隔符)
RS:Record separator,默認是換行字符;(輸入文件換行符)
NR:The number of input records,awk命令所處理記錄數:若是有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Number of Field,當前記錄的field個數;
FNR:與NR不一樣的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV:數組,保存命令行自己這個字符串,如awk’{print $0}’ a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC:awk命令的參數的個數;
print命令的使用格式:
printf format,item1,item2,….
要點:
與其print命令的最大不一樣是,printf須要指定format;
format用於指定後面的每一個item的輸出格式;
printf語句不會自動打印換行符;
format 格式的指示符都以%開頭,後跟一個字符;以下:
%c:顯示字符的ASCII碼:
%d,%i: 十進制整數:
%e,%E:科學計數法顯示數值;
%f:顯示浮點數;
%g,%G:以科學計數法的格式或浮點數的格式顯示數值;
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
修飾符:
N:顯示寬度;
-:作對齊
+:顯示數值符號
例子:
#awk –F: ‘{printf 「%-15s %\n」,$1,$3 }’ /ect/passwd
print items > output-file
print items >> output-file
特殊文件描述符:
/dev/stdin:標準輸入
/dev/stdout:標準輸出
/dev/stderr:錯誤輸出
/dev/df/N:某特定文件描述符,如/dev/stdin 就至關於/dev/fd/0;
例子
awk –F: ‘{printf 「%-15s %i\n」,$1,$3 > 「/dev/stderr」}’ /etc/passwd
awk 的使用格式:
awk [options] ‘script’ file1,file2,….
awk [options] ‘PATTERN {action}’ file1,file2, ….
-F :
1、算術操做符:
-x:負值
+x:轉換爲數值
x^y:
x**y:次方
x*y:
x+y:
x-y:
x%y:
2、字符串操做符:
只有一個,並且不用寫出來,用於實現字符串鏈接:
3、賦值操做符:
=、+=、-=、*=、/=、%=、^=、**=
++、--
須要注意的是,若是某模式爲=號,此時使用/=/可能會有語法錯誤,應該爲/[=]/代替
4、布爾值
awk中,任何非0值或非空字符串都爲真,反之就爲假;
5、比較操做符:
x < y 、x <=y、 x > y、 x >= y、 x == y、x != y、x ~ y、x !~ y
6、表達式間的邏輯關係:
&& 、||
7、條件表達式
selector?if-true-exp:if-false-exp
$A > $B ? echo $A:echo $B
8、行數調用
function_name (para1,para2)
9、awk的模式:
awk ‘program’ input-file1 input-file2 ….
其中的program爲:
pattern { action }
pattern { action }
….
常見的模式類型:
Regexp:正則表達式,格式爲/regular expression/
expression:表達式,其中值非0或爲空字符時知足條件,如:$1 ~/foo/ 或 $1==」magedu」,用運算符~(匹配)和~!(不匹配)
Ranges:指定的匹配範圍,格式爲pat1,pat2
BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
Empty(空模式):匹配任意輸入行;
常見的Action有:
Expressions
Control statements
Compound statements
Input statements
Output statements
/正則表達式/:使用通配符的擴展集
關係表達式:能夠用下面運算符表中的關係符進行操做,能夠是字符串或者數值的比較多,如$2 > $1 選擇第二個字段比第一個字段長的行。
awk –F: ‘$3 >= 500 {print $1}’ /ect/passwd
awk –F: ‘$3 >= 500 {print $1,$3}’ /ect/passwd
awk –F: ‘$3 >= 500 {printf 「%-15s%s\n」,$1,$3}’ /ect/passwd
awk –F: ‘$3 >= 500 {print 「Username UID」;printf 「%-15s%s」,$1,$3}’ /ect/passwd
模式匹配表達式:
模式,模式:指定一個行的範圍,該語法不能包括BEGIN和END模式
BEGIN:讓用戶指定在第一條輸入記錄被處理以前說發生的動做,一般可在這裏設置全局變量。
END:讓用戶在最後一條輸入記錄被讀取以後發生的動做
awk –F: ‘BEGIN {print 「Username UID」}{printf 「%-15s%s」,$1,$3}’ /ect/passwd
awk –F: ‘BEGIN {print 「Username UID」}{printf 「%-15s%s」,$1,$3}END{print 「Over}’ /ect/passwd
awk ‘BEGIN {print 「a」 「b」}’
awk –v FS=: ‘{print $1}’ /etc/passwd
awk ‘BEGIN{FS=」:」}{print $1}’ /ect/passwd
例子:
vim a.txt
welcome to redhat linux.
how are you?
awk ‘{print $1}’ a.txt
df –h
df –h |awk ‘{print $1}’
df –hP |awk ‘{print $1}’
awk ‘{print $1}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $1,$7}’ /etc/passwd
awk –F: ‘{print $NF}’ /etc/passwd
awk ‘{print $NF}’ a.txt
awk –v FS=: ‘{print $NF}’ /etc/passwd
awk ‘{print $1 $2}’ a.txt
awk ‘{print $1,$2}’ a.txt
awk -v OFS=: ’{print $1,$2}’ a.txt
awk ‘{printf 「%-10s,%s\n」,$1,$2}’ a.txt
awk ‘{printf 「%-10s%s\n」,$1,$2}’ a.txt
awk ‘BEGIN{print 「a」 「b」}’
awk –F: ‘$1 ~ /^root/{print $3,$4,$NF}’ /ect/passwd
awk –F: ‘$1 !~ /^root/{print $3,$4,$NF}’ /ect/passwd
awk –F: ‘/bash/{print $0}’ /etc/passwd
awk –F: ‘/bash/{print $1}’ /etc/passwd
控制語句
if-else
語法:if(condition) (then-body) else{[ else-body]}
例子:
awk –F: ‘{if ($1==」root」) print $1, 「admin」;else print $1,」Common User」}’ /ect/passwd
awk –F: ‘{if($1==」root」) printf 「%-15s:%s\n」,$1,」Admin」;else printf 「%-15s:%s\n」,$1, 「Common User」}’ /ect/passwd
awk –F: -v sum=0 ‘{if ($3 >= 500) sum ++}END {print sum}’ /ect/passwd
while
語法:while (condition) {statements1;statements2;……}
awk –F: ‘{i=1;while (I <= 3) {print $1;i++}}’ /ect/passwd
awk –F: ‘ $1!~/root/ {i=1;while (i <= 4) {print $1;i++}}’ /ect/passwd
awk –F: ‘ $1!~/root/ {i=1;while (i <= NF) {print $1;i+=2}}’ /ect/passwd
awk –F: ‘ $1!~/root/ {i=2;while (i <= NF) {print $1;i+=2}}’ /ect/passwd
do-while
語法: do {statements1;statements2;……} while (condition)
awk –F: ‘{i=1; do {print $i;i++} while (i <=3) }’ /etc/passwd
for
語法:for (variable assignment;condition; iteration process ) { statements1;statements2;…}
awk –F: ‘{for (i=1;i<=3;i++) print $1}’ /ect/passwd
awk –F: ‘{for (i=1;i<=NF;i+=2) print $i}’ /ect/passwd
for循環還能夠用來遍歷數組元素:
語法:for (i in array ) {statements1;statements2;……}
awk –F: ‘$NF!~/^$/{BASH[$NF]++}END{for (A in BASH) {printf 「%15s:%i\n」,A,BASH[A]}}’ /ect/passwd
case
語法:seitch (expression) {case VALUE or /ERGEXP/: statements1;statements2;…default statements0 }
break和continue
經常使用於循環或case語句中
next
提早結束對本行文本的處理,並接着處理下一行
awk 內置變量:
FS: field separator,默認是空白字符;
RS:Record separator,默認是換行字符;
NR:The number of input records,awk命令所處理記錄數:若是有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Number of Field,當前記錄的field個數;
FNR:與NR不一樣的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV:數組,保存命令行自己這個字符串,如awk’{print $0}’ a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC:awk命令的參數的個數;
for I in {0 .. 10}
print A[$i]
for (A in ARRAY) {print ARRAY[A]}
awk ‘BEGIN {A[「m」]=」hello」;A[「n」]=」world」;for (B in A) print A[B]}’
awk 中使用數組
array[index-expression]
index-expression 可使用任意字符串,須要注意的是,若是某數據組元素事項不存在,那麼在應用其時,awk會自動建立此元素並初始化爲空串;所以,要判斷某數據組中是否存在某元素,須要使用index in array的方式。
要遍歷數組中的每個元素,須要使用以下的特殊結構:
for (var in array) {statement1,…}
其中,var用於引用數組下標。
例子:
netstat –n|awk ‘/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]}’
netstat –ant |grep 「LISTEN」 |wc –l
netstat –ant | awk ‘$1 ~/tcp/{S[$NF]++}END{for (A in S) print A,S[A]}’
netstat –ant | awk ‘$1 ~/tcp/{S[$NF]++}END{for (A in S) printf 「%10s:%s\n」, A,S[A]}’
awk –F: ‘$NF!~/^$/ {SHELL[$NF]++}END{for (A in SHELL) print A,SHELL[A]}’ /etc/passwd
awk ‘{IP [$1]++}END{for (A in IP) print A,IP[A]}’ /usr/local/apach/logs/access_log
每出現一被/^tcp/模式匹配到的行,數組S[$NF]就加一,NF爲當前匹配的行的最後一個字段,此處用其值做爲數組S的元素索引;
awk ‘{count[$1]++};END {for (url in counts) print counts[url],url}’ /var/log/httpd/access_log
用法與上一個例子相同,用於統計日誌文件中IP地址的訪問量
awk ‘BEGIN{A[x]=」hello」;A[y]=」world」;print A[x],A[y]}’
awk的內置函數
split (string, array [,fieldsep [,seps]])
功能:將string表示的字符串以filedsep爲分隔符進行分割,並將分隔後的結果保存至array爲名的數組中
netstat –ant | awk ‘/:80/ {split($5,clients,」:」);IP[client[1]]++}END {for (i in IP) {print IP[i],i}}’|sort –rn |head -50
將netstat 查詢結果的第五列開始以:爲分隔符開始切割,切割的結果保存在client數組中,並累計。
length([string])
功能:返回string字符串中字符的個數
substr (string ,start[, length])
功能:取string字符串中的子串,從start開始,取length個,start從1開始計數;
system(command)
功能:執行系統command並將結果訪問至awk命令
systime()
功能:取系統當前時間
awk [options] ‘PATTERN{cation}’ input_file