标签: pipe

如何从python中管道许多bash命令?

嗨,我试图从python调用以下命令:

comm -3 <(awk '{print $1}' File1.txt | sort | uniq) <(awk '{print $1}' File2.txt | sort | uniq) | grep -v "#" | sed "s/\t//g"
Run Code Online (Sandbox Code Playgroud)

当通信命令的输入也被管道传输时,我怎么能进行调用?

有一种简单直接的方法吗?

我尝试了子进程模块:

subprocess.call("comm -3 <(awk '{print $1}' File1.txt | sort | uniq) <(awk '{print $1}' File2.txt | sort | uniq) | grep -v '#' | sed 's/\t//g'")
Run Code Online (Sandbox Code Playgroud)

没有成功,它说:OSError:[Errno 2]没有这样的文件或目录

或者我必须单独创建不同的调用,然后使用PIPE传递它们,如子进程文档中所述:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = …
Run Code Online (Sandbox Code Playgroud)

python bash subprocess pipe

1
推荐指数
1
解决办法
780
查看次数

使用eval运行管道命令

我有以下命令行来检查文件系统的可用空间:

fs_used=`df -h /u01 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1`
Run Code Online (Sandbox Code Playgroud)

它工作正常.它返回文件系统上已用空间的百分比(不带%符号).

现在我需要使它变量并使用eval命令运行它.我尝试了以下但它不起作用(退出df:无效选项 - 'd')

df_cmnd="df -h $fs1 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1"
fs_used=eval $df_cmnd
Run Code Online (Sandbox Code Playgroud)

我想,问题是eval无法运行管道命令.真的吗?是否有任何解决方法或替代方法来运行此代码?

bash eval escaping pipe quoting

1
推荐指数
1
解决办法
2963
查看次数

当read()阻塞时如何退出while循环

在大学给出的问题中,我们必须pipe从父进程(P1)到其子P2,然后P2必须管道到P1的另一个孩子,另一个孩子是P3.P2和P3都用c编写并制成可执行文件.然后他们将通过execP1中的子进程编辑.

P1将数字1写入10000到10000 stdout,P2通过它读取它们stdin,删除可被2整除的数字,并将结果写入其中stdout.P3通过它读取这些数字stdin,过滤掉可被3整除的结果,并将所有内容写入文件.

我已经成功实现了一切,但我的孩子流程并没有结束.我相信,其原因是我使用以下方法来读取每个子进程中的输入:

while(n=read(0, &i, sizeof(i))>0)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这里的问题是read当它没有得到任何字节时的块.由于P1使用以下方法写入10000个数字:

for(i=1; i<=10000; i++){
        write(1, &i, sizeof(i));
    }
Run Code Online (Sandbox Code Playgroud)

儿童进程都没有任何理由相信没有更多的数据可以实现.因此,每个都read只是阻塞等待永远不会到来的字节.

任何人都可以建议一种方法来克服这个障碍吗?

每个过程的代码如下:

家长:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>


