shell腳本學習-06

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 )}'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章