簡體   English   中英

在shell(bash)中如何在管道中執行多個命令?

[英]In a shell (bash) How can I execute more than one command in a pipeline?

我正在嘗試在Bash shell中同時通過多個命令輸出awk命令的輸出,據我所知,我想出了這個:

awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u)

我希望awk命令的結果都被計算和排序,我該如何實現? 即使使用&&命令它也不起作用,它會執行第一個命令然后退出。 我想這是我對bash失敗的了解。

提前致謝。

如果要在一行中將輸出發送到兩個不同的命令,則需要進行過程替換。

嘗試這個:

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

如果輸出中的大小不是太大而不適合內存而且由於性能原因你不需要wcsort命令並行工作,這里有一個相對簡單的解決方案:

output=$(awk '$13 ~ /type/ {print $15}' filename.txt; echo a)
printf "%s" "${output%a}" | sort -u
printf "%s" "${output%a}" | wc -l

如果awk命令可能在輸入的末尾打印一些空行,則$()構造將剝離,這與額外的a復雜化。 您可以輕松選擇首先出現的sortwc


這是一種適用於任何POSIX shell(ash,bash,ksh,zsh,...)的方法,但僅適用於具有/dev/fd (包括合理的Linux,* BSD和Solaris)的系統。 就像Walter使用bash,ksh93和zsh中可用的更簡單方法的類似結構一樣, wc的輸出和sort的輸出可以混合。

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

如果你們都需要處理不適合內存的中間輸出並且不希望將兩個命令的輸出混合在一起,我認為在POSIX shell中有一種簡單的方法,盡管它應該是可以使用ksh或zsh coprocesses。

我認為更大的問題是:你對輸出的期望是什么?

如果你想做兩件事,那么做兩件事:

awk '$13 ~ /type/ {print $15}' filename.txt > tempfile
wc -l < tempfile
sort -u < tempfile
rm tempfile

您希望將使用mkfifo創建的命名管道與tee結合使用。 一個例子是http://www.softpanorama.org/Tools/tee.shtml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM