手把手教你在linux下熟悉使用awk的指令結構 (15)
大家好,今天和大家說一下awk吧。反正正則 早晚也要和大家說,不如一點一點和大家先交代清楚了,省得以後和大家說的時候,大家有懵的感覺。。。
其實正則裡分為基礎正則,和擴展正則。基礎正則一般的命令就是grep和sed。而awk和egrep不止可以在基礎正則內使用,還可以在擴展正則內使用。之前咱們見過sed了,其實grep和sed差不多,只是基本的語法有出入。而今天和大家說的awk,其實使用方法和egrep也差不多。
好吧。還是照例先開始今天的理論方面的東西吧。
awk 指令結構格式
1、確保整個awk命令用單引號括起來
2、確保命令內所有引號成對出現
3、確保用花括號括起動作語句,用圓括號括起條件語句
4、確保動作語句打印的字符串及轉義字符用雙引號引起來。
awk條件操作符
awk條件邏輯操作符
awk內置變量
awk中使用操作符,基本表達式可以劃分為數字型,字符串型,變量型,域,數組元素
賦值操作符 = += *= /- %= ^=
條件表達操作符 ?
並、與、非 || && !
匹配操作符 ~ !~
關係操作符 < <= == != >>
算術操作符 + - * / % ^
前綴和後綴 ++ --------------------------------------------------------------------------------------------------------
awk的常用內置字符串函數
E.G
原例文:
[root@localhost ~]# cat wow
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
1)將整篇wow中的4全局替換成999
[root@localhost ~]# awk 'gsub(/4/,999)' wow
M.Tansley 05/99 9998311 Green 8 9990 999999
J.Lulu 06/99 9998317 green 9 2999 26
P.Bunny 02/99 9998 Yellow 12 35 28
J.Troll 07/99 99989992 Brown-3 12 26 26
L.Tansley 05/99 999712 Brown-2 12 30 28
或者
[root@localhost ~]# awk 'gsub(/4/,999,$0)' wow //默認就是$0,可以不加
M.Tansley 05/99 9998311 Green 8 9990 999999
J.Lulu 06/99 9998317 green 9 2999 26
P.Bunny 02/99 9998 Yellow 12 35 28
J.Troll 07/99 99989992 Brown-3 12 26 26
L.Tansley 05/99 999712 Brown-2 12 30 28
2)將用戶名為M.Tansley所在行所有4替換成999
[root@localhost ~]# awk '{if($1=="M.Tansley") gsub(/4/,999); print $0}' wow
M.Tansley 05/99 9998311 Green 8 9990 999999
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
3)將用戶名為M.Tansley所在行第三列的所有4替換成999
[root@localhost ~]# awk '{if($1=="M.Tansley") gsub(/4/,999,$3); print $0}' wow
M.Tansley 05/99 9998311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
4)將用戶名為M.Tansley所在行第三列的所有4替換成999,並且僅顯示替換行
[root@localhost ~]# awk '{if($1=="M.Tansley") {gsub(/4/,999,$3); print $0}}' wow
M.Tansley 05/99 9998311 Green 8 40 44
5)將用戶名為M.Tansley所在行第一個出現的4替換成999,
[root@localhost ~]# awk '{if($1=="M.Tansley") sub(/4/,999); print $0}' wow
M.Tansley 05/99 9998311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
5)將用戶名為M.Tansley所在行第一個出現的4替換成999 , 並且僅顯示替換行
[root@localhost ~]# awk '{if($1=="M.Tansley") {sub(/4/,999); print $0}}' wow
M.Tansley 05/99 9998311 Green 8 40 44
6)查詢字符串Bunny中ny是第幾個出現的字符。
[root@localhost ~]# awk 'BEGIN {print index("Bunny","ny")}' grade.txt
4
7)查詢字符串J.Troll的字符長度是多少?
[root@localhost ~]# awk '$1=="J.Troll" {print length($1),$1}' grade.txt
7 J.Troll
8)分別測試字符串“ANCD”中是否包含字符 d 或 C 或 D,如果沒包含返回字符0,如果包含返回時第幾個出現
字符。
[root@localhost ~]# awk 'BEGIN {print match("ANCD",/d/)}'
0
[root@localhost ~]# awk 'BEGIN {print match("ANCD",/C/)}'
3
[root@localhost ~]# awk 'BEGIN {print match("ANCD",/D/)}'
4
9)顯示字符串L.Tansley中從第1個字符(包含)開始的後面共5個字符
[root@localhost ~]# awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
L.Tan
顯示字符串L.Tansley中從第2個字符(包含)開始的後面共3個字符
[root@localhost ~]# awk '$1=="L.Tansley" {print substr($1,2,3)}' grade.txt
.Ta
10)用printf格式化awk的輸出
[root@localhost ~]# awk 'BEGIN{printf
"%-60s\n","-------------------------------------------------------------"}{printf
"%-15s %s %-15s %s %s\n",$1,"|",$3,"|",$5}' grade.txt
M.Tansley | 48311 | 8
J.Lulu | 48317 | 9
P.Bunny | 48 | 12
J.Troll | 4842 | 12
L.Tansley | 4712 | 12
[root@localhost ~]# awk 'BEGIN{printf "%-39s\n","----------------------------------------";printf
"%-15s %s %-15s %s %-1s %s\n","name","|","student_id","|","age","|";printf
"%-52s\n","----------------------------------------"}{printf
"%-15s %s %-15s %s %-3s %s\n",$1,"|",$3,"|",$5,"|"}END{printf
"%-39s\n","----------------------------------------"}' grade.txt
name | student_id | age |
----------------------------------------
M.Tansley | 48311 | 8 |
J.Lulu | 48317 | 9 |
P.Bunny | 48 | 12 |
J.Troll | 4842 | 12 |
L.Tansley | 4712 | 12 |
----------------------------------------------------------------------------------------------------------------------------
今天的課程,就講解到這裡吧。
實在是不知道要寫什麼了,週末下午回北京,這車堵的。。。實在是累壞了。晚上又幫一個粉絲一個散件一個散件的攢機器。終於是又給他省了一筆錢啊。。。寫完了才發現,昨天你們都沒給我評論今天具體要寫什麼。。。我這還是突然想到之前只寫了sed,今天打算把awk寫完,才寫的這個。。。
你們的基礎如果都沒問題的話,那我明天不寫基礎的東西了。。。實在是不知道大家需要什麼東西啊,是不是都感覺隨便搭建一個服務很有學習效果?那樣學習的更有感覺???那為什麼看vi/vim的和YUM的,也很多啊。。。苦惱中。。
可能我是新手作者吧。不太懂得應該怎麼弄。。。
看看今天有什麼評論,晚上再寫吧。。。