Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell(bash)中,如何在管道中执行多个命令?_Bash_Shell_Awk_Pipeline - Fatal编程技术网

在shell(bash)中,如何在管道中执行多个命令?

在shell(bash)中,如何在管道中执行多个命令?,bash,shell,awk,pipeline,Bash,Shell,Awk,Pipeline,我正在尝试在Bash shell中同时通过多个命令来传递awk命令的输出,根据我的知识,我提出了以下建议: awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u) 我希望对awk命令的结果进行计数和排序,我如何才能做到这一点? 即使使用&&command,它也不会工作,它会执行第一个命令,然后退出。 我想失败的是我对bash的了解 提前感谢。我想更大的问题是:您希望输出结果是什么 如果你想做两件事,那就做两件事: awk

我正在尝试在Bash shell中同时通过多个命令来传递awk命令的输出,根据我的知识,我提出了以下建议:

awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u)
我希望对awk命令的结果进行计数和排序,我如何才能做到这一点? 即使使用&&command,它也不会工作,它会执行第一个命令,然后退出。 我想失败的是我对bash的了解


提前感谢。

我想更大的问题是:您希望输出结果是什么

如果你想做两件事,那就做两件事:

awk '$13 ~ /type/ {print $15}' filename.txt > tempfile
wc -l < tempfile
sort -u < tempfile
rm tempfile
awk'$13~/type/{print$15}'filename.txt>tempfile
wc-l
您希望将使用mkfifo创建的命名管道与tee结合使用。例如,如果要在一行中向两个不同的命令发送输出,则需要执行进程替换

试试这个:

awk '$13 ~ /type/ {print $15}' filename.txt | tee >(wc -l >&2) | sort -u
这将输出stderr上的行计数和stdout上的排序输出。如果需要stdout上的行计数,可以这样做,不使用
&2
,但随后它将被传递到sort调用,并且(很可能)被排序到输出的顶部


编辑:根据进一步的测试,更正了对发生情况的描述。

在这种情况下,请以awk计算,为什么需要管道?不要把事情弄得更复杂

awk '$13 ~ /type/ {print $15;c++}END{print c} ' filename.txt | sort -u

如果输出中的大小不太大,无法放入内存,并且出于性能原因,您不需要
wc
sort
命令并行工作,那么这里有一个相对简单的解决方案:

output=$(awk '$13 ~ /type/ {print $15}' filename.txt; echo a)
printf "%s" "${output%a}" | sort -u
printf "%s" "${output%a}" | wc -l
额外的
a
的复杂性在于
awk
命令可能会在输入的末尾打印一些空行,
$()
构造将删除这些空行。您可以轻松地选择应首先出现的
排序
wc
中的哪一个


这里有一种方法适用于任何POSIX shell(ash、bash、ksh、zsh等),但仅适用于具有
/dev/fd
(包括相当新的Linux、*BSD和Solaris)的系统。与之类似,
wc
的输出和
sort
的输出可以混合

{
  awk '$13 ~ /type/ {print $15}' filename.txt |
  tee /dev/fd3 |
  wc -l
} 3>&1 1>&3 | sort -u


如果您都需要处理不适合内存的中间输出,并且不希望两个命令的输出混合在一起,我认为POSIX shell中没有简单的方法,尽管它应该可以用于ksh或zsh协进程。

我希望我的输出是两行或多行,一行一个结果(行计数)和其他(或更多)使用awk命令的一种结果。我想知道是否有可能在一行中执行此操作,因为我必须重复awk命令或将其结果分配给变量。请参阅我的编辑,了解如何在不重复awk的情况下执行此操作。一般来说,即使您找到了执行尝试执行的操作的方法,也不要执行此操作。您应该曾经故意编写过令人困惑的代码。我没有发现它令人困惑,我只是认为这样做更有效。但你必须在StackOverflow.com上询问如何做。清晰总是优于模糊。“cat tempfile>sort-u”相当于“cat tempfile-u>sort”。你可能想使用“|”,在这种情况下,你有UOOC。只需执行“sort-ush调用,它将进入兼容模式,进程替换将不起作用。显式地将shell作为
bash
调用应该可以。这可以工作,但不太整洁:awk'$13~/type/{print$15}'filename.txt | tee test.txt | sort-u;cat test.txt | wc-lAnyway投票认为这是可以接受的,因为它更准确地回答了我的问题。它对我有效,但请注意这是一个特定于bash的功能。它肯定不会在sh上工作,也不会在作为sh调用的bash上工作,我不知道其他shell中有它(例如ksh、zsh等)。它也不适用于busybox的外壳,许多安装程序和伪装成bash的嵌入式设备都使用它。@Walter:它适用于ksh93、bash和zsh,但不适用于更基本的外壳,如pdksh、ash或busybox。