作为一名 Linux 研发人员,几乎每天都要面对文本处理场景。 因此 掌握文本处理套路熟练运用文本处理命令 ,对于 提升工作效率 意义重大。

本文以一个实战例子抛砖引玉,介绍如何运用 grepawksedcut 等命令进行文本处理, 以 快速 完成原本很繁琐的操作。

背景

笔者开发机上有很多 Docker 镜像,现在需要删除名为 none 的那些:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
api-adapter v1 e9bc8e28af2a 3 hours ago 7.67MB
<none> <none> f0fa889be9e8 2 days ago 956MB
<none> <none> 257954316455 2 days ago 956MB
<none> <none> 99739acbfe7a 2 days ago 956MB
<none> <none> 52b10754a70c 2 days ago 956MB
<none> <none> 86878eefdd39 2 days ago 956MB
golang 1.10 0a19f4d16598 12 days ago 729MB
python 3 1e80caffd59e 12 days ago 923MB

如何操作呢?莫非手工一个个删除么?

$ docker image rm f0fa889be9e8

试想,如果有上百个这样的镜像待删,要搞到何年何月!但如何改进呢?

文本过滤

考虑先把名字为 none 的镜像从结果中过滤出来, grep 命令即可搞定:

$ docker images | grep none
<none> <none> f0fa889be9e8 2 days ago 956MB
<none> <none> 257954316455 2 days ago 956MB
<none> <none> 99739acbfe7a 2 days ago 956MB
<none> <none> 52b10754a70c 2 days ago 956MB
<none> <none> 86878eefdd39 2 days ago 956MB

字段提取

接着,将容器 ID 一列提取出来,这对 awk 来说简直是小儿科:

$ docker images | grep none | awk '{print $3}'
f0fa889be9e8
257954316455
99739acbfe7a
52b10754a70c
86878eefdd39

当然了,通过 cut 命令进行 字段切分 也可以得到相同的结果。 由于 cut 只能按单个字符进行切分,而原文本中的空格为多个,因此需要先进行 文本替换

文本替换

文本替换是 sed 命令擅长的事,下面将一个或多个空格替换成一个:

$ docker images | grep none | sed 's/  */ /g'
<none> <none> f0fa889be9e8 2 days ago 956MB
<none> <none> 257954316455 2 days ago 956MB
<none> <none> 99739acbfe7a 2 days ago 956MB
<none> <none> 52b10754a70c 2 days ago 956MB
<none> <none> 86878eefdd39 2 days ago 956MB

文本切分

接下来,使用 cut 命令对结果进行进一步切分并取出第三个字段:

$ docker images | grep none | sed 's/  */ /g' | cut -d ' ' -f 3
f0fa889be9e8
257954316455
99739acbfe7a
52b10754a70c
86878eefdd39

不错,我们得到与运用 awk 命令相同的结果。

批量删除

接下来,通过 xargs 批量删除镜像:

$ docker images | grep none | awk '{print $3}' | xargs docker image rm
Deleted: sha256:f0fa889be9e8f8369353a32e8cec17e9333cbeb581de5f78bf6875917d971bc9
Deleted: sha256:d301d0546b29b7daa55d29f29d9253664870fd83465aefe8b92ff6a7048d5612
...

在这个例子中, xargs 最终将执行以下命令:

$ docker image rm f0fa889be9e8 257954316455 99739acbfe7a 52b10754a70c 86878eefdd39

看到没有,所有不想要的镜像都删除干净了,而且只需要进行一次操作:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
api-adapter v1 e9bc8e28af2a 3 hours ago 7.67MB
golang 1.10 0a19f4d16598 12 days ago 729MB
python 3 1e80caffd59e 12 days ago 923MB

下面这个操作也是等价的:

$ docker images | grep none | sed 's/  */ /g' | cut -d ' ' -f 3 | xargs docker image rm

