摘要:初步列了以下方案用實(shí)現(xiàn)擅長(zhǎng),通過(guò)重定向?qū)⒌妮敵鰝鹘o,處理完后執(zhí)行系統(tǒng)命令清除鏡像。對(duì)鏡像列表進(jìn)行去重操作可以以鏡像名稱為進(jìn)行去重獲取歷史鏡像要保留最近個(gè)鏡像清除歷史鏡像,其實(shí)就是保留數(shù)據(jù)前行,有個(gè)內(nèi)置變量保存當(dāng)前處理行編號(hào)。
背景
雖然對(duì)awk早有耳聞,據(jù)說(shuō)是個(gè)很強(qiáng)大的工具,但一直沒(méi)機(jī)會(huì)去了解和使用,最近碰到一個(gè)需求,用awk輕松解決,才真正一窺它的厲害。
需求是這樣的,應(yīng)用每次升級(jí)都會(huì)構(gòu)建一個(gè)新的容器鏡像,時(shí)間久了,服務(wù)器上會(huì)積累很多歷史鏡像,而且因?yàn)殓R像本身比較大,磁盤消耗特別快,因此需要寫一個(gè)腳本定期保留最近N個(gè)鏡像,清除其余歷史鏡像。
初步列了以下方案
用java實(shí)現(xiàn)(擅長(zhǎng)java~~),通過(guò)重定向?qū)?b>docker images的輸出傳給java,java處理完后執(zhí)行系統(tǒng)命令清除鏡像。
用python處理。
用bash處理。
java方案雖然可行,但想想代碼量就不小,既要處理字符串,又要調(diào)用系統(tǒng)命令,而且把java拿來(lái)做這種事,總感覺(jué)怪怪的。pass。
python不熟,又懶得去學(xué),學(xué)完之后估計(jì)很長(zhǎng)時(shí)間不會(huì)再用,下次用的時(shí)候還得去學(xué),性價(jià)比不高,pass。
最理想的就是bash,正宗的腳本語(yǔ)言,但是否有足夠能力處理字符串,需要做技術(shù)調(diào)研,這時(shí)想到了awk。
awk不只是linux的一個(gè)工具,由于awk腳本具有編程語(yǔ)言三要素,順序,循環(huán),判斷,awk還是一門編程語(yǔ)言,主要用于數(shù)據(jù)處理和數(shù)據(jù)計(jì)算。awk對(duì)文本進(jìn)行行掃描,以行為單位進(jìn)行處理,按照以下邏輯進(jìn)行處理
pattern { action } pattern { action } ....
其中pattern是匹配條件,action是pattern匹配后執(zhí)行的動(dòng)作。
上面提到awk對(duì)文本以行為單位進(jìn)行處理,讀取行后,awk默認(rèn)以空格為切割符對(duì)行進(jìn)行切割(split)操作并按順序存放在變量$1$2,$3....中,其中$0表示完整行數(shù)據(jù),這些變量可以用于pattern和action。
舉個(gè)例子,比如用ps -ef列出目前系統(tǒng)進(jìn)程
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...
獲取目前系統(tǒng)鏡像列表可以通過(guò)命令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
獲取鏡像列表
第一步就是要先獲取系統(tǒng)的鏡像列表,也就是對(duì)REPOSITORY進(jìn)行去重操作,awk去重有個(gè)經(jīng)典的寫法。
awk "!a[$0]++ {print $0}"
聲明一個(gè)hash數(shù)組a并且以$0即行數(shù)據(jù)為key,第一次a[$0]值是未定義的(undef)取反后為true輸出,++對(duì)a[$0]進(jìn)行賦值,賦值后a[$0]值為1,第二次a[$0]為1,取反后為0,0++還是0不輸出。
對(duì)鏡像列表進(jìn)行去重操作可以以鏡像名稱(REPOSITORY)為key進(jìn)行去重
docker images|awk "!a[$1]++ {print $1}"
獲取歷史鏡像
要保留最近N個(gè)鏡像清除歷史鏡像,其實(shí)就是保留數(shù)據(jù)前N行,awk有個(gè)內(nèi)置變量NR保存當(dāng)前處理行編號(hào)。結(jié)合第一步獲取的鏡像名稱可以先grep出指定鏡像列表,再用awk進(jìn)行篩選.
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結(jié)語(yǔ)
awk還有很多功能待挖掘,但可以肯定的是,以后Linux上數(shù)據(jù)處理的工作,首選方案就是awk。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27319.html
摘要:實(shí)際上,認(rèn)為文本文件都是結(jié)構(gòu)化的,它將每一個(gè)輸入行定義為一個(gè)記錄,行中的每個(gè)字符串定義為一個(gè)域段,域和域之間使用分割符分割。 看到一篇Docker 技巧:刪除 Docker 容器和鏡像其中提到刪除標(biāo)簽為none的鏡像的方法,其中用到了awk,就去查了下,下面舉例說(shuō)明: docker rmi $(docker images | awk $1 == && $2 == {print $3...
摘要:本文從幾個(gè)方面來(lái)清理垃圾。所以根據(jù)鏡像名刪除鏡像的效果會(huì)更好。刪除鏡像定時(shí)任務(wù)腳本注意事項(xiàng)為了加快打包的速度,一般不要太頻繁的刪除鏡像。因?yàn)槔系溺R像中的某些不改變的層,可以作為新的鏡像的緩存,從而大大加快構(gòu)建的速度。 使用jenkins作為打包的工具,主機(jī)上的磁盤空間總是被慢慢被占滿,直到j(luò)enkins無(wú)法運(yùn)行。本文從幾個(gè)方面來(lái)清理docker垃圾。 批量刪除已經(jīng)退出的容器 docke...
摘要:核心概念鏡像鏡像類似于虛擬機(jī)鏡像。每個(gè)鏡像包括了一個(gè)基本的操作系統(tǒng)環(huán)境容器容器類似于一個(gè)輕量級(jí)的沙箱,利用容器來(lái)運(yùn)行和隔離應(yīng)用。 這些是我的筆記,都是記錄的核心概念和使用方法 showImg(https://segmentfault.com/img/bVbcOnO?w=1354&h=894); 概述 使用docker搭建開(kāi)發(fā)環(huán)境將近1年了,自我感覺(jué)docker的強(qiáng)大并非如此,不過(guò)沒(méi)有機(jī)...
摘要:前兩天在本地安裝了,熟悉了下命令之后,還是忍不住到上進(jìn)行了一波鏡像部署,以下是我的操作步驟和一些想法。但是如果想要將當(dāng)前目錄的文件復(fù)制進(jìn)里頭,首先要保證鏡像在運(yùn)行,然后命令中的容器名使用我圈出來(lái)的那個(gè)名字。 前兩天在本地安裝了docker,熟悉了下命令之后,還是忍不住到centos上進(jìn)行了一波golang鏡像部署,以下是我的操作步驟和一些想法。準(zhǔn)備:一臺(tái)安裝了docker的可聯(lián)網(wǎng)的ce...
閱讀 783·2023-04-25 17:33
閱讀 3636·2021-07-29 14:49
閱讀 2487·2019-08-30 15:53
閱讀 3440·2019-08-29 16:27
閱讀 2008·2019-08-29 16:11
閱讀 1036·2019-08-29 14:17
閱讀 2443·2019-08-29 13:47
閱讀 2023·2019-08-29 13:28