awk基礎 [馬哥視頻]

awk基礎linux

1.1 print

print的使用格式:正則表達式

print item1,item2, ….express

要點:vim

  1. 各項目本身使用逗號隔開,而輸出時則以空白字符分隔;數組

  2. 輸出的item能夠爲字符串或者數值,當前記錄的字段($1)、變量或者awk的表達式;數值會先轉換爲字符串,然後再輸出;bash

  3. 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 recordsawk命令所處理記錄數:若是有多個文件,這個數目會把處理的多個文件中行統一計數;

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命令的參數的個數;

1.2 printf

print命令的使用格式:

printf format,item1,item2,….

要點:

  1. 與其print命令的最大不一樣是,printf須要指定format

  2. format用於指定後面的每一個item的輸出格式;

  3. printf語句不會自動打印換行符;


format 格式的指示符都以%開頭,後跟一個字符;以下:

%c:顯示字符的ASCII碼:

%d,%i: 十進制整數:

%e,%E:科學計數法顯示數值;

%f:顯示浮點數;

%g,%G:以科學計數法的格式或浮點數的格式顯示數值;

%s:顯示字符串

%u:無符號整數

%%:顯示%自身


修飾符:

N:顯示寬度;

-:作對齊

+:顯示數值符號


例子:

#awk –F: ‘{printf 「%-15s %\n」,$1,$3 }’ /ect/passwd

1.3輸出重定向

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

1.4 awk

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 <=yx > yx >= yx == yx != yx ~ yx !~ y

6、表達式間的邏輯關係:

&& ||

7、條件表達式

selector?if-true-exp:if-false-exp

$A > $B ? echo $A:echo $B

8、行數調用

function_name (para1,para2)


9awk的模式:

awk ‘program’ input-file1 input-file2 ….

其中的program爲:

pattern { action }

pattern { action }

.

常見的模式類型:

  1. Regexp:正則表達式,格式爲/regular expression/

  2. expression:表達式,其中值非0或爲空字符時知足條件,如:$1 ~/foo/ $1==」magedu」,用運算符~(匹配)~(不匹配)

  3. Ranges:指定的匹配範圍,格式爲pat1,pat2

  4. BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次

  5. Empty(空模式):匹配任意輸入行;


常見的Action有:

  1. Expressions

  2. Control statements

  3. Compound statements

  4. Input statements

  5. 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


模式匹配表達式:

模式,模式:指定一個行的範圍,該語法不能包括BEGINEND模式

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


控制語句

  1. 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


  1. 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


  1. do-while

語法: do {statements1;statements2;……} while (condition)

awk –F: ‘{i=1; do {print $i;i++} while (i <=3) }’ /etc/passwd

  1. 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

  1. case

語法:seitch (expression) {case VALUE or /ERGEXP/: statements1;statements2;…default statements0 }

  1. breakcontinue

經常使用於循環或case語句中

  1. next

提早結束對本行文本的處理,並接着處理下一行


awk 內置變量:

FS: field separator,默認是空白字符;

RS:Record separator,默認是換行字符;

NR:The number of input recordsawk命令所處理記錄數:若是有多個文件,這個數目會把處理的多個文件中行統一計數;

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個,start1開始計數;


system(command)

功能:執行系統command並將結果訪問至awk命令

systime()

功能:取系統當前時間


awk [options] ‘PATTERN{cation}’ input_file

相關文章
相關標籤/搜索