手把手教你在linux下熟悉使用awk的指令結構(15)

AWK Linux Sed 魔獸世界 安靜的十年 安靜的十年 2017-10-17

手把手教你在linux下熟悉使用awk的指令結構 (15)

大家好,今天和大家說一下awk吧。反正正則 早晚也要和大家說,不如一點一點和大家先交代清楚了,省得以後和大家說的時候,大家有懵的感覺。。。

其實正則裡分為基礎正則,和擴展正則。基礎正則一般的命令就是grep和sed。而awk和egrep不止可以在基礎正則內使用,還可以在擴展正則內使用。之前咱們見過sed了,其實grep和sed差不多,只是基本的語法有出入。而今天和大家說的awk,其實使用方法和egrep也差不多。

好吧。還是照例先開始今天的理論方面的東西吧。

手把手教你在linux下熟悉使用awk的指令結構(15)

awk 指令結構格式

1、確保整個awk命令用單引號括起來

2、確保命令內所有引號成對出現

3、確保用花括號括起動作語句,用圓括號括起條件語句

4、確保動作語句打印的字符串及轉義字符用雙引號引起來。

awk條件操作符

手把手教你在linux下熟悉使用awk的指令結構(15)

awk條件邏輯操作符

手把手教你在linux下熟悉使用awk的指令結構(15)

awk內置變量

手把手教你在linux下熟悉使用awk的指令結構(15)

awk中使用操作符,基本表達式可以劃分為數字型,字符串型,變量型,域,數組元素

賦值操作符 = += *= /- %= ^=

條件表達操作符 ?

並、與、非 || && !

匹配操作符 ~ !~

關係操作符 < <= == != >>

算術操作符 + - * / % ^

前綴和後綴 ++ --------------------------------------------------------------------------------------------------------

awk的常用內置字符串函數

手把手教你在linux下熟悉使用awk的指令結構(15)

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)分別測試字符串&ldquo;ANCD&rdquo;中是否包含字符 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的,也很多啊。。。苦惱中。。

可能我是新手作者吧。不太懂得應該怎麼弄。。。

看看今天有什麼評論,晚上再寫吧。。。

相關推薦

推薦中...