Linux文本处理的更多相关文章

  1. linux文本操作界面 vi面板如何复制一行

    linux文本操作界面 vi面板如何复制一行 1)把光标移动到要复制的行上2)按yy3)把光标移动到要复制的位置4)按p 在vi里如何复制一行中间的几个字符?如果你要从光标处开始复制 4 个字符,则先 ...

  2. Linux文本流

    Linux文本流   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 文本流 文件用于数据的存储,相当于一个个存储数据的房子.我们 ...

  3. 最优秀的5个Linux文本编辑器

    from: http://article.yeeyan.org/view/169956/174836 作为不久前举办的比赛的一部分内容,我从那些选出他们最喜欢的Linux文本编辑器的极客读者们那获得了 ...

  4. linux文本处理常用指令总结

    引子 作为一个偏爱windows的程序员,以前做文本处理的时候总是喜欢在windows下用notepad++等图形化工具处理,比如有时需要把linux服务器上一个文件进行一次全局字符串替换这样简单的操 ...

  5. Linux系列教程(十)——Linux文本编辑器vim

    通过前面几篇博客我们终于结束了Linux常用命令的介绍,Linux常用命令主要包括以下: ①.Linux文件和目录处理命令 ②.Linux链接命令和权限管理命令 ③.Linux文件搜索命令 ④.Lin ...

  6. linux文本处理命令

    linux文本处理命令 1.wc命令 基本介绍 文件的行统计.字符统计.字节统计 基本语法 wc  [OPTION]...  [FILE]... wc  [OPTION]...  --files0-f ...

  7. Linux文本编辑器vim

    目录 1.vim 的工作模式 2.插入命令 3.定位命令 4.删除命令 5.复制和剪切命令 6.替换和取消命令 7.搜索和搜索替换命令 8.保存和退出命令 9.vim 高级操作 10.总结 通过前面几 ...

  8. [文件]Linux文本处理常用命令总结

    转自:https://www.cnblogs.com/sheeva/p/6406285.html 引子 作为一个偏爱windows的程序员,以前做文本处理的时候总是喜欢在windows下用notepa ...

  9. Linux文本编辑器(九)

    [教程主题]:Linux文本编辑器 [1]vi vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任 何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令. 由于对U ...

  10. linux文本分析利器awk

    转 快速理解linux文本分析利器awk 原文链接 杜亦舒 性能与架构 awk是什么 如果工作中需要操作linux比较多,那么awk是非常值得学习的 awk是一个极其强大的文本分析工具,把文件逐行的读 ...

随机推荐

  1. 30个优秀的chrome网页设计开发插件

    BuiltWith Resolution Test colorPicker Palette for Chrome Chrome Sniffer JS Library Detector Google F ...

  2. MyEclipse打包带源码的jar包

    平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不到jar包里面的类的源码了,所以也就无法调试,要想调试,那么就只能通过关联源代码的形式,这样或多或少也有一些不方便,今 ...

  3. CentOS6.5(3)----设置自己安装的程序开机自动启动

    CentOS6.5系统下设置自己安装的程序开机自动启动 方法1. 把启动程序的命令添加到 /etc/rc.d/rc.local 文件中,比如设置开机启动 mysqld: #!/bin/sh # # T ...

  4. LeetCode算法题5----Longest Palindromic Substring

    #5. Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You ...

  5. dbcp2、c3p0、druid连接池的简单配置

    引入Maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  6. 秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

    http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些 ...

  7. 采用powershell创建project网站集(摘抄自https://www.cnblogs.com/jindahao/p/5855668.html)

    采用powershell创建project网站集,具体步骤如下 1.输入License Enable-ProjectServerLicense –Key "23CB6-N4X8Q-WWD7M ...

  8. 无法安装64位office,因为已有32位版本怎么办

  9. JQuery的getJSON函数跨域

    由于一开始看到“$”等类似符号就头晕,所以注定与PHP和JQuery无缘了,不过自己用JavaScript可不代表其他人也得用,这不,麻烦到了... 两个网站:A.B A站点提供了一个重要的API,由 ...

  10. J2EE项目异常处理(转)

     为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”.笔者在初学java时也是这样认为的.如何在一个多层的j2e ...