---
# System prepended metadata

title: awk

---

# awk

---

(2022/11/08 整理awk的學習筆記。)  ***學習awk的Youtube***  
| [各種awk的課程](https://www.youtube.com/results?search_query=awk) | [Learning Awk Is Essential](https://www.youtube.com/watch?v=9YOZmI-zWok&t=202s) | [Awk Isn't Just A Command](https://www.youtube.com/watch?v=2eX0scAsYJk) | [An AWK love story](https://www.youtube.com/watch?v=IfhMUed9RSE&t=283s) |   


---

- 列出與計算
```
htw@htw-B15:~/sh$ awk -F "/" ' {print $NF}'  /etc/shells | uniq
htw@htw-B15:~/sh$ df -h | awk '/\/dev/  {print }' 
htw@htw-B15:~/sh$ df -h | awk '/\/dev/  {print $1"\t"$2"\t"$3}' 
htw@htw-B15:~/sh$ df -h | awk '/\/dev/  {print $1"\t"$2 + $3}' 
htw@htw-B15:~/sh$ df -h | awk '/\/dev/  {print $1"\t"$2 - $3}' 

htw@htw-B15:~/sh$ awk 'length($0) > 7' /etc/shells 
htw@htw-B15:~/sh$ awk 'length($0) < 7' /etc/shells 
htw@htw-B15:~/sh$ awk 'length($0) < 9' /etc/shells 
htw@htw-B15:~/sh$ awk 'length($0) == 7' /etc/shells
```

- 如果某行內容等於某事，把它印出來
```
htw@htw-B15:~/sh$ ps -ef | awk '{ if($NF == "[cpuhp/2]") print $0  }'
root          24       2  0 16:09 ?        00:00:00 [cpuhp/2]
```
- loop迴路for
```
htw@htw-B15:~/sh$ awk 'BEGIN { for(i=1; i<=3; i++) print "The square root of ", i," is ", i*i;}'
The square root of  1  is  1
The square root of  2  is  4
The square root of  3  is  9
```
- 用 \/\/ 作搜尋
```
htw@htw-B15:~$ awk '$1 ~ /^[c,e]/ {print $0}' .bashrc  #請列出 是c或e開頭的 行
htw@htw-B15:~$ awk '{print substr($0, 3) }' /etc/shells #從第3個字開始印出來
#找出其中含有u字的那句，並指出在第幾個字位置
htw@htw-B15:~$ awk '{print $0}'  /etc/shells 
htw@htw-B15:~$ awk 'match($0, /u/) {print $0}'  /etc/shells 
htw@htw-B15:~$ awk 'match($0, /u/) {print $0 "has \"u\" chacter at " RSTART}'  /e:x:tc/shells 
/usr/bin/bashhas "u" chacter at 2
/usr/bin/rbashhas "u" chacter at 2
#只要印出第3到第4行
htw@htw-B15:~$ df | awk '{print NR, $0}'
htw@htw-B15:~$ df | awk 'NR==4, NR==5   {print NR, $0}'
```
- END是移到最後行，BEGIN在開始第一行之前
```
htw@htw-B15:~$ awk 'END {print NR} ' /etc/passwd  #移到最後一行的位置，說出現在是第幾行
54
htw@htw-B15:~$ awk 'END {print NR} ' /etc/shells  #移到最後一行的位置，說出現在是第幾行 
9
htw@htw-B15:~$ awk 'END {print NR} ' /etc/shells  /etc/passwd #會算出共計行數
63


htw@htw-B15:~$ awk 'BEGIN { print "Hello world!"}'
htw@htw-B15:~$ awk 'BEGIN { print "Hello world!"}'  xy.txt
htw@htw-B15:~$ awk 'BEGIN { print "Hello world!"} {print "Hi"}'  xy.txt
htw@htw-B15:~$ awk 'BEGIN { print "Hello world!"} {print "Hi"} END { print "HELLO WORLD!"}'  xy.txt
```
- 寫成一個awk程式更方便
```
#把從BEGIN到END的三句 寫入 xtest.awk, 用下列指令執行結果是一樣的
htw@htw-B15:~$ awk -f xtest.awk xy.txt
#用whereis awk發現是在/usr/bin/awk 所以在行首加上這句#!/usr/bin/awk -f 並改為可執行後
htw@htw-B15:~$ ./xtest.awk xy.txt   #就可做出一樣的結果

htw@htw-B15:~$ awk -v name="htw" 'BEGIN { print name}' #在一句中 先直接設定變數
htw
htw@htw-B15:~$ awk -v name="htw" 'BEGIN { print "name"}' #注意" "的用法
name
htw@htw-B15:~$ awk -v name="htw" 'BEGIN { print ""name""}'
htw

htw@htw-B15:~$ awk '/dog/ {print}' xy.txt
htw@htw-B15:~$ awk '/dog/ {print} /114/ {print}' xy.txt

htw@htw-B15:~$ awk '{print}' xy.txt  # =cat xy.txt  
```

- 關於sed的二三事
```
例如我要把檔案〝MyFile.txt〞的 1~8 行中的〝The〞或〝the〞改為大寫的〝THE〞可如下:
$ 	sed 	-e	'1,8	s/	[Tt]he/	THE/	g'	MyFile.txt 
基本用法為〝s/樣板(PATTERN)/取代(REPLACEMENT)/〞

$ echo 'this is a apple' | sed 's/a/AN/' ←將〝a〞改為〝AN〞(只取代搜尋到的第一個樣板就停止)
$ echo 'this is a apple' | sed 's/a/AN/g' ←將〝a〞改為〝AN〞(從頭到尾搜尋取代)
$ echo 'this is a apple' | sed 's/ is//g' ←將單字〝is〞刪掉(刪掉用空字串來取代)記得〝is〞前要加一空格寫成〝 is〞,不然〝this〞串中的〝is〞也會被刪除)
```


 
