摘要:初步列了以下方案用實現擅長,通過重定向將的輸出傳給,處理完后執行系統命令清除鏡像。對鏡像列表進行去重操作可以以鏡像名稱為進行去重獲取歷史鏡像要保留最近個鏡像清除歷史鏡像,其實就是保留數據前行,有個內置變量保存當前處理行編號。
背景
雖然對awk早有耳聞,據說是個很強大的工具,但一直沒機會去了解和使用,最近碰到一個需求,用awk輕松解決,才真正一窺它的厲害。
需求是這樣的,應用每次升級都會構建一個新的容器鏡像,時間久了,服務器上會積累很多歷史鏡像,而且因為鏡像本身比較大,磁盤消耗特別快,因此需要寫一個腳本定期保留最近N個鏡像,清除其余歷史鏡像。
初步列了以下方案
用java實現(擅長java~~),通過重定向將docker images的輸出傳給java,java處理完后執行系統命令清除鏡像。
用python處理。
用bash處理。
java方案雖然可行,但想想代碼量就不小,既要處理字符串,又要調用系統命令,而且把java拿來做這種事,總感覺怪怪的。pass。
python不熟,又懶得去學,學完之后估計很長時間不會再用,下次用的時候還得去學,性價比不高,pass。
最理想的就是bash,正宗的腳本語言,但是否有足夠能力處理字符串,需要做技術調研,這時想到了awk。
awk不只是linux的一個工具,由于awk腳本具有編程語言三要素,順序,循環,判斷,awk還是一門編程語言,主要用于數據處理和數據計算。awk對文本進行行掃描,以行為單位進行處理,按照以下邏輯進行處理
pattern { action } pattern { action } ....
其中pattern是匹配條件,action是pattern匹配后執行的動作。
上面提到awk對文本以行為單位進行處理,讀取行后,awk默認以空格為切割符對行進行切割(split)操作并按順序存放在變量$1$2,$3....中,其中$0表示完整行數據,這些變量可以用于pattern和action。
舉個例子,比如用ps -ef列出目前系統進程
zhengjianfengdeMacBook-Pro:shell asan$ ps -ef UID PID PPID C STIME TTY TIME CMD 0 1 0 0 17 418 ?? 21:55.75 /sbin/launchd 0 37 1 0 17 418 ?? 1:50.35 /usr/libexec/UserEventAgent (System) 0 38 1 0 17 418 ?? 0:37.59 /usr/sbin/syslogd 0 40 1 0 17 418 ?? 0:14.22 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld 0 41 1 0 17 418 ?? 0:09.93 /usr/libexec/kextd 0 42 1 0 17 418 ?? 4:15.97 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd 0 44 1 0 17 418 ?? 0:36.08 /opt/cisco/anyconnect/bin/vpnagentd -execv_instance 55 48 1 0 17 418 ?? 0:03.84 /System/Library/CoreServices/appleeventsd --server
如果我們想要打印出第二列PID的值可以這么寫
zhengjianfengdeMacBook-Pro:shell asan$ ps -ef|awk "{print $2}" PID 1 37 38 40 41 42 44 48
如果想要打印PID大于40值可以這么寫
zhengjianfengdeMacBook-Pro:shell asan$ ps -ef|awk "$2>40 {print $2}" PID 41 42 44 48
本文不是awk入門教程,如果想了解更多awk基本用法,可以閱讀以下兩篇文章:
http://awk.readthedocs.io/en/...
http://www.runoob.com/linux/l...
獲取目前系統鏡像列表可以通過命令docker images獲取,輸出格式如下
[root@definesys /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/xxxxx-authority-ms v1.0.3 02da1a24ac2c 4 days ago 692 MB docker.io/xxxxx-authority-ms v1.0.2 4a36396f0fea 4 days ago 692 MB docker.io/xxxxx-uc-user-ms v.1.1.11 6f0db317c7a9 5 days ago 695 MB docker.io/xxxxx-uc-user-ms v.1.1.10 26983c00bb73 6 days ago 695 MB docker.io/xxxxx-uc-user-ms v1.1.9 f21d59255405 7 days ago 695 MB
獲取鏡像列表
第一步就是要先獲取系統的鏡像列表,也就是對REPOSITORY進行去重操作,awk去重有個經典的寫法。
awk "!a[$0]++ {print $0}"
聲明一個hash數組a并且以$0即行數據為key,第一次a[$0]值是未定義的(undef)取反后為true輸出,++對a[$0]進行賦值,賦值后a[$0]值為1,第二次a[$0]為1,取反后為0,0++還是0不輸出。
對鏡像列表進行去重操作可以以鏡像名稱(REPOSITORY)為key進行去重
docker images|awk "!a[$1]++ {print $1}"
獲取歷史鏡像
要保留最近N個鏡像清除歷史鏡像,其實就是保留數據前N行,awk有個內置變量NR保存當前處理行編號。結合第一步獲取的鏡像名稱可以先grep出指定鏡像列表,再用awk進行篩選.
docker images|grep $image|awk "NR > 4 {printf "%s:%s:%s ",$1,$2,$3}"
完整腳本
#!/bin/sh #create by jianfeng.zheng #group docker images for image in `docker images|awk "!a[$1]++ {print $1}"` do for m in `docker images|grep $image|awk "NR > 4 {printf "%s:%s:%s ",$1,$2,$3}"` do id=`echo $m|awk -F ":" "{print $3}"` ##do delete echo "delete docker== > "$m done done結語
awk還有很多功能待挖掘,但可以肯定的是,以后Linux上數據處理的工作,首選方案就是awk。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27319.html
摘要:實際上,認為文本文件都是結構化的,它將每一個輸入行定義為一個記錄,行中的每個字符串定義為一個域段,域和域之間使用分割符分割。 看到一篇Docker 技巧:刪除 Docker 容器和鏡像其中提到刪除標簽為none的鏡像的方法,其中用到了awk,就去查了下,下面舉例說明: docker rmi $(docker images | awk $1 == && $2 == {print $3...
摘要:本文從幾個方面來清理垃圾。所以根據鏡像名刪除鏡像的效果會更好。刪除鏡像定時任務腳本注意事項為了加快打包的速度,一般不要太頻繁的刪除鏡像。因為老的鏡像中的某些不改變的層,可以作為新的鏡像的緩存,從而大大加快構建的速度。 使用jenkins作為打包的工具,主機上的磁盤空間總是被慢慢被占滿,直到jenkins無法運行。本文從幾個方面來清理docker垃圾。 批量刪除已經退出的容器 docke...
摘要:核心概念鏡像鏡像類似于虛擬機鏡像。每個鏡像包括了一個基本的操作系統環境容器容器類似于一個輕量級的沙箱,利用容器來運行和隔離應用。 這些是我的筆記,都是記錄的核心概念和使用方法 showImg(https://segmentfault.com/img/bVbcOnO?w=1354&h=894); 概述 使用docker搭建開發環境將近1年了,自我感覺docker的強大并非如此,不過沒有機...
摘要:前兩天在本地安裝了,熟悉了下命令之后,還是忍不住到上進行了一波鏡像部署,以下是我的操作步驟和一些想法。但是如果想要將當前目錄的文件復制進里頭,首先要保證鏡像在運行,然后命令中的容器名使用我圈出來的那個名字。 前兩天在本地安裝了docker,熟悉了下命令之后,還是忍不住到centos上進行了一波golang鏡像部署,以下是我的操作步驟和一些想法。準備:一臺安裝了docker的可聯網的ce...
閱讀 767·2023-04-25 17:33
閱讀 3626·2021-07-29 14:49
閱讀 2480·2019-08-30 15:53
閱讀 3435·2019-08-29 16:27
閱讀 2000·2019-08-29 16:11
閱讀 1030·2019-08-29 14:17
閱讀 2432·2019-08-29 13:47
閱讀 2016·2019-08-29 13:28