Answers:
我将根据实际场景向您介绍一个比较复杂的示例。
问题
假设该命令conky
在我的桌面上停止响应,而我想手动将其杀死。我知道一点点Unix,所以我知道我需要做的是执行命令kill <PID>
。为了获取PID,我可以使用ps
或top
或任何工具,我的Unix发行给了我。但是,如何在一个命令中执行此操作?
回答
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
免责声明:此命令仅在某些情况下有效。不要将其复制/粘贴到您的终端中并开始使用它,这可能会毫无疑问地杀死进程。而是学习如何构建它。
怎么运行的
1- ps aux
此命令将输出正在运行的进程的列表以及有关它们的一些信息。有趣的信息是它将在其第二列中输出每个进程的PID。这是我盒子上命令输出的摘录:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2 grep conky
我只对一个过程感兴趣,所以我grep
经常使用它来查找与我的程序相对应的条目conky
。
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3 grep -v grep
如您在步骤2中所看到的,该命令在其列表中ps
输出该grep conky
进程(毕竟这是一个正在运行的进程)。为了对其进行过滤,我可以运行grep -v grep
。该选项-v
告诉grep
匹配除包含模式的行以外的所有行。
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
注意:我很想知道在一个grep
电话中执行第2步和第3步的方法。
4 awk '{print $2}'
现在,我已经隔离了我的目标流程。我想检索其PID。换句话说,我想检索输出的第二个单词。对我来说幸运的是,大多数(全部?)现代大学将提供的某种版本的awk
脚本语言,该脚本语言可以处理表格数据。我们的任务变得像print $2
。
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5 xargs kill
我有PID。我所需要的只是将其传递给kill
。为此,我将使用xargs
。
xargs kill
将从输入中读取(在我们的示例中是从管道中读取),形成由(从输入中读取的内容)组成的命令,然后执行创建的命令。在我们的例子中,它将执行。任务完成。kill <items>
<items>
kill 1948
最后的话
请注意,根据所使用的Unix版本,某些程序的行为可能有所不同(例如,ps
可能在$ 3列中输出PID)。如果出现问题或不同之处,请阅读供应商的文档(或更好的man
页面)。也要小心,因为长的管道可能很危险。不要做任何假设,尤其是在使用诸如kill
或的命令时rm
。例如,如果有另一个名为“ conky”(或“ Aconkyous”)的用户,我的命令也可能杀死所有正在运行的进程!
我要说的是要小心,特别是对于长管道。像我们在这里所做的那样,以交互方式构建它总是比做出假设和以后感到遗憾更好。
kill $(pgrep conky)
pkill conky
grep
电话中执行第2步和第3步的方法。 grep [c]onky
是您要寻找的。
我最喜欢的是这个:
youtube-dl $1 -q -o - | ffmpeg -i - $2
从传递的给定youtube URL下载视频,$1
并将其输出为给出的文件$2
。请注意,文件是如何安静地-q
输出到STDOUT -o -
,通过管道传输到ffmpeg并由用作输入的-i -
。
特别是对于linux新手,这可能是一个实用的示例,为什么使用命令行比使用GUI工具更加有用并使事情变得更容易。我不确定从youtube下载视频并将其声音转换为mp3需要多长时间。上面的代码行可以在几秒钟内完成。
youtube-dl --extract-audio --audio-format mp3 -a -
。仍然是一个很酷的例子,但是有更简单的方法可以做到这一点。(内部调用ffmpeg。)
youtube-dl $1 -q -o - | mplayer -
直接在mplayer中播放视频。我从笔记本电脑使用该命令告诉服务器(连接到电视)播放视频。我必须附加-display :0.0 -geometry 400x300+1200+200
以使mplayer窗口出现在正确的屏幕上。
一般用途(阅读:我大多数时候的使用方式)是出于某种原因,当我不得不通过几种工具运行一些数据以执行不同的处理任务时。
所以我想说管道的使用是将几个构件(不同的UNIX工具)组装在一起的胶水。就像乌尔里希所说,sort
并且uniq
是一个普通的节。
根据听众的不同,如果要突出显示管道的这种用法,可以例如从以下内容开始:“嘿,本课程提纲包含了一些有趣的PDF的链接,其中包含论文和讲义,但是其中一些是重复的。以某种方式使它自动化?”
然后,您将展示如何lynx --dump --listonly
获取链接列表,如何grep
过滤以结尾的链接.pdf
,如何colrm
或sed
可以消除lynx
写入每个URL 的数字,如何sort
以及uniq
可以消除重复项,最后如何wget -i -
用于检索链接。文件(--wait
当然,在服务器上使用时比较温和)。
恐怕这是一个复杂的例子。另一方面,当您仅通过管道传输并使外壳一次运行所有管道时,它可能有助于显示管道的功能。
sort -u
在GNU coreutils中使用。
我并不完全了解良好,但是管道传递grep
必须是最常见的用途之一,可能紧随其后wc -l
。(是的,grep
具有鲜为人知的-c
开关。)
另一个常见的节是| sort | uniq
,如果仅仅是因为uniq
要求对其输入进行排序。
在此示例中,并不是您需要它,而是:
$ ps aux | grep -v grep | grep conky
...颠倒毛刺的顺序可以保留着色,但效率要低得多。大概在大名单上,颜色并不重要。
另外,该网页还建议:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
> Johnsyweb在2012年2月21日晚上10:31回答 >通常的技巧是这样的: > ps aux | grep'[t] erminal' >这将匹配包含终端的行,而grep'[t] erminal'则不行! >它也可以在许多Unix版本上使用。
...但是如果您要寻找一个字母(例如流程“ X”),则无法使用。
我终于可以分享我大约一年半前制作的oneliner的烂摊子了...
while read in; do host "$in"; done < sites.txt | grep -iv "GOOGLE" | grep -E '1\.2\.3\.4|5\.6\.7\.8' | sed -e 's/has\ address\ 216.70.91.72//' | sed -e 's/has\ address\ 94.23.33.92//' | while read sites; do curl -sL -w "%{http_code} %{url_effective}\\n" "$sites" -o /dev/null; done | grep -ivE '4.*|5.*' | sed -e 's/200//' | sed -e 's/HTTP/http/'
它...
我敢打赌,用一个Python脚本可以做到更好。
这是我想到的第一件事...
mysqldump
是一个控制台应用程序,用于将数据,架构以及可选的过程和功能发送到stdout。通常,它会重定向到文件进行备份。
mysqldump <options> > mydb.dump
那会给你一个未压缩的SQL脚本。为了节省空间,您可以使用bzip2对其进行压缩。
bzip2 mydb.dump
另外,您也可以一步一步完成两项操作:
mysqldump <options> | bzip2 > mydb.dump.bz2
在上面的示例中,来自的标准输出通过mysqldump
管道传递到bzip2,然后将其输出重定向到文件。
bzcat mydb.dump.bz2 | mysql <options>
。
怎么样:模式搜索并显示最后出现的模式?
显示如何使用tail
,sed
以及grep
在可以逐步建立的管道上下文中的用法。
您可以在任何可以将第一个命令的输出作为下一个输入的地方使用命令管道。
例子。
猫示例txt | grep {some_line} | awk {some_command}
它只是一个简单的概念,即如果您感觉到您运行的命令输出可以被另一个命令输入,则可以通过管道传递它们。