linux awk學習

基本結構如下:
awk 'BEGIN{ print "start" } pattern {commands } END {print "end"} '
這三部份是可選的。且腳本通常會被包含在單引號或者雙引號中:
[root@localhost test]# cat test.sh| wc -l
6
[root@localhost test]# awk 'BEGIN{ i=0 } { i++ } END { print i }' test.sh
6
[root@localhost test]# awk "BEGIN{ i=0 } { i++ } END { print i }" test.sh
6

awk的工作原理如下:
(1)執行BEGIN {command}
(2)從文件或stdin中讀取一行,執行pattern {command}。重複該過程,直到文件全部被讀取完畢。
(3)當讀到輸入流末尾時,執行END{command}語句塊。
這三部份是可選的哈。
如果沒有(2)部份,則執行默認的 { print },即打印每一讀到的行。
如:
[root@localhost test]# echo -e "line1\nline2" | awk 'BEGIN{print "Start"} {print} END {print "End"}'
Start
line1
line2
End
其中echo 的-e選項,是將\n轉換爲換行符,請自己man 一下。
[root@localhost test]# echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3}'
v1 v2 v3
[root@localhost test]# echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1"-"var2"-"var3}'
v1-v2-v3
{}類似於一個循環,會對文件中的每一行進行迭代

awk中的特殊變量:
NR:表示記錄數量,執行過程中對應於當前行號。
NF:表示字段數量,執行過程中對應於當前的字段數。
$0:包含執行過程中當前行的全部文本內容。
$1:包含第一個字段的文本內容
$2:包含第二個字段的文本內容
$(NF-1)包含倒數第二個字段。
例:
[root@localhost test]# cat student.data 
NO;     Name;   Mark
1;      lufubo; 98
2;      cbiao;  88
[root@localhost test]# awk '{print $2,$3}' student.data 
Name; Mark
lufubo; 98
cbiao; 88
統計行數:
[root@localhost test]# cat student.data | wc -l
3
[root@localhost test]# awk 'END{print NR}' student.data 
3

awk 的選項
-v:將外部變量傳遞給awk
例:
[root@localhost test]# VAR=100
[root@localhost test]# echo | awk -v V=$VAR '{print V}'
100

awk用getline讀取行:
[root@localhost test]# seq 5 | awk 'BEGIN { getline; print "first line", $0} {print $0}'
first line 1
2
3
4
5

awk的過濾:
awk 'NR < 5'行號小於5的行
awk 'NR==1, NR==4'行號在1到4的行
awk '/linux/'包含linux樣式的行
awk '!/linux/'不包含linux樣式的行
[root@localhost test]# seq 5 | awk 'NR < 3 {print $0}' 
1
2
[root@localhost test]# seq 5 | awk 'NR==2,NR==3 {print $0}' 
2
3
[root@localhost test]# echo -e "linux\nlufubo\n" | awk '/linux/ {print $0}' 
linux
[root@localhost test]# echo -e "linux\nlufubo\n" | awk '!/linux/ {print $0}' 
lufubo

awk設置字符定界符
默認爲空格,通過 -F “delimiter”設置
[root@localhost test]# awk -F":" '{print $NF}' /etc/passwd
[root@localhost test]# awk 'BEGIN {FS = ":"} {print $NF}' /etc/passwd

從awk中讀取命令輸出
“command” | getline output;
[root@localhost test]# echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout}'
root:x:0:0:root:/root:/bin/bash
注意其中的雙引號喲~^~

打印處於start_pattern與end_pattern 之間的文本
[root@localhost test]# seq 100 | awk '/34/, /35/'
34
35

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