如果您正在帮助某人学习命令行中的管道概念,您会使用哪个示例?实际出现的示例如下:
cat whatever.txt | less
我觉得那个不是最好的例子,主要是因为只有一个步骤。使用“|”的一个好但基本的例子是什么?
理想情况下,我将提供一个示例,其中使用的程序具有独立运行并显示管道连接的输出的能力。
如果您正在帮助某人学习命令行中的管道概念,您会使用哪个示例?实际出现的示例如下:
cat whatever.txt | less
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
$ 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
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
grep -v grep
如你在第二步中所见,命令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
NB:我想知道如何在单个grep
调用中执行步骤2和3。
4- awk '{print $2}'
现在,我已经分离出了目标进程。我想要检索它的PID。换句话说,我想要检索输出的第二个单词。幸运的是,大多数(全部?)现代Unix都会提供某种版本的awk
,这是一种处理表格数据的脚本语言。我们的任务变得非常简单,只需要使用print $2
即可。
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
xargs kill
我有进程ID。我只需要将它传递给kill
命令。为了做到这一点,我将使用xargs
。
xargs kill
将从输入中读取(在我们的情况下是从管道中读取),形成一个由kill <items>
组成的命令(<items>
是从输入中读取的任何内容),然后执行创建的命令。在我们的情况下,它将执行kill 1948
。任务完成。ps
可能会在第3列输出PID)。如果出现任何错误或差异,请阅读供应商的文档(或更好地阅读man
页面)。此外,长管道可能很危险,请小心。在使用诸如kill
或rm
之类的命令时,不要做任何假设。例如,如果还有另一个名为'conky'(或'Aconkyous')的用户,我的命令可能会杀死他所有正在运行的进程!kill $(pgrep conky)
。 - Patrickpkill conky
。 - strugeegrep
命令完成步骤2和步骤3。 grep [c]onky
是你要找的。 - AlexT我最喜欢的是这个:
youtube-dl $1 -q -o - | ffmpeg -i - $2
这条命令从传入的$1
参数中提取给定YouTube网址的视频,并将其作为$2
参数指定的文件输出。请注意,文件会以静默模式-q
通过STDOUT-o -
输出,然后通过管道传递给ffmpeg并在那里作为输入使用-i -
。
对于Linux新手来说,这可能是一个实用的例子,说明命令行界面为什么比使用图形界面工具更方便和简单。我不确定从YouTube下载视频并将其音频转换为MP3需要多长时间。上述命令可以在几秒钟内完成这个任务。
youtube-dl --extract-audio --audio-format mp3 -a -
。这仍然是一个很酷的例子,但有更简单的方法来实现它。(它内部调用了ffmpeg。) - Brigandyoutube-dl $1 -q -o - | mplayer -
直接在mplayer中播放视频。我从我的笔记本电脑使用这个命令告诉我的服务器(连接到电视)播放视频。我必须添加 -display :0.0 -geometry 400x300+1200+200
让mplayer窗口出现在正确的屏幕上。 - Baarn通常使用(也就是我大部分时候使用的方式)是当某种原因需要我通过多个工具来处理数据时。
所以我会说,管道的使用就像胶水一样将多个构建块(不同的UNIX工具)组合在一起。就像Ulrich所说的,sort
和uniq
是常见的用法。
根据受众的不同,如果你想突出管道的这种用法,你可以例如这样开始:“嘿,这个教学大纲中有几个链接到一些有趣的PDF文件和讲义笔记,但其中一些是重复的。我能否以某种方式自动化处理这个问题?”
然后你可以展示如何使用lynx --dump --listonly
获取链接列表,如何使用grep
过滤以.pdf
结尾的链接,如何使用colrm
或sed
去掉lynx
在每个URL左边写的数字,如何使用sort
和uniq
去除重复项,最后如何使用wget -i -
来获取文件(当然要使用--wait
参数对服务器友好)。sort -u
。 - admirabilis... | sort -u
! - user28151mysqldump
是一个控制台应用程序,它将数据、模式和可选的存储过程和函数发送到标准输出。通常,它会被重定向到一个文件进行备份。
mysqldump > mydb.dump
这将给你一个未压缩的 SQL 脚本。为了节省空间,你可以使用 bzip2 进行压缩。
bzip2 mydb.dump
或者,你可以一步完成两个操作:
mysqldump | bzip2 > mydb.dump.bz2
在上面的例子中,mysqldump
的标准输出被导入到 bzip2 中,然后将其输出重定向到一个文件。bzcat mydb.dump.bz2 | mysql <选项>
。 - manatwork虽然在这个例子中你并不需要它,但是:
$ ps aux | grep -v grep | grep conky
...颠倒 greps 的顺序可以保持着色,但效率要低得多。假设在大型列表上,颜色并不重要。
此外,此网页提出:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
Johnsyweb在2012年2月21日10:31回答: 通常的技巧是这样的: ps aux | grep '[t]erminal' 这将匹配包含terminal的行,而grep '[t]erminal'则不会! 它还适用于许多种类的Unix系统。终于可以分享我大约一年半前制作的这个混乱的一行代码了...
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脚本就能做得更好,我敢打赌。
gawk '{ for (x=1;x<=NF;x++) if ( $x~"Access" && $(x+4)~".*@.*") print $(x+4)}' $OFILE | sort | uniq -c | sort -n
管道与过滤器和翻译工具配合使用效果最佳
find /usr/bin/ | #produce
sed 's:.*/::' | #translate: strip directory part
grep -i '^z' | #filter : select items starting with z
xargs -d '\n' aFinalConsumer #consume
export DISPLAY=\`who am i |awk '{print $NF}' | sed 's/[()]//g'`":0.0"
cat
,直接使用less whatever.txt
就可以了。 - Bora M. Alper