int main()
{
        // pipe to send input string from parent
        // Child prints to file 
        int fd1[2];  // Used to store two ends of first pipe
        int fd2[2];  // Used to store two …
Run Code Online (Sandbox Code Playgroud)

c linux pipe

1
推荐指数
1
解决办法
80
查看次数

无法读取管道

我不知道我是不是意外地删除了或者在某处输入了一个错字,但突然之间我的一些代码停止了工作.出于某种原因,从$ in中没有读取任何行.

use Win32::Job;
use IO::Handle; 

STDOUT->autoflush;

pipe my $in, my $out;

my $job = Win32::Job->new;

sub flush_pipe{
    while (defined(my $line = <$in>)) {
       chomp($line);
       print($line);

    }
}
my $pid = $job->spawn("cmd", "cmd /C \"ipconfig\"",
    {
        stdout=>$out
    }
);
flush_pipe();
Run Code Online (Sandbox Code Playgroud)

编辑:通过反复试验,我最终发现在冲洗管道之前我必须关闭$ out文件句柄.

perl fork pipe

1
推荐指数
1
解决办法
94
查看次数

为什么不`seq 100 | (head -n1; tail -n1)`在Mac OSX上工作?

以下命令应该打印第一行和最后一行seq 100,但它只打印第一行:

seq 100 | (head -n1 ; tail -n1)
1
Run Code Online (Sandbox Code Playgroud)

它适用于较大的序列,例如10,000:

seq 10000 | (head -n1 ; tail -n1)
1
10000
Run Code Online (Sandbox Code Playgroud)

UPDATE

我选择了@ John1024的答案,因为我的问题是为什么这不起作用,他提供了一个可接受的答案.

此外,应该是很明显我only..the现实的看法是,head不以这种方式工作......它很可能消耗更多的标准输入比我想,并留下任何的tail.

当然,在第一个问题中提示此问题的问题是尝试读取文件的第一行和最后一行.这是我基于GNU提出的解决方案sed:

sed -ne'1,9{p;b}' -e'10{x;s/$/--/;x;G;p;b}' -e':a;$p;N;21,$D;ba'
Run Code Online (Sandbox Code Playgroud)

或者更紧凑

sed -ne'1,9{p;b};10{x;s/$/--/;x;G;p;b};:a;$p;N;21,$D;ba'
Run Code Online (Sandbox Code Playgroud)

示例输出:

*注意在我的Mac上,使用MacPorts,GNU sed被调用为gsed.Apple的内置版本sed对于分号分隔表达式很挑剔,需要多个-e参数.这适用于Apple的sed:sed -ne'1,9{' -e'p;b' -e'}' -e'10{' -e'x;s/$/--/;x;G;p;b' -e'}' -e':a' -e'$p;N;21,$D;ba'*

seq 100 | gsed -ne'1,9{p;b}' -e'10{x;s/$/--/;x;G;p;b}' -e':a;$p;N;21,$D;ba'

1
2 …
Run Code Online (Sandbox Code Playgroud)

bash pipe seq

1
推荐指数
1
解决办法
97
查看次数

通过管道捕获标准输出和标准错误

我想从子进程中读取stderr和stdout,但是它不起作用。

use std::process::{Command, Stdio};
use std::io::{BufRead, BufReader};

fn main() {
    let mut child = Command::new("./1.sh")
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
        .unwrap();

    let out = BufReader::new(child.stdout.take().unwrap());
    let err = BufReader::new(child.stderr.take().unwrap());

    out.lines().for_each(|line|
        println!("out: {}", line.unwrap())
    );
    err.lines().for_each(|line|
        println!("err: {}", line.unwrap())
    );

    let status = child.wait().unwrap();
    println!("{}", status);
}
Run Code Online (Sandbox Code Playgroud)

1.sh

use std::process::{Command, Stdio};
use std::io::{BufRead, BufReader};

fn main() {
    let mut child = Command::new("./1.sh")
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
        .unwrap();

    let out = BufReader::new(child.stdout.take().unwrap());
    let err = BufReader::new(child.stderr.take().unwrap());

    out.lines().for_each(|line|
        println!("out: {}", line.unwrap())
    );
    err.lines().for_each(|line|
        println!("err: {}", …
Run Code Online (Sandbox Code Playgroud)

stdout pipe stderr rust

1
推荐指数
1
解决办法
571
查看次数

写入超过4K字节的exec.Cmd.StdinPipe()

问题

Cmd.StdinPipe在Go中写入超过4096字节的数据时,程序处理在Windows上停止.当在Linux上运行相同的代码或使用goroutine编写进程时,不会发生这种现象.

处理不会从_, err = in.Write ([] byte {'0'})下面显示的代码中的(4097字节)开始.为什么是这样?

为什么不在goroutine或Linux上发生?

***Golang参考使用goroutine作为示例描述了Cmd.StdinPipe ,我的问题也已经解决了.这个问题源于对Go的好奇心.

package main

import (
    "bytes"
    "fmt"
    "io"
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("more")

    pype, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }

    bytes4k := generateBytes(1024 * 4) // Works on Linux, but not Windows.
    // bytes4k := generateBytes(1024 * 64) // Don't works on Linux and Windows.
    fmt.Println("bytes generated.")

    // go writeBytes(pype, bytes4k) // Works fine!
    writeBytes(pype, …
Run Code Online (Sandbox Code Playgroud)

ipc pipe process go

1
推荐指数
1
解决办法
395
查看次数

为什么不能计算字符串中的管道字符?

select Values, REGEXP_COUNT(values,'|') from Products 
Run Code Online (Sandbox Code Playgroud)

样本值单元格:

Product|Cash|Loan|Customer
Run Code Online (Sandbox Code Playgroud)

选择的结果是27。如果算其他字符,它可以工作,但是如果我要算| 它计算整个字符串。为什么,如何计数管道?

regex sql oracle pipe

1
推荐指数
1
解决办法
360
查看次数

如何在Perl中通过管道连接进程?

我想写它运行的程序的Perl脚本foo,并bar和流程stdoutfoo它发射到stdinbar以流方式.Perl脚本应该像这个bash命令一样:

$ foo | some-perl-code | bar
Run Code Online (Sandbox Code Playgroud)

我设法用下面的代码片段完成第一部分.我启动程序foo并打开管道阅读stdout.

open( my $pipe_fh, "foo |" );
while ( my $row = <$pipe_fh> ) {
   # do stuff
    print $row;
}
Run Code Online (Sandbox Code Playgroud)

我如何实现第二部分?如何 Perl脚本中$row向程序发出声音?bar

bash perl pipe

1
推荐指数
1
解决办法
96
查看次数

角度定制管道号码

我有两个用户输入.第一个输入是主号码.第二个输入是主号码后面的零个数.

基本的{{ mainNumber | number: '1.5'}}作品.在这里,我将在主号码后面有五个零.但我希望5是动态的,是用户在第二个字段中输入的内容.

这是component.html:

  Number <input type="number" [(ngModel)]="mainNumber" placeholder="Enter the number"> &nbsp;
  Zero: <input type="number" [(ngModel)]="zeroNumber" placeholder="Enter the zero"> <br>
  <hr>
  <b> Number: </b>{{mainNumber}} &nbsp;
  <b> Zero: </b> {{zeroNumber}} <br>
  <!-- {{ mainNumber | number: '1.10'}} -->

  Final number: {{ mainNumber | mojpipe }}
Run Code Online (Sandbox Code Playgroud)

这是component.ts:

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  mainNumber: number = 0;
  zeroNumber: number = 0;
  title …
Run Code Online (Sandbox Code Playgroud)

javascript pipe typescript angular

1
推荐指数
1
解决办法
112
查看次数

标签 统计

pipe ×10

bash ×4

perl ×2

angular ×1

c ×1

escaping ×1

eval ×1

fork ×1

go ×1

ipc ×1

javascript ×1

linux ×1

oracle ×1

process ×1

python ×1

quoting ×1

regex ×1

rust ×1

seq ×1

sql ×1

stderr ×1

stdout ×1

subprocess ×1

typescript ×1