0

我想在 while 循环中使用 tee 的嵌套过程替代。

while read line; do
  #process line
  echo "--$line"
done < <(cat sample.file | tee >(grep "SPECLINE") | grep "LINESTOPROCESS")

因此,我需要:

  • sample.file 中所有包含 "LINETOPROCESS" 表达式的行都应该被传递到循环中,并且它们将以 "--" 前缀打印。
  • 所有包含“SPECLINE”的行都需要在 tee 的第一个进程替换中打印(在 grep 中)。

我想避免多次对 sample.file 进行 cat-ting,因为它太大太重。

使用一个简单的 sample.test 文件:

line1 SPECLINE
line2 LINETOPROCESS
line3 LINETOPROCESS
line4 SPECLINE
line5 I don't need it
line6 also not
line7 also not
line8 SPECLINE
line9 LINETOPROCESS

我的结果:

# ./test.sh
#

我想要的结果:

# ./test.sh
line1 SPECLINE 
--line2 LINETOPROCESS
--line3 LINETOPROCESS
line4 SPECLINE
line8 SPECLINE
--line9 LINETOPROCESS

或者我也可以接受这个作为输出:

# ./test.sh
--line2 LINETOPROCESS
--line3 LINETOPROCESS
--line9 LINETOPROCESS
line1 SPECLINE 
line4 SPECLINE
line8 SPECLINE

更新1

greps 仅用于演示。我真的需要这两个替换。

  • sample.file 是一个 http 文件。
  • grep "SPECLINE" 将是 "hxselect -i -s ';' -c 'div.hour'
  • grep "LINESTOPROCESS" 将是 "hxselect -i -s ';' -c 'div.otherclass' | hxpipe

hx 程序不是面向行的。他们正在从标准输入读取并输出到标准输出。

因此,tee 的第一个命令将选择 'hour' 类的 div,并用 ';' 分隔它们。之后, tee 之后的管道将选择所有具有“otherclass”类的 div,hxpipe 会将其展平以便循环进行进一步处理。

4

3 回答 3

3

我根本不会使用任何进程替换。

while IFS= read -r line; do
  if [[ $line = *SPECLINE* ]]; then
    printf '%s\n' "$line"
  elif [[ $line = *LINETOPROCESS* ]]; then
    printf '--%s\n' "$line"
  fi
done < sample.txt

您已经支付了在 ; 中逐行读取输入流的成本bash;没有理由向grep它添加两个单独进程的开销。

单个awk进程会更好,因为它比bash读取文本行的一次读取一个字符的方法更有效。

awk '/SPECLINE/ {print} /LINETOPROCESS/ {print "--"$0}' sample.txt

(如果单行可以同时匹配和,那就简单了,但我把它留给读者练习。)SPECLINELINETOPROCESS

于 2019-01-06T16:51:54.310 回答
0

当您需要时tee,您可以进行 2 处更改。
您的测试代码 greps LINE S TOPROCESS,输入是 LINETO ..
输出过程替换给出了类似https://stackoverflow.com/a/42766913/3220113解释的问题。您可以以不同的方式执行此操作。

while IFS= read -r line; do
  #process line
  echo "--$line"
done < x2 |
tee >(grep "SPECLINE") >(grep "LINETOPROCESS") >/dev/null

我不知道hxselect,但它似乎对完整的格式良好的 XML 文档进行操作,因此请避免使用grep.

于 2019-01-06T22:23:46.377 回答
0

以下只是循环整个文件并打印匹配的行。所有其他行都被忽略。

while read line; do
    case "$line" in
        *SPECLINE*) echo "$line" ;;
        *LINETOPROCESS*) echo "--$line" ;;
    esac
done < sample.file
于 2019-01-06T16:55:16.953 回答