82.awk命令
語法格式
awk 'pattern' filename # file中所有包含的pattern的行都將打印出來
awk '{action}' filename # 這種情況下,action將作用於filename中的每一行上
awk 'pattern {action}' filename # action將被作用於filename中匹配到pattern的行
action只有print這個操作,沒有類似於sed中的替換、編輯等操作符
輸入內容可以是標準輸入,文件,管道,以及其他shell命令的輸出
例子:
awk '/Martin/' people.txt # 顯示people.txt中包含Martin的行
awk '{print $1}' people.txt #打印people.txt中每一行的第一列
awk '/Martin/{print $1,$2}' people.txt #打印匹配到Martin的行的第一列和第二列
管道輸入:
cat people.txt | awk '$3 > 6500' 或者 cat '$3 > 6500' people.txt
awk '/1972$/{print $1 , $2}' people.txt # 打印匹配到1972的行的第一個和第二個元素
awk的工作原理:
1、程序從文件中讀入一行,將這一行的內容放到一個內部變量$0中。
2、讀入的一行被分割爲單詞或者屬性,每一個單詞按順序被存儲到一個內部變量中,如$1,$2...每一行最多隻能有100個單詞
3、awk內部有一個內部分隔符,默認是空格符,用於讀取輸入時作爲分隔符,但是可以被設定爲其他字符;還有一個輸出分割符,被用作輸出內容到終端時每個單詞間的分割。
awk命令也可以被寫入腳本中,執行時指定-f參數就可以。
cat awk_script
output:/Martin/{print $1,$2}
awk -f awk_script people.txt
83.NR:行號
是awk程序的內部變量,記錄了每一行的行號。
awk '{print NR,$0}' people.txt
output:
1 Bill Thomas 8000 08/9/1968
2 Fred Martin 6500 22/7/1982
3 Julie Moore 4500 25/2/1978
4 Marie Jones 6000 05/8/1972
5 Tom Walker 7000 14/1/1977
84.field:屬性,awk默認根據空格和tab鍵來分隔單詞。使用$1 $2 $3來訪問一個個屬性。
awk '{print NR,$1,$2,$4}' awk_name.txt
85.-F:設置默認的單詞分隔符。並且可同時設置多個分隔符。
cat people.txt
output:
Bill Thomas:8000:08/9/1968
Fred Martin:6500:22/7/1982
Julie Moore:4500:25/2/1978
Marie Jones:6000:05/8/1972
Tom Walker:7000:14/1/1977
awk -F: '/Marie/{print $1,$2}' people.txt #指定:爲單詞間的分隔符
awk -F'[:\t]' '{print $1,$2,$3}' people.txt #將:以及\t兩個字符設置爲分隔符
86./Pattern/{action}:如果action爲空,那麼就會直接打印匹配到pattern的內容;如果action不爲空,那麼就會對匹配到的行執行action.
awk '$3 > 5000' people.txt #打印第三個屬性大於5000的行。
output:
Bill Thomas 8000 08/9/1968
Fred Martin 6500 22/7/1982
Marie Jones 6000 05/8/1972
Tom Walker 7000 14/1/1977
87.action:操作必須放在{}中,多個操作可以按行分割;如果多個操作在同一行,那麼應該用;分割
pattern{ action statement; action statement; .. } or
pattern
{ action statement
action statement
}
88.awk的正則通配符。
元字符 | 含義 |
---|---|
· | 匹配到一個字符 |
* | 0個或多個字符匹配到 |
^ | 匹配到字符串的開頭 |
$ | 匹配到字符串的結尾 |
+ | 匹配到一個或多個字符 |
? | 匹配到0個或者一個字符 |
[ABC] | 匹配到ABC中的任何一個 |
[^ABC] | 不能匹配到ABC中的任何一個 |
[A-Z] | 匹配到A-Z中的任何一個 |
a|b | 匹配到a或者b |
(AB)+ | 匹配到一個或多個AB,ABAB,ABABAB |
* | 匹配到*字面量 |
& | 表示匹配打的內容。 |
89.編寫awk腳本。
注意:腳本中只需要包含命令。awk程序和被執行的文件都不需要寫在腳本中。
cat report
/Bill/{print "Birth date of " $1,$2 " is " $4}
/^Julie/{print $1,$2 " has a salary of $" $3 "."}
/Marie/{print NR,$0}
執行腳本:
awk -f report people.txt
90.類型聲明。
name=“Ganesh”#字符串
j++ #數字
value=50# 數字
將數字類型轉變爲字符串:
value " "
將字符串轉變爲數字:
name + 0
91.條件語句。
語法:
if (conditional-expression)
action1
else
action2
例子:
cat people.txt
output:
Bill Thomas 8000 08/9/1968
Fred Martin 6500 22/7/1982
Julie Moore 4500 25/2/1978
Marie Jones 6000 05/8/1972
Tom Walker 7000 14/1/1977
awk '{
if($3 > 7000){
print "perpon with salary more than 7000 is \n",$1," ",$2;
}
}' people.txt
92.循環語句。
for (initialization;condition;increment/decrement)
actions
例子:
NF:代表該行的field數量。
awk 'for(i=1;i<=NF;i++) print NF,$i }' people.txt
while循環:
while(condition)
actions
awk '{ i=1;while(i <= NF){ print NF,$i;i++}}' people.txt
do while循環:
do
action
while(condition)
例子:
awk '{ do { ++x;print x;} while(x <=4 )}'