当前位置: 首页 > news >正文

命令行快速进阶(三)将命令结合使用combining commands

到目前为止,我们都是单独使用命令行。然而有些命令的强大之处在于将现有单个命令结合起来从而达到用户想要的结果。

通常情况下命令都是将结果输出到屏幕上,但也有其他一些灵活的选项。一种是我们刚刚讲述过的输出重定向>,另外一种方法是piping。一个pipe就是一个连接器,将命令1的输出作为命令2的输入。

两个常用的命令psgrep我们之前已经将过,前者是列出进程,后者是查找字符串匹配。现在我们将这个两个命令结合起来,查找现在哪些用户在运行Nethack。命令如下:

ps aux | grep nethack

这条命令首先创建了一个目前正在运行的所有进程的list,并且把这个list输出给grep命令,grep命令排除掉所有与nethack不匹配的进程。Ubuntu允许用户pipe尽可能多的命令。例如我们可以加入wc命令,该命令计算它的输入的行数,字数和字符个数。Pipe上这个命令可以精确的计算出nethack被运行了多少次。命令如下:

ps aux | grep nethack | wc -l

-l参数(小写的L)告诉wc命令只计算输出行数。

用这种方法pipe多个命令比使用find命令配上-exec参数更受人欢迎。因为find命令的灵活多变让许多用户望而止步。这里就有一个非常好用的xargs命令,xargs命令的作用是把命令1的输出作为命令2的参数。

这里举个简单的例子。以下这条命令我们之前见过:

find / -name "*.txt" -size +10k -user cindy -not -perm +o=r-exec chmod o+r {} \;

这条命令从目录/开始搜索名字匹配*.txt,大小大于10KB,被用户cindy拥有,对于其他用户没有读权限的文件。然后对这些搜索到的文件执行chmod命令。这是一条很复杂的命令,不熟悉find命令的人理解起来可能非常困难。

因此我们可以把这条命令分为两个命令:find命令和xargs命令。常见的使用方法是:

find / -name "*.txt" -size +10k -user cindy -not -perm +0=r |xargs chmod o+r

这样就删除了经常造成困惑和错误的{} \;,而且实现同样的功能,而且更快。为啥这条命令会比之前的命令更快呢?这是因为加上-execfind命令实际上是对每个搜索到的文件调用chmod命令。而xargs命令不同的是,它先调用find查找到所有满足条件的文件,作为chmod的输入(因为chmod支持输入为多个文件),因此chmod只调用了一次。也就是说xargs这里的工作方式有点类似于以下命令:

xargs chmod o+r file1.txt file2.txt file3.txt file4.txt

但是并不是每个命令都能接受多个文件作为输入的。所以你可以对xargs命令加上-l参数,xargs会执行这个命令的时候,将每一行作为命令的输入。如果你想要明确你的操作,加上-p参数,xargs会在执行每一条命令前提示你。

你可以通过使用-i命令指定匹配到的行应该被放在你命令的什么位置。这个参数很重要,比如当你并不是准备把匹配到的行放在命令的最后位置,或者需要它在命令中的多个位置出现时。使用-i参数时自动启用-l参数的功能,每一行都被单独送到命令的输入中。例如,下面这条命令是查找目录/home/cindy下所有大于10000KB10MB)的文件,并把这些文件复制到/home/cindy/archive目录下:

find /home/cindy -size +10000k | xargs -i cp {} /home/cindy/archive

xargsfind的结合使用是一个特例。更多情况下,人们使用pipe是因为命令1的输出正好作为命令2的输入。下面有两个例子:

ps aux --sort=-%cpu | grep -v 'whoami'

ps -N ux --sort=-%cpu

1条命令是输出所有用户的所有进程,并将结果传递给grepgrep排除掉匹配程序whoami的输出(our username)的结果。也就是说,第1条命令将会输出所有被其他用户运行的进程,按照cpu使用情况排序。第2条命令实现相同的效果。


相关文章:

  • 命令行快速进阶(四)使用环境变量
  • 命令行快速进阶(五)Ubuntu下常用文本编辑器
  • 命令行快速进阶(六)Ubuntu中对压缩文件的操作和处理
  • 命令行快速进阶(七)通过byobu使用多个命令终端
  • Ubuntu中的用户管理(一)用户账户
  • Ubuntu中的用户管理(二)群组管理
  • Ubuntu中的用户管理(三)用户管理
  • Ubuntu中的用户管理(四)密码管理
  • Ubuntu中的用户管理(五)授予常规用户系统管理员权限
  • Ubuntu中的用户管理(六)硬盘配额
  • Ubuntu中的用户管理(七)相关Ubuntu命令
  • Windows下Ubuntu 12.04 LTS 的安装(双系统使用EasyBCD)
  • Ubuntu 12.04下安装QQ2012Beta3
  • Ubuntu 12.04 中文输入法
  • Ubuntu下的截图软件Deepin Scrot
  • [NodeJS] 关于Buffer
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • jQuery(一)
  • Python中eval与exec的使用及区别
  • Tornado学习笔记(1)
  • 从伪并行的 Python 多线程说起
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 记录一下第一次使用npm
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端攻城师
  • 设计模式走一遍---观察者模式
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 一份游戏开发学习路线
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • MPAndroidChart 教程:Y轴 YAxis
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # 达梦数据库知识点
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #NOIP 2014# day.2 T2 寻找道路
  • (42)STM32——LCD显示屏实验笔记
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (三)docker:Dockerfile构建容器运行jar包
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)WLAN定义和基本架构转
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET 设计模式初探
  • .NET 中 GetProcess 相关方法的性能
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net反编译的九款神器
  • .NET委托:一个关于C#的睡前故事
  • [<MySQL优化总结>]
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [bzoj1901]: Zju2112 Dynamic Rankings