国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

awk刪除docker歷史鏡像

lentoo / 1960人閱讀

摘要:初步列了以下方案用實(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介紹

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是匹配條件,actionpattern匹配后執(zhí)行的動(dòng)作。
上面提到awk對(duì)文本以行為單位進(jìn)行處理,讀取行后,awk默認(rèn)以空格為切割符對(duì)行進(jìn)行切割(split)操作并按順序存放在變量$1$2,$3....中,其中$0表示完整行數(shù)據(jù),這些變量可以用于patternaction
舉個(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...

實(shí)現(xiàn)

獲取目前系統(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

相關(guān)文章

  • awk刪除鏡像過(guò)程中的用法及說(shuō)明

    摘要:實(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...

    lentoo 評(píng)論0 收藏0
  • Docker鏡像批量清理之道

    摘要:本文從幾個(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...

    Charlie_Jade 評(píng)論0 收藏0
  • 五分鐘快速了解Docker

    摘要:核心概念鏡像鏡像類似于虛擬機(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ī)...

    Tecode 評(píng)論0 收藏0
  • docker在centos安裝golang操作及部分理解

    摘要:前兩天在本地安裝了,熟悉了下命令之后,還是忍不住到上進(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...

    huaixiaoz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<