看到一篇「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
docker images:查詢本地鏡像列表;centos
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
這裏沒辦法列全全部的用法,也不必,若是你本身掌握用法既能夠記得牢,也能夠本身組合出本身須要的命令。
參考文獻: