Questions tagged «pipe»

Unix管道连接两个进程的文件描述符。使用在<unistd.h>中声明的POSIX pipe()函数创建管道。外壳程序使用“ |”在进程之间提供管道创建。

6
管道传输到外壳中的多个文件
我有一个应用程序,该应用程序会产生大量不希望存储到磁盘上的数据。该应用程序主要输出我不希望使用的数据,但是输出的一组有用信息必须拆分为单独的文件。例如,给出以下输出: JUNK JUNK JUNK JUNK A 1 JUNK B 5 C 1 JUNK 我可以这样运行应用程序三遍: ./app | grep A &gt; A.out ./app | grep B &gt; B.out ./app | grep C &gt; C.out 这可以让我得到想要的东西,但是会花费太长时间。我也不想将所有输出转储到单个文件中并通过它进行解析。 有什么方法可以将上面显示的三个操作组合在一起,使我只需要运行一次应用程序,仍然可以获得三个单独的输出文件?
29 bash  shell  grep  pipe 

1
为什么echo> file比echo使用更多实时时间| sed>文件?
下面的例子令我惊讶。这似乎是反直观的……除了事实之外,该组合还有更多的用户时间echo | sed。 为什么单独运行时会花费echo那么多系统时间,或者问题应该是,如何sed改变游戏状态?似乎在两种情况下echo都需要执行相同的回显 ... time echo -n a\ {1..1000000}\ c$'\n' &gt;file # real 0m9.481s # user 0m5.304s # sys 0m4.172s time echo -n a\ {1..1000000}\ c$'\n' |sed s/^\ // &gt;file # real 0m5.955s # user 0m5.488s # sys 0m1.580s
28 bash  shell  pipe  time  echo 

4
有没有一种方法可以将一个程序的输出传递给另外两个程序?
抱歉,如果这是一个愚蠢的问题,但是我想在一行上完成这样的事情: $ prog1 | prog2 $ prog1 | prog3 因此,我基本上想执行prog1并将输出分别管道传输到prog2和prog3(而不是链式管道)。最初,我尝试使用tee,但这似乎并不正确,因为它会将输出转储到文件中(这不是我想要的)。 $ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2" 在某个时候,我可能想将其扩展到将输出传递给两个以上的程序,但是我现在只是从简单开始。 $ prog1 | prog2 $ prog1 | prog3 $ prog1 | prog4 ...
28 pipe 


5
如何实时处理/管道TCPDUMP输出
如果我想通过客户端tcpdump DNS请求(在OpenWrt 10.04路由器上),那么我 root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2&gt;&amp;1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on br-lan, link-type EN10MB (Ethernet), capture size 96 bytes 22:29:38.989412 IP 192.168.1.200.55919 &gt; 192.168.1.1.53: 5697+ A? foo.org. (25) 22:29:39.538981 IP 192.168.1.200.60071 &gt; 192.168.1.1.53: 17481+ PTR? …
27 pipe  tcpdump 

3
我该如何计时管道?
我想要time一个命令,该命令由两个单独的命令组成,一个管道输出到另一个管道。例如,考虑以下两个脚本: $ cat foo.sh #!/bin/sh sleep 4 $ cat bar.sh #!/bin/sh sleep 2 现在,我如何才能time报告所花费的时间foo.sh | bar.sh(是的,我知道这里的管道没有意义,但这只是一个示例)?如果我在不使用管道的子外壳中依次运行它们,则可以正常工作: $ time ( foo.sh; bar.sh ) real 0m6.020s user 0m0.010s sys 0m0.003s 但是在管道传输时我无法使其工作: $ time ( foo.sh | bar.sh ) real 0m4.009s user 0m0.007s sys 0m0.003s $ time ( { foo.sh | bar.sh; } …
27 bash  shell  pipe  time 

