awk在刪除鏡像過程當中的用法及說明

看到一篇「Docker 技巧:刪除 Docker 容器和鏡像」其中提到刪除標籤爲none的鏡像的方法,其中用到了awk,就去查了下,下面舉例說明:html

docker rmi $(docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}')

不少挺長的指令不明白的時候能夠拆成短的去學習瞭解,這裏 「$()」 中的語句能夠單摘出來:docker

docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}'

這條語句又能夠看做兩步操做:shell

  1. docker images:查詢本地鏡像列表;centos

  2. awk:文本分析工具,這裏的 「'$1 == "<none>" && $2 == "<none>" {print $3}'」 是它的判斷條件和具體操做;工具

爲了方便理解,這裏再簡化下語句:學習

docker images | awk '{print $0}'
# 返回結果:
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mono/jexus              6.24                1972cdc31613        4 days ago          727.9 MB

而後將結果與下面的兩個語句進行對比ui

docker images | awk '{print $1}'
# 返回結果:
REPOSITORY
mono/jexus

docker images | awk '{print $3}'
# 返回結果:
IMAGE
1972cdc31613

不難看出 「$」 後的參數分別對應的結果是有規律的。實際上,awk認爲文本文件都是結構化的,它將每個輸入行定義爲一個記錄,行中的每一個字符串定義爲一個域(段),域和域之間使用分割符分割。awk會把每行進行一個拆分,用相應的命令對拆分出來的「段」進行處理。code

  • 行工做模式,讀入文件的每一行,會把一行的內容,存到$0裏;htm

  • 使用內置的變量FS(段的分隔符,默認用的是空白字符),分割這一行,把分割出來的每一個段存到相應的變量$(1-100);blog

  • 輸出的時候按照內置變量OFS(out FS);

  • 讀入下一行繼續操做;

'$1 == "<none>" && $2 == "<none>" {print $3}'中的$1 == "<none>" && $2 == "<none>"含義則是每行拆分出的第一個字段和第二字段均爲 「<none>」,那麼就執行{print $3},即輸出該行記錄中的鏡像ID。咱們這裏是要刪除名稱和標籤均爲none的鏡像,那麼只能經過docker rmi ImageID來刪除鏡像,因此最後無需輸出整行記錄,只需輸出鏡像的id便可,而鏡像id處在一行記錄拆分後的第三個,即$3,因此這裏用{print $3}便可。而後組合起來就是:

docker rmi $(docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}')

經過awk能夠獲得想要的文本,再與docker的其餘命令組合能夠實現不少有意思的功能,關於awk更多的信息請參考《Shell腳本之awk詳解》,這裏是備份。關於Docker的相關指令能夠參照《Docker的學習--命令使用詳解》,裏面有詳盡的註釋。

另外,若是須要幾個命令組合就能夠用$()將命令嵌套起來,如:

# 查詢本地鏡像的ID列表
docker images -q

# 根據鏡像的ID或鏡像的名稱 + 標籤刪除鏡像
docker rmi ImageID

組合以後就成了

# 刪除全部的鏡像
docker rmi $(docker images -q)

一樣的,你能夠根據本身的狀況將其餘的命令進行組合,同時用awk對文本進行處理能夠實現更多有意思的功能。還有就是若是對docker的命令不熟悉的話

# 查看命令的幫助信息
docker COMMAND --help
# 例如:
docker rmi --help
# 返回結果
Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

  -f, --force        Force removal of the image
  --help             Print usage
  --no-prune         Do not delete untagged parents

這裏沒辦法列全全部的用法,也不必,若是你本身掌握用法既能夠記得牢,也能夠本身組合出本身須要的命令。

參考文獻:

相關文章
相關標籤/搜索