8
配管,移位或参数扩展更有效吗?
我试图找到最有效的方法来迭代某些值,这些值在用空格分隔的单词列表中彼此保持一致的值数(我不想使用数组)。例如, list="1 ant bat 5 cat dingo 6 emu fish 9 gecko hare 15 i j" 因此,我希望能够仅遍历list并仅访问1,5,6,9和15。 编辑:我应该明确指出,我要从列表中获取的值的格式不必与列表的其余部分不同。使它们与众不同的仅仅是它们在列表中的位置(在这种情况下,位置1,4,7 ...)。因此,列表可能是,1 2 3 5 9 8 6 90 84 9 3 2 15 75 55但我仍然想要相同的数字。而且,假设我不知道列表的长度,我希望能够做到这一点。 到目前为止,我想到的方法是: 方法一 set $list found=false find=9 count=1 while [ $count -lt $# ]; do if [ "${@:count:1}" …

2
什么是实现流程替代的可移植(POSIX)方法?
一些shell(例如bash)支持Process Substitution,这是一种将过程输出显示为文件的方式,如下所示: $ diff &lt;(sort file1) &lt;(sort file2) 但是,此构造不是POSIX,因此不可移植。如何处理替代的实现POSIX -友好的方式(即其中一个在工作/bin/sh)? 注意:问题不是问如何区分两个排序的文件-这只是一个演示流程替换的人为例子!

1
从管道读取时,为什么“ sed q”的工作方式有所不同?
这个问题是从Server Fault 迁移过来的,因为可以在Unix&Linux Stack Exchange上回答。 迁移 3年前。 我创建了一个名为“ test”的测试文件,其中包含以下内容: xxx yyy zzz 我运行了命令: (sed '/y/ q'; echo aaa; cat) &lt; test 我得到: xxx yyy aaa zzz 然后我跑了: cat test | (sed '/y/ q'; echo aaa; cat) 并得到: xxx yyy aaa 题 sed读取并打印,直到遇到带有'y'的行,然后停止。在第一种情况下,而不是第二种情况下,cat读取并打印其余部分。 有人可以解释这种行为差异背后的现象是什么吗? 我也注意到它在Ubuntu 16.04和Centos 6中是这样工作的,但是在Centos 7中,这两个命令都不会输出'zzz'。
25 sed  pipe 

1
管道如何在Linux中工作
我一直在阅读有关如何在Linux内核中实现管道的信息,并希望验证我的理解。如果我不正确,将选择带有正确解释的答案。 Linux有一个称为pipefs的VFS,它安装在内核中(而不是在用户空间中) pipefs有一个超级块,并安装在它自己的根目录(pipe:)旁边/ 与大多数文件系统不同,无法直接查看pipefs pipefs的条目是通过pipe(2)syscall进行的 pipe(2)外壳程序使用的syscall与|操作员进行管道传输(或从任何其他进程手动进行管道传输)在pipefs中创建一个新文件,其行为与普通文件非常相似 管道运算符左侧的文件已stdout重定向到pipefs中创建的临时文件 管道运算符右侧的文件已stdin设置为pipefs上的文件 pipefs存储在内存中,并且通过一些内核魔术,不应进行分页 这种关于管道(例如ls -la | less)功能如何的解释是否正确? 我不明白的一件事是,诸如bash之类的东西将如何设置进程stdin或stdout由返回的文件描述符pipe(2)。我还没有找到任何关于此的信息。
25 kernel  pipe 

1
如何重定向命令完成输出?
在命令行上,我可以使用命令后的&gt;or |运算符将命令的输出重定向或通过管道传递到文件或其他命令。我遇到了一种不太标准的情况,我想将输出重定向到文件,但是似乎没有重定向的机会: 在新航站楼, [chiliNUT ~]$ 如果我Tab没有先输入就按,我会被问到 display all 1725 possibilities? (y or n) 如果输入y,我会得到一长串不同的命令。如何将输出重定向或通过管道传输到文件?我似乎没有机会在&gt; myfile.txt任何地方打字。 使用CentOS版本6.4(最终版)。

3
少用管道?
可以更少地跟踪(通过按F)管道输入(类似于文件)吗?对于正在写入的文件,命令 less &lt;file&gt; 按F时将跟随文件。 但是如果我有一条命令将输出直接传送到更少的内容,像这样 command | less 按F不会执行任何操作。 如此看来,管道无法像文件一样被追踪?也许与写STDERR的命令有关?我试图实现的效果始终是看到命令的最新输出:就像按住PageDown一样! 有一个相关的说法适用于G(结束):当直接传递给小号时,它将不起作用。
25 pipe  less  tail 

2
带管道的进给源命令
以前我使用过这样的source命令: source file_name 但是我想做的是这样的: echo something | source 这不起作用。
25 shell  pipe 


2
如何捕获有序的STDOUT / STDERR并添加时间戳/前缀?
我已经探索了几乎所有 可用的 类似 问题,但均无济于事。 让我详细描述问题: 我运行一些无人值守的脚本,这些脚本可以产生标准输出和标准错误行,我想捕获它们 按终端仿真器显示的精确顺序,然后向它们添加诸如“ STDERR:”和“ STDOUT:”的前缀。 我尝试对它们使用管道,甚至基于epoll的方法,都无济于事。我认为解决方案是使用pty,尽管我对此并不熟练。我也偷看了Gnome VTE的源代码,但是效率不高。 理想情况下,我会使用Go而不是Bash来完成此操作,但我一直无法做到。似乎管道由于缓冲会自动禁止保持正确的行顺序。 有人能够做类似的事情吗?还是不可能?我认为,如果终端仿真器可以做到这一点,那不是-可能是通过创建一个以不同方式处理PTY的小型C程序吗? 理想情况下,我将使用异步输入读取这两个流(STDOUT和STDERR),然后根据需要重新打印它们,但是输入顺序至关重要! 注意:我知道stderred,但是它不适用于Bash脚本,并且不能轻易地添加前缀(因为它基本上包装了许多syscall)。 更新:添加以下两个要点 生成混合stdout / stderr的示例程序 上面程序的预期输出 (可以在我提供的示例脚本中添加亚秒级随机延迟以证明结果一致) 更新:正如@Gilles指出的那样,该问题的解决方案也将解决其他问题。但是我得出的结论是,不可能在这里和那里做所要求的事情。当使用2&gt;&amp;1这两种流时,应该在pty / pipe级别正确合并,但是要分别并以正确的顺序使用流,实际上应该使用stderred的方法,即involes syscall挂钩,并且在许多方面都可以视为脏污。 如果有人可以反驳以上内容,我将急于更新此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.